<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://lib.custis.ru/index.php?feed=atom&amp;offset=20120517181821&amp;title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F%3A%D0%9D%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B</id>
		<title>CustisWiki - Новые страницы [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://lib.custis.ru/index.php?feed=atom&amp;offset=20120517181821&amp;title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F%3A%D0%9D%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B"/>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%9D%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B"/>
		<updated>2026-04-08T07:05:21Z</updated>
		<subtitle>Материал из CustisWiki</subtitle>
		<generator>MediaWiki 1.26.4</generator>

	<entry>
		<id>https://lib.custis.ru/%D0%9D%D0%B5_%D1%83%D0%BC%D0%B5%D0%B5%D1%88%D1%8C_-_%D0%BD%D0%B0%D1%83%D1%87%D0%B8%D0%BC%E2%80%A6_%D0%9E%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA%D0%BE%D0%B2_%D0%B4%D0%BE_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F,_%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_(%D0%A1%D0%B2%D0%B5%D1%82%D0%BB%D0%B0%D0%BD%D0%B0_%D0%AF%D0%BA%D0%BE%D0%B2%D0%BB%D0%B5%D0%B2%D0%B0,_SQADays-11)</id>
		<title>Не умеешь - научим… Организация обучения тестировщиков до уровня, необходимого для начала работы (Светлана Яковлева, SQADays-11)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9D%D0%B5_%D1%83%D0%BC%D0%B5%D0%B5%D1%88%D1%8C_-_%D0%BD%D0%B0%D1%83%D1%87%D0%B8%D0%BC%E2%80%A6_%D0%9E%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA%D0%BE%D0%B2_%D0%B4%D0%BE_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F,_%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_(%D0%A1%D0%B2%D0%B5%D1%82%D0%BB%D0%B0%D0%BD%D0%B0_%D0%AF%D0%BA%D0%BE%D0%B2%D0%BB%D0%B5%D0%B2%D0%B0,_SQADays-11)"/>
				<updated>2012-05-17T18:09:55Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [http://www.linkedin.com/pub/svetlana-yakovleva/22/394/a97 Светлана Яковлева] &amp;lt;blockquote&amp;gt; В пос...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80_%D0%BD%D0%B0_%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0%D1%85_%D0%B8_3D_%D1%82%D0%B5%D0%BB%D0%B5%D0%B2%D0%B8%D0%B7%D0%BE%D1%80%D0%B0%D1%85_(%D0%9E%D0%BB%D1%8C%D0%B3%D0%B0_%D0%9E%D0%BB%D0%B5%D0%B9%D0%BD%D0%B8%D0%BA,_SQADays-11)</id>
		<title>Тестирование игр на мобильных устройствах и 3D телевизорах (Ольга Олейник, SQADays-11)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80_%D0%BD%D0%B0_%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0%D1%85_%D0%B8_3D_%D1%82%D0%B5%D0%BB%D0%B5%D0%B2%D0%B8%D0%B7%D0%BE%D1%80%D0%B0%D1%85_(%D0%9E%D0%BB%D1%8C%D0%B3%D0%B0_%D0%9E%D0%BB%D0%B5%D0%B9%D0%BD%D0%B8%D0%BA,_SQADays-11)"/>
				<updated>2012-05-17T18:07:01Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/Feature_Injection_-_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC_%D1%81_%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8_(%D0%90%D0%BB%D0%BB%D0%B0_%D0%9A%D0%BE%D0%BF%D1%8B%D0%BB%D0%BE%D0%B2%D0%B0,_SQADays-11)</id>
		<title>Feature Injection - работаем с требованиями (Алла Копылова, SQADays-11)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/Feature_Injection_-_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D0%BC_%D1%81_%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8_(%D0%90%D0%BB%D0%BB%D0%B0_%D0%9A%D0%BE%D0%BF%D1%8B%D0%BB%D0%BE%D0%B2%D0%B0,_SQADays-11)"/>
				<updated>2012-05-17T17:52:19Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [http://www.linkedin.com/pub/alla-kopylova/3b/18/509 Алла Копылова] &amp;lt;blockquote&amp;gt; Уже давно ст...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9D%D0%B5_%D0%B1%D0%B0%D0%B3-%D1%82%D1%80%D0%B5%D0%BA%D0%B5%D1%80,_%D0%B0_..._(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9A%D1%83%D0%B7%D1%8C%D0%BC%D0%B8%D1%87,_SQADays-11)</id>
		<title>Не баг-трекер, а ... (Максим Кузьмич, SQADays-11)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9D%D0%B5_%D0%B1%D0%B0%D0%B3-%D1%82%D1%80%D0%B5%D0%BA%D0%B5%D1%80,_%D0%B0_..._(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9A%D1%83%D0%B7%D1%8C%D0%BC%D0%B8%D1%87,_SQADays-11)"/>
				<updated>2012-05-17T17:37:22Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [http://maksim-kuzmich.moikrug.ru/ Максим Кузьмич] &amp;lt;blockquote&amp;gt; Современный тестиров...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_cygwin_%D0%B4%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D0%B2_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B2_Windows_(%D0%98%D0%B3%D0%BE%D1%80%D1%8C_%D0%A0%D1%8B%D0%B1%D0%B0%D0%BA,_SQADays-11)</id>
		<title>Использование cygwin для автоматизации процессов тестирования в Windows (Игорь Рыбак, SQADays-11)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_cygwin_%D0%B4%D0%BB%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D0%B2_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B2_Windows_(%D0%98%D0%B3%D0%BE%D1%80%D1%8C_%D0%A0%D1%8B%D0%B1%D0%B0%D0%BA,_SQADays-11)"/>
				<updated>2012-05-16T14:18:45Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [Игорь Рыбак] &amp;lt;blockquote&amp;gt; При тестировании мы сталкиваемся со множес...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%A0%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_(%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B9_%D0%92%D0%B5%D1%80%D0%B1%D0%B5%D0%BD%D0%BA%D0%BE,_SQADays-11)</id>
		<title>Регрессионное тестирование методом свободного поиска (Сергей Вербенко, SQADays-11)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A0%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_(%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B9_%D0%92%D0%B5%D1%80%D0%B1%D0%B5%D0%BD%D0%BA%D0%BE,_SQADays-11)"/>
				<updated>2012-05-16T14:07:52Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [http://sergeyverbenko.moikrug.ru/ Сергей Вербенко] &amp;lt;blockquote&amp;gt; Очень редко стоит во...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9A%D0%B0%D0%BA_%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83_%D0%BC%D0%B5%D0%BD%D1%8F%D0%BB_(%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B5%D0%B9_%D0%9B%D1%8F%D0%BD%D0%B3%D1%83%D0%B7%D0%BE%D0%B2,_SQADays-11)</id>
		<title>Как я работу менял (Алексей Лянгузов, SQADays-11)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9A%D0%B0%D0%BA_%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83_%D0%BC%D0%B5%D0%BD%D1%8F%D0%BB_(%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B5%D0%B9_%D0%9B%D1%8F%D0%BD%D0%B3%D1%83%D0%B7%D0%BE%D0%B2,_SQADays-11)"/>
				<updated>2012-05-16T14:02:56Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [Алексей Лянгузов] &amp;lt;blockquote&amp;gt; Доклад не запланирован, как и смена ра...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%B0%D0%B2_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_%D0%BA_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%83_(%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D0%B5%D1%80%D0%B5%D1%85%D0%B8%D0%BD,_SQADays-2011)</id>
		<title>Автоматизация тестирования модели разграничения прав доступа к функционалу (Андрей Терехин, SQADays-2011)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_%D1%80%D0%B0%D0%B7%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%B0%D0%B2_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_%D0%BA_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%83_(%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%A2%D0%B5%D1%80%D0%B5%D1%85%D0%B8%D0%BD,_SQADays-2011)"/>
				<updated>2012-05-16T13:23:02Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: /* Слайды */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011)/%D0%A1%D1%82%D0%B5%D0%BD%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0</id>
		<title>DIY Java Profiling (Роман Елизаров, ADD-2011)/Стенограмма</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011)/%D0%A1%D1%82%D0%B5%D0%BD%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0"/>
				<updated>2012-05-08T10:38:19Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=1&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0001-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;У меня сегодня будет доклад про «Сделай себе сам профилирование на Яве».
Слайды будут на английском, доклад я буду делать на русском.
Слайдов очень-очень много, а времени не так много, поэтому я буду какие-то очень быстро проскакивать,
и постараюсь оставить больше времени в конце на вопросы, и может быть даже где-то в середине.
В принципе, не стесняйтесь, если захочется вдруг что-то спросить или уточнить, и даже меня прервать.
Я лучше подробнее освещу то, что вам интересно, чем буду просто рассказывать то, что я хотел рассказать.
&lt;/p&gt;&lt;p&gt;Доклад основан на реальном опыте, мы в компании больше десяти лет занимаемся созданием сложных,
очень высоконагруженных финансовых приложений, работающих с большими массивами данных,
с миллионами котировок в секунду,
c десятками тысяч пользователей онлайн, и там, при такой работе, всегда речь идет о профилировании приложения.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=2&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0002-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Профилирование приложения — неизбежный компонент любой оптимизации, оптимизация без профилирования невозможна.
Вы профилируете, находите узкие места, оптимизируете-профилируете, это постоянный цикл.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=3&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0003-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Почему доклад называется «Do It Yourself Java Profiler», зачем что-то делать самому?
Есть же огромное количество готовых инструментов, которые помогают профилировать — собственно профилировщики,
и подобные инструменты.
&lt;/p&gt;&lt;p&gt;Но дело в том, что во-первых, может быть проблема со сторонним инструментом.
Вы просто по каким-то соображениям — надежности или безопасности, можете не иметь возможности запустить сторонний инструмент на каком-то живом окружении. А к сожалению, частенько приходится профилированием заниматься не только
на тестовой платформе, но и на живой платформе, и не всегда для высоконагруженной платформе у вас есть возможность и ресурсы сделать идентичную копию системы и запустить под такой же нагрузкой.
А многие узкие места могут выявится только под большой нагрузкой, только при очень специфичных условиях.
Вы видите, что система работает не так, но вы не понимаете, почему.
Какой именно шаблон нагрузки нужно для него создать, чтобы проблема проявилась — поэтому профилировать часто нужно именно живую систему.
&lt;/p&gt;&lt;p&gt;Мы, когда пишем финансовые приложения, у нас есть еще задача обеспечить надежность системы.
И мы делаем не «банки», где главное — не потерять ваши деньги, но которые могут быть часами недоступны.
Мы делаем брокерские системы онлайн-торговли, где постоянно 24×7 доступность систем, это одна из ключевых их качеств, они никогда не должны падать.
&lt;/p&gt;&lt;p&gt;И я уже говорил, что вся индустрия зарегулирована,  и мы иногда не можем какой-то сторонний продукт использовать
на реальной системе.
&lt;/p&gt;&lt;p&gt;Но и инструменты частенько непрозрачны. Да, есть документация, которая описывает «что»,
но она не описывает, как именно он достает эти результаты, и не всегда можно понять, что он собственно намерял.
&lt;/p&gt;&lt;p&gt;Причем даже если инструмент с открытым кодом, это ничего не меняет, потому что этого кода много, вы убъете кучу времени в нем разбираясь. Инструменты надо учиться, а делать что-то самому, конечно, намного приятней.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=4&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0004-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;В чем проблема с изучением?
Естественно, если вы используете какой-то инструмент часто, то стоит его учить.
Если вы программируете каждый день в какой-то любимой вами среде разработки,
вы ее знаете вдоль и поперек, и это знание, естественно, окупается вам сторицей.
&lt;/p&gt;&lt;p&gt;А если вам нужно что-то сделать раз в месяц, например, раз в месяц вам нужно
ради бага с производительностью заниматься профилированием, то
не факт, что изучение соответствующего инструмента окупится.
Конечно же, если нет ситуации, когда инструмент решает задачу в разы быстрее.
&lt;/p&gt;&lt;p&gt;Делая что-то своими руками, вы можете переиспользовать ваши знания.
Например, у вас есть знания языков программирования, своих инструментов, вы можете их углубить,
расширить, уточнить, глубже изучив те инструменты, которые у вас уже есть, вместо изучения нового.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=5&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0005-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Почему доклад о Java?
Ну мало того, что наша компания программирует на Java, это ведущий язык 2001 года по индексу TIOBE,
отлично подходит для enterprise приложений.
А для данной конкретной лекции вообще замечательно — потому что Java — это managed язык, работает в виртуальной машине, и именно профилирование в Java делается очень легко.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=6&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0006-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Я буду рассказывать во-первых, просто о том, как решить многие проблемы профилирования, написав некий код на Java.
Скажу о возможностях Java-машин, которые можно использовать, и расскажу о такой технике, как манипулирование байт-кодом.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=7&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0007-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Мы посмотрим сегодня на профилирование как CPU, так и памяти. Я расскажду про разные техники.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=8&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0008-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Профилирование CPU. Самый простой способ, это просто взять и запрограммировать.
Если вам нужно разобраться, куда, сколько, чего, в вашей программе занимает времени, и сколько раз вызывается,
то самый-самый простой способ: не надо никаких инструментов, ничего — написать просто несколько строчек кода.
&lt;/p&gt;&lt;p&gt;В Java есть замечательная функция «currentTimeMillis», которая возвращает текущее время.
Можно ее замерять в одном месте, замерять в другом, а дальше можно посчитать, сколько раз это сделано,
суммарное время, минимальное и максимальное время, все что угодно.
Самый такой простой способ. DIY в своей максимальной простоте и примитивизме.
&lt;/p&gt;&lt;p&gt;Как ни странно, на практике способ отлично работает, приносит кучу пользы — потому что быстр, удобен и эффективен.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=9&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0009-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Когда этот метод хорошо работает?
Это замечательно работает для бизнес-методов — бизнес-метод большой, вызывается не очень часто, и вам нужно что-то про него измерить. Более того, написав этот код, раз уж вы его написали — он становится частью вашего приложения и частью функционала.
Более менее любое современное большое приложение содержит интерфейсы управления, какие-то статистики, … и в общем производительность приложения — это одна из трех вещей, которую часто хочется видеть, чтобы приложение о себе выдавало, просто как часть своего функционала.
&lt;/p&gt;&lt;p&gt;В этом смысле, запрограммировать приложение, чтобы оно само себя профилировало, является логичным шагом.
Вы увеличиваете функционал приложения, профилирование приложения становится частью его функционала.
Особенно, если таким образом вы расставляете определения в ваших бизнес-методах, которых конечный пользователь вызывает, то конечному пользователю эта информация тоже будет осмысленна.
Сколько раз и какие методы вызывались, сколько по времени отрабатывали и так далее.
Информация, которую вы собираете, в данном случае, при данном подходе,  полностью под вашим контролем.
&lt;/p&gt;&lt;p&gt;Можете замерять количество вызовов, минимальное время, максимальное время, среднее считать, можете строить гистограммы распределения времени выполнения, считать медианы и персентили.
Можете разные пути исполнения в коде отслеживать по разному, как в этом примере, кто успел разглядеть,
пока я говорил, обратил внимание, что в зависимости от пути исполнения, мы записываем разную статистику:
как часто результат запроса попал в кеш, и сколько времени это заняло, и как часто запросу пришлось лезть в базу данных, и сколько времени это заняло.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=8&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0008-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Это возможно, если вы этот код пишете сами, собираете статистику, встраиваете сами в свое приложение.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=10&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0010-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Более того, вам, как человеку, который занимается циклом профилирования-оптимизации, вы потом эту информацию используете — что же в вашем приложении происходит? Эта информация всегда находится внутри вашего приложения,
код работает в живой системе.
У вас произошел какой-то неудачный день,
что-то система не так работала, вы можете посмотреть в логах эту статистику, разобраться,  и так далее.
&lt;/p&gt;&lt;p&gt;Замечательная методика, нет никаких сторонних инструментов, только немножко кода на яве.
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Что же делать, если методы короче, и вызываются чаще?
&lt;/p&gt;&lt;p&gt;Дело в том, что такой прямой метод уже не подойдет, потому что метод «currentTimeMillis» не быстрый, и меряет только в миллисекундах.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=11&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0011-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Если вам нужно замерить только количество вызовов, то достаточно быстро можно это сделать используя Java-класс
«AtomicLong». С его помощью, вы можете, внося минимальный вклад в производительность, посчитать количество вызовов какого-нибудь интересующего вас метода.
Это будет работать до десятков тысяч вызов в секунду, не сильно искажая работу самого приложения.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=12&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0012-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Что же делать, если вам нужно еще замерить время выполнения?
Замер времени исполнения коротких методов — это очень сложная тема.
Стандартными никакими методами она не решается, несмотря на то, что в Java есть метод «systemNanoTime»,
он эти проблемы не решает, он сам по себе медленный, и с помощью него что-то быстрое сложно замерить.
&lt;/p&gt;&lt;p&gt;Единственный реальный выход — это использовать нативный код, для x86 процессора есть такая замечательная инструкция
&lt;a href=&quot;http://ru.wikipedia.org/wiki/rdtsc&quot; class=&quot;extiw&quot; title=&quot;rupedia:rdtsc&quot;&gt;rdtsc&lt;/a&gt;, которая возращает счетчик количества тактов процессора.
Напрямую к ней доступа нет, можно написать на C однострочный метод, который вызывает «rdtsc», а дальше слинковать его с Java-кодом, и вызывать из Java.
Этот вызов вам займет сто тактов, и если вам нужно замерить кусок кода, который занимают тысячу-другую тактов,
то это осмысленно, если у вас идет оптимизация каждого машинного такта, и вы хотите понять, «плюс-минус», «быстрее-медленнее», как вы работаете. Это действительно редкий случай, когда вам нужно оптимизировать каждый такт.
&lt;/p&gt;&lt;p&gt;Чаще всего, когда речь идет о каких-то более коротких кусках кода, и более часто вызываемых, используют другой подход, который называется «семплирование».
Вместо точных замеров, сколько раз и чего вызывается, вы периодически анализируете выполнение программы, смотрите, где она исполняется, в произвольные моменты времени, например — раз в секунду, или раз в десять секунд.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=13&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0013-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Смотрите, где происходит исполнение, и считаете, в каких местах вы застаете свою программу часто.
Если у вас в программе есть строчка, в которой она тратит все, или по крайней мере 90% своего времени,
например, какой-нибудь цикл, а там, в глубине, какая-то строчка, то скорее всего, при остановке исполнения вы ее в этой строчке и застанете.
&lt;/p&gt;&lt;p&gt;Такое место в программе называется «горячей точкой».
Это всегда замечательный кандидат для оптимизации.
Что классно — есть встроенная фукнция под названием «thread dump», чтобы получить дамп всех потоков.
В Windows она делается путем нажатия CTRL-Break на консоли, а на Linux и других юниксах это делается посылкой третьего сигнала, командой «kill -3».
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=14&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0014-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;В этом случае, Java-машина на консоль выводит подробное описание состояния всех потоков.
И если у вас действительно есть горячее место в коде, то скорее всего программу там и застанете.
Поэтому опять же, когда у вас проблема производительности с кодом, не надо бежать к профилировщику,
не надо ничего делать. Видите, что тормозит, сделайте хоть один thread dump, и посмотрите.
Если у вас одно горячее место, в котором программа тратит все время, вы в thread dump и увидите эту строчку,
в своей любимой среде разработки, без использования каких-нибудь сторонних, дополнительных инструментов.
Посмотрите этот код, изучите, оптимизируйте — либо он слишком часто вызывается, либо он медленно работает,
дальше уже разбор полетов, оптимизация, либо дальнейшее профилирование.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=15&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0015-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Также в современных Java-машинах есть замечательная утилита «jstack», ей можно передать идентификатор процесса, и получить на выходе thread dump.
&lt;/p&gt;&lt;p&gt;Сделайте не один thread dump, сделайте несколько thread dumpов. Если первый ничего не выловит, посмотрите еще на пару-тройку. Может у вас в горячей точке не сто процентов времени программа проводит, а 50%.
Сделав несколько thread dumpов, вы явно в хоть какой-то из этих моментов,
достанете ваш код из горячей точки, и глазками посмотрите те места, где вы застали ваш код.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=16&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0016-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Эту идею можно развить дальше. Можно, запустив ява-машину, перенаправить ее выход в файл,
и запустить скрипт, который делает thread dump каждые три секунды.
Это можно делать совершенно спокойно на живой системе, без какого либо риска что-то с ней сделать.
Потому что сам сбор thread dump досточно быстрая процедура, занимает от силы 100 миллисекунд, даже при очень
большом количестве тредов.
&lt;/p&gt;&lt;p&gt;А если вы пишите на яве, то скорее всего ваша система не hard real time, и
вам там наносекунды не важны, потому что у вас уже периодически встречается сборка мусора и так далее.
Т.е. вам лишнее засыпание системы на сто миллисекунд катастрофы не создает.
&lt;/p&gt;&lt;p&gt;И даже в нашей, финансовой области, большинство систем, которые мы пишем, мы пишем все-таки для людей, с ними работают люди, да, там миллионы котировок в секунду, да, есть роботы (это отдельная история), но чаще всего на эти котировки смотрит человек, который плюс-минус 100 миллисекунд в глаза не заметит.
Человек заметит, если будет торможение на двести миллисекунд, это уже будет заметная для человека задержка, но сто миллисекунд — нет.
&lt;/p&gt;&lt;p&gt;Поэтому можно не переживать о лишних ста миллисекундах, и раз в три секунды делать thread dump, можно совершенно безопасно, даже на живой системе. При этом thread dump, это часть java-машины, хорошо оттестированная — я за весь свой опыт работы ни разу не видел, чтобы попытка сделать на Java-машине thread dump сделала с ней что-то плохое.
&lt;/p&gt;&lt;p&gt;Т.е. это совершенно безопасный инструмент профилирования живых и работающих систем.
После этого, получив файл thread dump, его можно посмотреть глазками, а можно написать несложный кусок кода,
который анализирует, считает какие-нибудь статистики → хотя бы тупо, посмотреть, какие методы проявились и сколько раз, посмотреть, в каком состоянии находились потоки.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=14&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0014-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;При этом если стандартные инструменты профилирования, действительно смотрят на состояние потока,
которое выводит Java-машина («RUNNABLE»), то в реальности, ваше состояние ни о чем не говорит,
потому что если ваша программа много работает с базой данных, и много работает с какими-то внешними…
сетью, то ваш код может ожидать получение данных по сети, при этом java-машина его считает «RUNNABLE»,
и вы ничего не сможете понять — какие у вас реально методы, и какие ждут данных от сети.
С другой стороны, если вы сами анализируете стеки, — вы можете написать, вы-то знаете, что ваша программа делает,
что вот это — вызов в базу данных, что этот метод в стеке означает, что вы вошли в базу данных, можете посчитать, сколько процентов времени вы проводите в базе данных, и так далее, тому подобное.
Вы можете знать, что вот этот метод на самом деле CPU не жрет, хотя java-машина думает, что он «RUNNABLE».
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=17&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0017-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Более того, thread dump можно интегрировать в приложения, в Java есть замечательный метод
&lt;/p&gt;
&lt;pre&gt;Thread.getAllStackTraces
&lt;/pre&gt;
&lt;p&gt;который позволяет получить информацию о stacktrace программно.
&lt;/p&gt;&lt;p&gt;Таким образом, вы можете интегрировать профилирование, как функциональную часть этого приложения,
и распространять приложение вашим клиентам, с уже встроенным профилированием.
Тем самым, у вас будет постоянный поток информации, который вы сможете анализировать
для улучшения вашего приложения.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=18&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0018-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Но есть проблема. Дело в том, что когда вы Java-машину просите сделать thread-dump,
она не просто процесс останавливает, и делает стек, она включает флажок, что ява-машине надо бы остановится в следующем безопасном месте.
«Безопасное место» — это специальные места, которые расставляет компилятор по коду, где у программы есть определенное состояние, где понятно, что у нее в регистрах, понятна точка исполнения, и так далее.
Если брать кусок последовательного кода, где нет никаких обратных переходов, никаких циклов, то там
«safe point» может не оказаться вообще. Причем неважно, что вызовы методов могут заинлайнится hotspot-ом,
и savepoint-ов тоже не будет.
&lt;/p&gt;&lt;p&gt;Поэтому если вы видите в thread dumpe какую-то строчку — это совершенно не значит, что это горячая строчка вашего кода, это просто ближайший savepoint к горячей точке.
Потому что когда вы нажимаете «CTRL-BREAK», Java всем потокам выставляет флажок «остановиться на ближайшем savepointе», и только когда они останавливаются, Java-машина анализирует, в каком состоянии они это делают.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=19&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0019-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Теперь перейдем к профилированию памяти, как это делается.
&lt;/p&gt;&lt;p&gt;Во-первых, есть замечательные, готовые фичи Java-машина.
Есть отличный инструмент jmap, который выводит гистограмму того, чем у вас забита память,
какие объекты и сколько памяти занимают.
Это замечательный инструмент для общего обзора, что же у вас происходит, и чем забита память.
&lt;/p&gt;&lt;p&gt;Опять же, если вы никогда не профилировали программу, то чаще всего вы сразу найдете проблемы, и у вас будет пища для дальнейшей оптимизации вашего использования памяти.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=20&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0020-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Проблема в том, что вы таким образом получите информацию о всех объектах, даже тех, которые сейчас в данный момент не используются, находятся в мусоре.
&lt;/p&gt;&lt;p&gt;Поэтому у jmap есть специальная опция «live», которая перед тем, как сделать гистограмму делает сборку мусора,
оставляет только используемые объекты, и только после этого строит гистограмму.
&lt;/p&gt;&lt;p&gt;Проблема, что уже с этой опцией, большую, живую систему работающую с многими гигабайтами памяти, запрофилировать нельзя, потому что сборка мусора системы, работающей с десятком гигабайт памяти занимает десяток-другой секунд, и это может быть неприемлимо… в любой системе, если ваша система работает с конечными людьми, человек, которому система дольше трех секунд  не отвечает, считает, что она зависла.
Нельзя живую, работающую с человеком систему останавливать дольше чем на секунду, на самом деле.
Даже секунда уже будет человеку заметна, но еще не катастрофа, но если вы подключите какой-то инструмент, который остановит на 10 секунд — то это будет катастрофа.
Поэтому часто приходится довольствоваться на живых системах jmap-ов тех объектов, которые есть, и в целом, неважно, мусор это или нет.
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=21&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0021-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Также дополнительно полезно знать дополнительные опции Java-машин.
Например, у Java-машин можно попросить отпечатать гистограмму классов,
когда вы делаете thread dump → «PrintClassHistogram».
&lt;/p&gt;&lt;p&gt;Ява-машину можно попросить при исчерпании памяти записывать свое состояние на диск.
Это очень полезно, потому что обычно, люди начинают оптимизировать потребление памяти только тогда, когда она заканчивается почему-то. Никто не занимается профилированием, когда все хорошо, а вот когда программе начинает памяти не хватать, она вылетает, начинают думать, как бы так соптимизировать.
Поэтому это опцию полезно всегда иметь включенной. Тогда в плохом случае Java-машина вам запишет бинарный дамп, который вы можете потом, не на живой системе, любыми инструментами проанализировать.
При этом, этот дамп можно в любой момент взять с Java-машины,
тем же jmap-ом, с опцией «-dump», но это, опять же, останавливает Java-машину на долгое время, на живой системе вы это вряд ли заходите делать.
&lt;/p&gt;&lt;p&gt;Реплика из зала: Там есть свойство, что этот «HeapDumpOutOfMemory» оптимизирован для тех случаев, когда память уже кончилась.
&lt;/p&gt;&lt;p&gt;Да, конечно. «HeapDumpOutOfMemory» очень полезная опция, причем хотя она «-XX», не надо этих опций бояться,
хотя этот «XX» подчеркивает их мегаспециальность, но это не экспериментальные опции, это нормальные production-опции ява-машины, они стабильные, надежные, их можно использовать на живой, реальной системе.
&lt;/p&gt;&lt;p&gt;Это не экспериментальные опции! В java-машине есть четкое деление, но деление на экспериментальные и неэкспериментальные опции не зависит от числа X-ов.
&lt;/p&gt;&lt;p&gt;Реплика из зала: Эта опция иногда не откладывают дампы…
&lt;/p&gt;&lt;p&gt;Ну, в java-машине тоже бывают баги, все зависит от того, … бывают разные причины исчерпания памяти, я не буду на этом останавливаться, у нас времени мало.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=22&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0022-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Я хочу остановится на очень важном моменте, в оставшееся время, а именно, на профилировании выделения памяти.
&lt;/p&gt;&lt;p&gt;Одно дело — чем память занята, как вы ее вообще используете.
Если у вас где-то в коде есть излишнее выделение временной памяти, т.е. вы выделяете, … что-то с ним делаете,
этом методе и потом забываете, он уходит в мусор, и garbage collector потом его забирает.
И так вы делаете снова и снова, ваша программа будет работать медленнее, чем бы она работала с этим … но вы никаким профилировщиком по CPU это место кода не найдете, потому что сама операция выделения в Java-машине памяти, работает фантастически быстро, быстрее, чем в любом не-managed языке, C/C++, потому что в Java выделение памяти это банально увеличение одного указателя. Все. Это несколько ассемблерных инструкций, все очень быстро происходит. Она уже предварительно обнулена, все уже выделено и подготовлено. Вы этого времени при анализе горячих точек вашего кода не найдете — оно не высветится у вас никогда, ни в каком thread dumpe, ни в каком профилировщике, что это у вас горячая точка. Хотя у вас это все будет жрать ваше время, работы вашего приложения — почему? Потому что потом, сборщик мусора будет тратить время, чтобы этот мусор собрать. Поэтому смотрите, на то, сколько процентов времени ваше приложение тратит на сборку мусора.
&lt;/p&gt;&lt;p&gt;Это полезная опция «-verbose:gc», «+PrintGC», «+PrintGCDetails», которые позволят вам разобраться,
сколько времени вашего приложения уходит на сборку мусора.
Если вы видите, что на сборку мусора уходит существенный процент времени,
значит вы где-то в программе много выделяете памяти, вы это место не найдете,
нужно искать, кто выделяет память.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=23&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0023-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Как искать?
Есть встроенный в Java-машину способ, ключик «-Xaprof».
Он вам, к сожалению, только при завершении процесса, выводит так называемый allocation profile,
который говорит не о содержимом памяти, а о статистике выделяемых объектов → какие объекты и как часто выделялись.
&lt;/p&gt;&lt;p&gt;Если у вас это действительно часто происходит, вы скорее всего увидите, что где-то заведен какой-то временный класс, который действительно очень часто выделяется.
Попробуйте сразу сделать «aprof» — может вы сразу найдете вашу проблему.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=24&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0024-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Но не факт. Может получится ситуация, что вы увидите выделения большого количества массивов character-ов, каких-то string-ов, или чего-нибудь, и непонятно где.
&lt;/p&gt;&lt;p&gt;Понятно, что у вас могут быть подозрения — где. Может какое-нибудь недавнее изменение, это могло внести.
В конце-концов, вы можете добавить в том месте, где выделяется память слишком часто, используя ту же технику изменерения кода в atomiс longах, посчитайте, сколько раз в этом месте происходит выделение — посмотрите статистику, подозрительные места вы сами сможете проинициировать и найти.
&lt;/p&gt;&lt;p&gt;А что делать, если у вас нет идеи, где это происходит?
Ну надо как-то добавить сбор статистики всюду, по всем местам, где выделяется память.
Для такого рода задач отлично подходит аспектно-ориентированное программирование, либо прямое использование манипуляций байт-кодом.
&lt;/p&gt;&lt;p&gt;Я сейчас за оставшееся время попробую остановится как раз на технике манипуляции байт-кодом, которая как раз подходит, для решения задач типа «вот я хочу во всех местах, где выделяется массив, посчитать, сколько раз в этом месте это происходит, по всему своему коду, чтобы найти то самое место, в котором я почему-то очень много массивов int-ов выделяю». Т.е. я вижу, что их много выделяется, но я просто хочу найти где.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=25&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0025-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Манипулирование байткодом позволяет не только эти задачи решить, она позволяет любые изменения, нефункциональные, в код вносить, уже после его компиляции.
Тем самым, этот способ декомпозировать профилирование от бизнес-логики.
Если в начале я говорил, что часто профилирование может быть логичной частью вашего функционала,
то бывают случаи, когда это не нужно, когда вам нужно найти проблему, решить, и чтобы никаких строк не осталось.
В этом случае подходит такая замечательная техника, как манипулирование байт-кодом.
&lt;/p&gt;&lt;p&gt;Причем это можно делать как с посткомпиляцией выкладки кода, так и на лету, с кодом.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=26&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0026-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Самый лучший способ, который я знаю, это использовать библиотечку ASM, ObjectWebовскую.
Это open-source библиотека, которая позволяет очень легко заниматься манипуляцией байткодом,
и она фантастически быстрая — можно манипулировать кодом на лету, не сильно замедляя время загрузки приложения.
&lt;/p&gt;&lt;p&gt;ASM устроен очень просто. У него есть класс под названием class-reader, который читает .class-файлы, и преобразовывает байтики, используя шаблон Visitor, в набор вызовов вида «я вижу метод», «я вижу поле с такими-то полями в этом классе» и так далее. Когда он видит метод, он начинает с помощью «MethodVisitor» сообщать, какой он там видит байт-код.
&lt;/p&gt;&lt;p&gt;А потом есть, с другой стороны, такая штука, как «ClassWriter», который наоборот, превращает класс в массив байтиков, который нужен ява-машине.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=27&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0027-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Чтобы например, с помощью ASM-а, отследить все выделения массивов… в-общем, это делается примитивно.
Вам нужно всего парочку классов сделать. Вам нужно определить свой класс-адаптер, который, когда ему говорят, что виден метод, перекрывает, и возвращает свой собственный метод-visitor, чтобы оузнать, что в этом методе происходит.
&lt;/p&gt;&lt;p&gt;А когда внутри метода ему говорят, что вот, есть целочисленная инструкция с байт-кодом выделения массива («NEWARRAY»), то в этот момент, он имеет возможность … вставить свои какие-нибудь байткоды в восходящий поток и все. И вы отследили все места, где у вас выделяются массивы, и поменяли соответствующий байт-код.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=28&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0028-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Дальше — что делать, если вы хотите эти изменения делать на лету.
&lt;/p&gt;&lt;p&gt;Если у вас есть набор скомпилированных классов — то это легко → вы как бы обработали этим инструментом, и все.
&lt;/p&gt;&lt;p&gt;Если вам это нужно делать на лету, то в java-машине есть замечательная опция — javaagent.
Вы делаете специальный jar-файл, у которого в манифесте указываете опцию «Premain-Class»,
и указываете там имя своего класса. Потом … метод «premain» по определенному шаблону,
и тем самым, вы еще до запуска основного кода, c main-методом, получаете управление, и получаете указатель на
interface instrumentation.
Этот интерфейс замечательный, он позволяет вам, на лету, менять классы в java-машине. Он позволяет вам поставить свой собственный class-file трансформер, который Java-машина будет вызывать для каждой попытки загрузки класса.
&lt;/p&gt;&lt;p&gt;И вы сможете классы подменять. Т.е. загружать не только те классы, которые на самом деле лежат, а с помощью того же ObjectWebASM, анализировать что-то, менять, и подменять их на лету… можете узнать размер выделенного объекта.
&lt;/p&gt;&lt;p&gt;Замечательный инструмент такого профилирования на коленке, когда у вас есть конкретная задача, которую нужно решить.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DIY_Java_Profiling_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2,_ADD-2011).pdf&amp;amp;page=29&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;DIY Java Profiling (Роман Елизаров, ADD-2011).pdf&quot; src=&quot;/images/thumb/2/2d/DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf/page0029-512px-DIY_Java_Profiling_%28%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D1%80%D0%BE%D0%B2%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;В завершении скажу, что совершенно не обязательно, для решения каких-то задач профилирования владеть каким-нибудь инструментом, достаточно знать байт-код, знать опции ява-машины, и знать стандатные ява-библиотеки, тот же javalang-инструмент. Это позволяет решить огромное число специфичных проблем, с которыми вы сталкиваетесь.
Мы за десять лет у себя в компании разработали несколько доморощенных инструментов, которые решают проблемы не специфичные нам, которые не решают специфичные профилировщики.
Начиная  с того, что у нас в процессе работы появился развесистый, но тем не менее простой инструмент который анализирует thread dump, и выдает по ним статистику, это тем не менее простая утилитка, которую нельзя назвать инструментом. Классик на несколько страничек, который собирает статистику и выдает ее в красивом виде.
Дико полезен, потому что нам не надо в production систему подключать какие-то профилировщики, просто thread dump, и все…
&lt;/p&gt;&lt;p&gt;И кончая тем, что у нас есть свой собственный инструмент профилирования памяти, который опять же, маленький, его сложно назвать инструментом, который отслеживает, где и что выделяется, причем делает он это, практически не замедляя программы.
Причем как коммерческие, так и открытые профилировщики, они тоже умеют отслеживать выделение памяти, но они пытаются решить проблему более сложную, и универсальную. Они пытаются узнать, в каком месте выделение памяти происходит, с полным stack-trace'ом. Это долго, это сильно замедляет.
Не используют то же семплирование. Не всегда собирают, тем самым получая не всю статистику, и так далее.
&lt;/p&gt;&lt;p&gt;Идут на какие-то свои компромиссы, которые в вашей предметной области, они вам не нужны, у вас есть какие-то свои задачи, которых вы хотите решить при анализе производительности ваших систем.
&lt;/p&gt;&lt;p&gt;Теперь я будут отвечать на вопросы (ответы на вопросы с 30:06).
&lt;/p&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/Nemerle_Deep_Dive_(%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D1%81%D0%BB%D0%B0%D0%B2_%D0%A7%D0%B8%D1%81%D1%82%D1%8F%D0%BA%D0%BE%D0%B2,_ADD-2011)/%D0%A1%D1%82%D0%B5%D0%BD%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0</id>
		<title>Nemerle Deep Dive (Владислав Чистяков, ADD-2011)/Стенограмма</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/Nemerle_Deep_Dive_(%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D1%81%D0%BB%D0%B0%D0%B2_%D0%A7%D0%B8%D1%81%D1%82%D1%8F%D0%BA%D0%BE%D0%B2,_ADD-2011)/%D0%A1%D1%82%D0%B5%D0%BD%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0"/>
				<updated>2012-05-07T21:47:08Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-14h53m00s255.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-14h53m00s255.png&quot; src=&quot;/images/thumb/b/b2/Nemerle-deep-dive-2012-04-29-14h53m00s255.png/512px-Nemerle-deep-dive-2012-04-29-14h53m00s255.png&quot; width=&quot;512&quot; height=&quot;288&quot; srcset=&quot;/images/b/b2/Nemerle-deep-dive-2012-04-29-14h53m00s255.png 1.5x, /images/b/b2/Nemerle-deep-dive-2012-04-29-14h53m00s255.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Здравствуйте, меня зовут Владислав Чистяков, я представляю здесь коммьюнити нового языка программирования Nemerle,
и буду рассказывать о нем. На самом деле рассказ будет разделен на две части, в этом зале пройдет только такая,
общая презентация, из которого можно будет узнать, что это такое, грубо говоря, на верхнем уровне, и посмотреть,
что с этим можно делать.
А остальная, большая часть докладов пройдет в другом зале, в малом, это будет дольше, там можно будет задавать серьезные вопросы, показывать код и так далее.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-14h56m36s41.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-14h56m36s41.png&quot; src=&quot;/images/thumb/c/c2/Nemerle-deep-dive-2012-04-29-14h56m36s41.png/512px-Nemerle-deep-dive-2012-04-29-14h56m36s41.png&quot; width=&quot;512&quot; height=&quot;320&quot; srcset=&quot;/images/c/c2/Nemerle-deep-dive-2012-04-29-14h56m36s41.png 1.5x, /images/c/c2/Nemerle-deep-dive-2012-04-29-14h56m36s41.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Что такое Немерле, зачем он нужен и откуда он появился.
Nemerle родился как соединение лучших черт, из трех языков программирования, ну, с небольшой натяжкой, ведь большинство возможностей не стопроцентно заимствованы, а просто похожи на оригинал.
&lt;/p&gt;&lt;p&gt;Основной источник заимствования — это C#.
Из C# взята система типов, если кто знает такое название — номинативная,
это когда тип определяется именем, а не какими-то другими атрибутами.
&lt;/p&gt;&lt;p&gt;Из C# позаимствованы естественно позаимствованы классы, перечисления, структуры, ну и так далее, т.е. верхняя часть языка, как можно назвать.
&lt;/p&gt;&lt;p&gt;Из ML позаимствованы выражения, т.е. внутренняя часть методов, тот самый код, который мы с вами все время пишем, и такой тип данных, как &lt;tt&gt;variant&lt;/tt&gt;. В ML он назывался &lt;tt&gt;discriminated union&lt;/tt&gt;, это нечто похожее на объединение в C, если кто-то не знаком с ML-подобными языками.
&lt;/p&gt;&lt;p&gt;Операторы позаимствованы из С, но также можно сказать, что они позаимствованы из C#, это ведь язык, который является наследником.
&lt;/p&gt;&lt;p&gt;Все остальное в языке сделано на базе макросов.
Макросы, идея макросов, взята из LISP, но макросы Nemerle очень отдаленно похожи на макросы Лиспа, почему — я расскажу в последствие.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-15h10m27s172.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-15h10m27s172.png&quot; src=&quot;/images/thumb/d/dc/Nemerle-deep-dive-2012-04-29-15h10m27s172.png/512px-Nemerle-deep-dive-2012-04-29-15h10m27s172.png&quot; width=&quot;512&quot; height=&quot;493&quot; srcset=&quot;/images/d/dc/Nemerle-deep-dive-2012-04-29-15h10m27s172.png 1.5x, /images/d/dc/Nemerle-deep-dive-2012-04-29-15h10m27s172.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Давайте так, сделаем такой простой эксперимент, проведем… поднимите руки те, кто по крайней мере, в общих чертах знает C#? Большинство, я так понимаю.
&lt;/p&gt;&lt;p&gt;Ну тогда следующий кадр будет вам понятен, это ничего не делающая программа на C#, демонстрирующая общие элементы языка. Всем видно?
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-15h15m42s5.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-15h15m42s5.png&quot; src=&quot;/images/thumb/5/52/Nemerle-deep-dive-2012-04-29-15h15m42s5.png/512px-Nemerle-deep-dive-2012-04-29-15h15m42s5.png&quot; width=&quot;512&quot; height=&quot;497&quot; srcset=&quot;/images/5/52/Nemerle-deep-dive-2012-04-29-15h15m42s5.png 1.5x, /images/5/52/Nemerle-deep-dive-2012-04-29-15h15m42s5.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Обратите внимание на подсветившиеся красненьким фрагменты, это фрагменты, которые на Nemerle будут не нужны,
их можно будет удалить.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-15h17m41s142.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-15h17m41s142.png&quot; src=&quot;/images/thumb/1/1c/Nemerle-deep-dive-2012-04-29-15h17m41s142.png/512px-Nemerle-deep-dive-2012-04-29-15h17m41s142.png&quot; width=&quot;512&quot; height=&quot;395&quot; srcset=&quot;/images/1/1c/Nemerle-deep-dive-2012-04-29-15h17m41s142.png 1.5x, /images/1/1c/Nemerle-deep-dive-2012-04-29-15h17m41s142.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Вот, как будет эта программа выглядеть, если ее переписать на Nemerle.
У нас изменились скобочки, через которые описываются параметры типов,
изменилось описание параметров и возвращаемых значений функций, пропал &lt;tt&gt;return&lt;/tt&gt;,
(вот назад вернемся — все видели?).
Появился &lt;tt&gt;module&lt;/tt&gt; вместо статического класса, фактически это просто синоним, чтобы не писать лишней статики на уровне методов.
И не нужно указывать тип при создании объекта, можно сказать что это (&lt;tt&gt;def&lt;/tt&gt;) это аналог &lt;tt&gt;var&lt;/tt&gt;,
но на самом деле он вводит неизменяемую переменную, т.е. переменную, которую можно один раз определить, и
больше не использовать, т.е. биндинг/байндинг.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-15h15m42s5.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-15h15m42s5.png&quot; src=&quot;/images/thumb/5/52/Nemerle-deep-dive-2012-04-29-15h15m42s5.png/512px-Nemerle-deep-dive-2012-04-29-15h15m42s5.png&quot; width=&quot;512&quot; height=&quot;497&quot; srcset=&quot;/images/5/52/Nemerle-deep-dive-2012-04-29-15h15m42s5.png 1.5x, /images/5/52/Nemerle-deep-dive-2012-04-29-15h15m42s5.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Кроме того, стали не нужны операторы &lt;tt&gt;new&lt;/tt&gt; (&lt;tt&gt;new Test&amp;lt;int&amp;gt;&lt;/tt&gt;) для создания объекта, теперь это просто функция с именем типа, и не нужно указывать параметры типов, потому, что Nemerle выводит их сам, автоматически, даже в конструкторе и более сложных конструкциях.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-15h17m41s142.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-15h17m41s142.png&quot; src=&quot;/images/thumb/1/1c/Nemerle-deep-dive-2012-04-29-15h17m41s142.png/512px-Nemerle-deep-dive-2012-04-29-15h17m41s142.png&quot; width=&quot;512&quot; height=&quot;395&quot; srcset=&quot;/images/1/1c/Nemerle-deep-dive-2012-04-29-15h17m41s142.png 1.5x, /images/1/1c/Nemerle-deep-dive-2012-04-29-15h17m41s142.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Очень многие задают вопрос, зачем надо было так менять синтаксис, но тут ответов в общем-то два.
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; Первый резон для изменения синтаксиса — это то, что авторы языка были очень неравнодушны к MLю, и они позаимствовали из него все, что они посчитали более удобным и красивым. Вкусовщина, можно сказать.&lt;/li&gt;
&lt;li&gt; Второй резон, это то, что язык расширяемый, большая часть конструкций языка сделана на макросах, поэтому языку очень важно иметь регулярную грамматику, чтобы конструкции языка парсились без каких-то там хитрых изысков. Например, в C#, есть как минимум четыре места, которые очень тяжелы для парсинга, соответственно там пишутся очень сложные ручные … или используются весьма мощные генераторы парсеров. По-факту, сегодня все используемые production-парсеры сделаны вручную, или по крайней мере, с ручным участием.&lt;/li&gt;&lt;/ul&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-15h42m48s114.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-15h42m48s114.png&quot; src=&quot;/images/thumb/1/13/Nemerle-deep-dive-2012-04-29-15h42m48s114.png/512px-Nemerle-deep-dive-2012-04-29-15h42m48s114.png&quot; width=&quot;512&quot; height=&quot;395&quot; srcset=&quot;/images/1/13/Nemerle-deep-dive-2012-04-29-15h42m48s114.png 1.5x, /images/1/13/Nemerle-deep-dive-2012-04-29-15h42m48s114.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Ну вот, здесь объясняется, что является чем, обратите внимание, &lt;tt&gt;return&lt;/tt&gt; например, не нужен.
Почему не нужен &lt;tt&gt;return&lt;/tt&gt; — потому что любой блок кода, последнее значение является его возвращаемым.
&lt;/p&gt;&lt;p&gt;Одна из особенностей языка, это то, что любая конструкция в усиляемом языке является выражением,
т.е нет так называемых &lt;i&gt;statement&lt;/i&gt;-ов(…), т.е. если в C# &lt;tt&gt;if&lt;/tt&gt; например, это &lt;tt&gt;statement&lt;/tt&gt;,
то в Nemerle &lt;tt&gt;if&lt;/tt&gt; — это выражение. Но если это выражение возвращает &lt;tt&gt;void&lt;/tt&gt;, т.е. ничего не возращает, то оно аналогично стейтменту C#. И так как этого выделения нет, многие операции делаются проще, и удобнее.
Например, вы можете использовать try/catch прямо из выражения, вам не нужно какие-то там лишние переменные вводить, что-то там еще делать, вы можете прямо в середине выражения написать &lt;tt&gt;try/catch&lt;/tt&gt;, обработать ошибочку, и прямо там суммирование с чем-то, если у вас там какие-то целочисленные вычисления.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-16h00m33s3.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-16h00m33s3.png&quot; src=&quot;/images/thumb/9/9f/Nemerle-deep-dive-2012-04-29-16h00m33s3.png/512px-Nemerle-deep-dive-2012-04-29-16h00m33s3.png&quot; width=&quot;512&quot; height=&quot;246&quot; srcset=&quot;/images/9/9f/Nemerle-deep-dive-2012-04-29-16h00m33s3.png 1.5x, /images/9/9f/Nemerle-deep-dive-2012-04-29-16h00m33s3.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Кроме того, Nemerle поддерживает так называемый indent-синтаксис, в стиле python-а или F#-а, F# правда позже появился, значительно.
Что некоторым очень нравится, так как значительно визуально сжимает код, может сравнить (см. предыдущий слайд-код), это один и тот же код, только записанный в indent-стиле, и в обыкновенном.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-16h06m57s220.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-16h06m57s220.png&quot; src=&quot;/images/thumb/9/90/Nemerle-deep-dive-2012-04-29-16h06m57s220.png/512px-Nemerle-deep-dive-2012-04-29-16h06m57s220.png&quot; width=&quot;512&quot; height=&quot;253&quot; srcset=&quot;/images/9/90/Nemerle-deep-dive-2012-04-29-16h06m57s220.png 1.5x, /images/9/90/Nemerle-deep-dive-2012-04-29-16h06m57s220.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Я немножко сейчас отойду от своей презентации, потому что у нас времени не так много в этом зале, и мне придется сокращать.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-16h11m24s65.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-16h11m24s65.png&quot; src=&quot;/images/thumb/a/ae/Nemerle-deep-dive-2012-04-29-16h11m24s65.png/512px-Nemerle-deep-dive-2012-04-29-16h11m24s65.png&quot; width=&quot;512&quot; height=&quot;355&quot; srcset=&quot;/images/a/ae/Nemerle-deep-dive-2012-04-29-16h11m24s65.png 1.5x, /images/a/ae/Nemerle-deep-dive-2012-04-29-16h11m24s65.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Я попробую своими словами объяснить… ну давайте я расскажу для начала, почему я сказал, что ядро все из ML-я,
а потом, объясню, зачем этот язык был создан, и что он дает.
&lt;/p&gt;&lt;p&gt;Итак, вот весь список доступных выражений в языке, на экране перед вами. Всем видно, можно прочесть?
Ну давайте, я прочитаю, по быстренькому.
&lt;/p&gt;&lt;p&gt;Оператор &lt;tt&gt;match&lt;/tt&gt;. Если кто-то программировал на функциональных языках, то практически в любом функциональном современном языке, ну кроме LISPа, наверное, есть оператор &lt;tt&gt;match&lt;/tt&gt;.
Это такой &lt;tt&gt;switch&lt;/tt&gt; на стероидах. Т.е. это такой &lt;tt&gt;switch&lt;/tt&gt;, который позволяет не только перейти к какому-то индексу, строке, а позволяет разобрать структуру объектов. Т.е. если у вас есть какая-то сложная структура объектов, то он может прямо…, паттерн…, узнать в этой структуре.
Если у вас есть какое-то деревце, ну например, DOM/XML, то вы можете прямо паттерном определить, какой-то там набор объектов и так далее. Очень мощная структура, оператор очень мощный, позволяет в некоторых случаях серъезно упростить решения задач, или сделать их по-другому.
&lt;/p&gt;&lt;p&gt;Блоки выражений. Это такие же блоки, как в C#, только они могут возвращать значения, из себя.
&lt;/p&gt;&lt;p&gt;Именованные блоки, это замена &lt;tt&gt;return&lt;/tt&gt;-у, на презентации в другом зале я это продемонстрирую, это интересная штука. Они позволяют, например, выйти из трех циклов сразу, и более того — сразу возратить значение какой-то переменной. Это такая структурированная замена break-у. Совершенно безопасная, очень удобная, при этом, собственно, очень мощная.
&lt;/p&gt;&lt;p&gt;Связывание &lt;tt&gt;def&lt;/tt&gt;. В отличие от C#, Nemerle пропагандирует функциональное программирование, и поэтому он подталкивает к созданию неизменяемых переменных. По факту, когда вы пишите даже обыкновенный C#-код, большинство переменных могут быть неизменяемые, когда они задаются один раз, а дальше только используются.
&lt;/p&gt;&lt;p&gt;Естественно, Nemerle поддерживает и обычное итеративное программирование, поэтому, в язык введена конструкция &lt;tt&gt;mutable&lt;/tt&gt;. Это полный аналог &lt;tt&gt;var&lt;/tt&gt; из C#, т.е. создание переменной, значение которой можно переопределить дальше.
&lt;/p&gt;&lt;p&gt;Обработка исключений «throw, try/catch/finally». Это то же самое, как и в C#, только c одним условием, что его можно использовать не только как statement С#, но и внутри выражений. Если у вас есть какое-то вычисление, вы можете защитить кусочек этого вычисления, и вернуть значение по дефолту.
&lt;/p&gt;&lt;p&gt;Набор операторов. Фактически весь набор операторов, который здесь присутствует, это полный набор операторов языка. Возможно я здесь что-то забыл, но не думаю, что больше трех каких-то операторов.
На самом деле в языке можно использовать огромное количество операторов, даже больше чем в C#, но все остальные операторы сделаны в виде макросов, и являются синтаксическим сахаром, а не базовыми вещами.
&lt;/p&gt;&lt;p&gt;Естественно в языке есть вызов функций/методов/индексов, без этого никуда.
&lt;/p&gt;&lt;p&gt;Приведение типов. Приведений типов в целом два. Точнее одно из них не совсем приведение типов и называется «уточнение типов». Смысл в том, что это скорее подсказка компилятору, что вы здесь, намерены… считаете, что в этом месте должен быть такой-то тип, например, там &lt;tt&gt;int&lt;/tt&gt;.
Вы можете в любом месте программы, в выражении, в if-е, еще где-то там, поставить двоеточие,  т.е. написать выражение, двоеточие, и тип. И соответственно, компилятор попытается проверить, что там действительно получается тип int, если у него есть какие-то сомнения, он примет вашу сторону, если он не сможет вывести int, он выдаст ошибку времени компиляции.
&lt;/p&gt;&lt;p&gt;Второе приведение типов — это так называемый «ножик-оператор» → выражение, потом оператор, потом тип.
Смысл его в том, что это именно динамическая проверка типов.
Если вы пытаетесь статически к чему-то привести, например к (???)-стриму, то вам сразу, во время компиляции выдадут сообщение об ошибке, что так нельзя. Соответственно, если нужно сделать какой-то там непонятный&amp;#160;?cast, то нужно привести cначала что-то к object-у, а потом приводить к нужному типу.
&lt;/p&gt;&lt;p&gt;Смысл разделения на два оператора в том, что это дает большую надежность коду. Некоторые проверки, некоторые приведения типов в C#, являются грубо говоря затыканием ошибок, т.е. они могут маскировать ошибки.
С вот этими двумя операторами такого не получается, они более безопасны.
&lt;/p&gt;&lt;p&gt;Литералы. Всем понятно, что они должны быть числовые, строковые, литералы списков (квадратные скобочки и в них значения), литералы массивов (тоже самое, только спереди идет ключевое слово array), литералы символов.
&lt;/p&gt;&lt;p&gt;&lt;tt&gt;checked&lt;/tt&gt; — как в C#-е, позволяет задать семантику целочисленных вычислений, с переполнением или без, соответственно, генерировать исключение при переполнении или нет.
&lt;/p&gt;&lt;p&gt;Доступ к члену, понятное дело, через точку.
&lt;/p&gt;&lt;p&gt;И все. Все остальное в языке, это макросы.
При этом язык полностью воспроизводит все конструкции C#, причем с заделом. Есть в нем конструкции, которых, во-первых, нет в C#, во-вторых, многие конструкции, которые есть в C# сделаны более интересно,
поддерживают больше возможностей, и соответственно, есть возможность создавать свои собственные конструкции, с помощью универсальных макросов.  
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-17h19m53s208.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-17h19m53s208.png&quot; src=&quot;/images/thumb/5/54/Nemerle-deep-dive-2012-04-29-17h19m53s208.png/512px-Nemerle-deep-dive-2012-04-29-17h19m53s208.png&quot; width=&quot;512&quot; height=&quot;322&quot; srcset=&quot;/images/5/54/Nemerle-deep-dive-2012-04-29-17h19m53s208.png 1.5x, /images/5/54/Nemerle-deep-dive-2012-04-29-17h19m53s208.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-17h21m33s28.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-17h21m33s28.png&quot; src=&quot;/images/thumb/4/4e/Nemerle-deep-dive-2012-04-29-17h21m33s28.png/512px-Nemerle-deep-dive-2012-04-29-17h21m33s28.png&quot; width=&quot;512&quot; height=&quot;310&quot; srcset=&quot;/images/4/4e/Nemerle-deep-dive-2012-04-29-17h21m33s28.png 1.5x, /images/4/4e/Nemerle-deep-dive-2012-04-29-17h21m33s28.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Так, про это я немножно поговорил…
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-17h23m21s32.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-17h23m21s32.png&quot; src=&quot;/images/thumb/e/e5/Nemerle-deep-dive-2012-04-29-17h23m21s32.png/512px-Nemerle-deep-dive-2012-04-29-17h23m21s32.png&quot; width=&quot;512&quot; height=&quot;282&quot; srcset=&quot;/images/e/e5/Nemerle-deep-dive-2012-04-29-17h23m21s32.png 1.5x, /images/e/e5/Nemerle-deep-dive-2012-04-29-17h23m21s32.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Теперь, давайте, грубо говоря, перейдем к тому, что такое макросы, и что с их помощью можно делать.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-17h26m04s108.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-17h26m04s108.png&quot; src=&quot;/images/thumb/4/41/Nemerle-deep-dive-2012-04-29-17h26m04s108.png/512px-Nemerle-deep-dive-2012-04-29-17h26m04s108.png&quot; width=&quot;512&quot; height=&quot;207&quot; srcset=&quot;/images/4/41/Nemerle-deep-dive-2012-04-29-17h26m04s108.png 1.5x, /images/4/41/Nemerle-deep-dive-2012-04-29-17h26m04s108.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Макросы, грубо говоря, можно разделить на два части. Макросы, которые расширяют язык, позволяя ввести в языке какие-то новые конструкции, и как-то упростить свою личную жизнь, более красиво писать код.
Например, если кто-то переходил с Java на C#, обратил внимание, что есть очень удобная конструкция &lt;tt&gt;using&lt;/tt&gt;.
Собственно такая конструкция &lt;tt&gt;using&lt;/tt&gt;, она в Nemerle сделана с помощью макросов, и вы можете делать такие конструкции буквально в мгновение ока. Кроме того, макросы могут быть могут быть не синтаксическими. Макросы могут просто изменять поведение кода, или генерировать код в процессе компиляции. При этом макросы могут быть двух уровней:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; уровня выражения, в выражении макрос будет выглядеть в виде какой-то синтаксической конструкции, или похожим на вызов функции. При этом он будет все-таки не вызовом функции, а будет именно макросом, раскрываться в какой-то другой код, во время компиляции. Но все же, выглядеть он будет, как вызов функции.&lt;/li&gt;
&lt;li&gt; второй вариант — это метаатрибуты, так называемые. Синтаксически, это такие же, как в С#, атрибуты, но вместо того, чтобы превратиться в метаданные при компиляции, эти атрибуты превращаются в вызовы макросов.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;А макрос — это всего лишь функция, на том же самом языке, Nemerle, который позволяет  получить доступ у компилируемому проекту, причем, получить доступ в виде синтаксического дерева, с которым довольно удобно работать, у которого есть специальный срез для этой обработки, и собственно, как-то проанализировать этот проект, что-то в нем прочитать, что-то узнать, что-то новое сгенерировать. В принципе, он позволяет, в том числе заменять реализацию тел методов, но в основном, макросы, предназначены для генерации нового кода. Кроме того, макросы можно использовать для контроля за кодом. То есть, если у вас есть какие-то там корпоративные правила, хотя бы например, какая-то замена FxCop → можно проверять наименования, причем очень сложным образом, можно отслеживать… вплоть до порядка объявления переменных. Все что в коде есть, можно отследить с помощью макросов, и выдать диагностические сообщения, вплоть до сообщений об ошибках.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-18h17m24s204.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-18h17m24s204.png&quot; src=&quot;/images/thumb/5/55/Nemerle-deep-dive-2012-04-29-18h17m24s204.png/512px-Nemerle-deep-dive-2012-04-29-18h17m24s204.png&quot; width=&quot;512&quot; height=&quot;319&quot; srcset=&quot;/images/5/55/Nemerle-deep-dive-2012-04-29-18h17m24s204.png 1.5x, /images/5/55/Nemerle-deep-dive-2012-04-29-18h17m24s204.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-18h18m54s36.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-18h18m54s36.png&quot; src=&quot;/images/thumb/4/4d/Nemerle-deep-dive-2012-04-29-18h18m54s36.png/512px-Nemerle-deep-dive-2012-04-29-18h18m54s36.png&quot; width=&quot;512&quot; height=&quot;240&quot; srcset=&quot;/images/4/4d/Nemerle-deep-dive-2012-04-29-18h18m54s36.png 1.5x, /images/4/4d/Nemerle-deep-dive-2012-04-29-18h18m54s36.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-18h20m22s226.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-18h20m22s226.png&quot; src=&quot;/images/thumb/0/09/Nemerle-deep-dive-2012-04-29-18h20m22s226.png/512px-Nemerle-deep-dive-2012-04-29-18h20m22s226.png&quot; width=&quot;512&quot; height=&quot;260&quot; srcset=&quot;/images/0/09/Nemerle-deep-dive-2012-04-29-18h20m22s226.png 1.5x, /images/0/09/Nemerle-deep-dive-2012-04-29-18h20m22s226.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-18h23m58s241.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-18h23m58s241.png&quot; src=&quot;/images/thumb/7/76/Nemerle-deep-dive-2012-04-29-18h23m58s241.png/512px-Nemerle-deep-dive-2012-04-29-18h23m58s241.png&quot; width=&quot;512&quot; height=&quot;372&quot; srcset=&quot;/images/7/76/Nemerle-deep-dive-2012-04-29-18h23m58s241.png 1.5x, /images/7/76/Nemerle-deep-dive-2012-04-29-18h23m58s241.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Это я уже буду на другом докладе рассказывать…
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-18h25m08s146.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-18h25m08s146.png&quot; src=&quot;/images/thumb/b/bf/Nemerle-deep-dive-2012-04-29-18h25m08s146.png/512px-Nemerle-deep-dive-2012-04-29-18h25m08s146.png&quot; width=&quot;512&quot; height=&quot;273&quot; srcset=&quot;/images/b/bf/Nemerle-deep-dive-2012-04-29-18h25m08s146.png 1.5x, /images/b/bf/Nemerle-deep-dive-2012-04-29-18h25m08s146.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Сейчас мы перейдем к тому, что соотвественно, что макросы могут.
&lt;/p&gt;&lt;p&gt;Как я уже говорил, макросы можно разделить на две большие группы: прикладные библиотеки, DSL-и и фреймворки, и на расширения языка.
&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-29-18h27m55s122.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-29-18h27m55s122.png&quot; src=&quot;/images/thumb/4/46/Nemerle-deep-dive-2012-04-29-18h27m55s122.png/512px-Nemerle-deep-dive-2012-04-29-18h27m55s122.png&quot; width=&quot;512&quot; height=&quot;305&quot; srcset=&quot;/images/4/46/Nemerle-deep-dive-2012-04-29-18h27m55s122.png 1.5x, /images/4/46/Nemerle-deep-dive-2012-04-29-18h27m55s122.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Вот такие прикладные библиотеки уже сделаны сейчас, идут в поставке компилятора, и их можно использовать.
Поднимите руки, те, кто программировал на F#.
Понятно, двое человек.
&lt;/p&gt;&lt;p&gt;Тогда я в двух словах расскажу. В F#-е есть такая замечательная, на самом деле, возможность, так называемых
computation expressions. Они позволяют, творить в языке небольшую магию.
Есть в функциональном языке, очень непонятная для простых смертных вещь, «монада».
Вещь трудна для изучения, понимания, и даже на самом деле, использования.
Но позволяет делать иногда очень красивые вещи.
Единственная проблема, то, что монады — это паттерн функционального программирования,
и в истинно функциональном языке они встраиваются непосредственно в язык.
Например, Haskell имеет прямую поддержку для монад. И там, на монадах сделано очень многое, ведь монады в Haskelle, это заодно и средство борьбы с их ленивым выполнением.
В Haskell все вычисления откладываются до сих пор, пока они физически не потребуются в программе.
Монада — это средство связать несколько вычислений в цепочку, и тем самым, добиться оперативности.
Кроме того, монады, это красивое средство скрывать поток связанных вычислений, и поэтому на их базе можно создавать очень красивые вещи. Например, асинхронные вычисления «как будто последовательные», это какие-то генераторы.
Ну все наверное знают, в C# есть такая штука, итератор называется. Ключевое слово yeild-return  в каком-то методе,
превращается в конечный автомат, который генерирует последовательность, и позволяет несколько раз выходить из функций, как бы виртуально.
&lt;/p&gt;&lt;p&gt;Вот, computation expression позволяет делать все то же самое, но на уровне буквально одного-двух выражений.
Т.е. вы можете в одном методе, объявлять 200 таких вот генераторов, они вам будут генерировать отдельные последовательности. На монадах можно делать очень многое, а computation expressions это такой сахар над ними, позволяющий создать так называемые builderы, для реализации самых разных паттернов использования.
&lt;/p&gt;&lt;p&gt;В C# эта штука захардкожена физически, в Nemerle она была реализована в качестве макросов, причем… это было довольно-таки смешно → зашел парень на форум, «что у вас есть?».
&lt;/p&gt;&lt;p&gt;Мы говорим: — «макросы». А он говорит, «я тут изучил F#, там есть computation expressions».
А мы — «Макросы! Да, это не одно и то же, но на этом можно сделать второе». Ладно, говорит он, попробую.
&lt;/p&gt;&lt;p&gt;Обычно ведь как — «Все встают и уходят», в смысле — «Поспорили и разошлись».
Но парень оказался упорный, буквально через два дня, он пришел, с такой вот обалденной радостью, и говорит, что вот там, у меня, получилось и даже очень нравится, потому, что это расширяемо, в отличие от F#, где это забито в язык, раз и навсегда. Естественно, с первого раза у него не все здорово получилось, помогли ребята, у которых было побольше опыта в создании макросов, и через неделю, буквально, у нас были computation expression,
которые теперь можно использовать в своих программах для реализации сложных workflow, потому что computation expression можно даже переключать между потоками.
У вас вычисление идет например, в одном потоке, предположим в бекграунд-потоке, и вас надо переключится и что-то вывести на экран.  На экран, во многих библиотеках можно выводить исключительно из GUI-потока. Вы конечно можете использовать разные дурные средства, которые позволяют, там, передать сообщение синхронно, еще что-то там.
Но в данном случае, просто можно написать небольшой вызов, так называемый «переключатель контекста»,
и дальнейшее выполнение пойдет в рамках GUI-потока. Соответственно, точно также можно переключится обратно,
и продолжить асинхронные вычисления.
&lt;/p&gt;&lt;p&gt;Еще больше интересно то, что эти асинхронные вычисления можно связывать.
Одно это computation expression можно связать с другим, другое
еще с чем-то и создать граф вычислений, причем они будут друг от друга зависеть, и можно будет не боятся, что что-то там произойдет, вся связь идет, грубо говоря, на уровне вызовов между функциями, … как бы без залезания внутрь объяснить…
В общем, это позволяет дожидаться одним вычислением других, продолжать вычисление в других потоках и так далее.
Очень широкие возможности по асинхронному выполнению, что может быть использовано как для распараллеливания  вычислений, так и для создания каких-то workflow.
&lt;/p&gt;&lt;p&gt;К примеру, вот у вас есть сайт, на котором нужно реализовать какой-то wizard.
Идеалогия wizarda, когда человек на каждой страничке по кнопочке продвигается вперед, но может отменить, и вернуться назад.
Вот computation expression, если в продукт попала синхронизация состояний (?? 23:10),  
что в общем-то несложно, позволяет синхронизовать состояние такого workflow, сохранять, соответственно откатываться вперед  и назад, взяв объект, который находился в состоянии до перехода.
&lt;/p&gt;&lt;p&gt;Также, XML-литерал, это очень простой макросик, который был написан буквально за два дня.
И он в язык вносит возможность написания  XML-литералов прямо внутри кода.
Причем эти литералы, они генерируют во время компиляции X-элемент,
т.е. это не работа с текстом, не текстовая замена, это именно живые XML-литералы, если кто-то использовал Visual Basic или SCALA, он собственно, может себе представить, что это такое. Кроме того, в XML-литералах поддерживаются так называемые сплайсы, куда можно передать какие-то выражения, от текстов, до опять таки, XML-элементов (X-элемент, X-атрибут, X-name, и так далее).
И они собственно будут проверены во время компиляции, что они подходят для этого места, и соотвественно,
корректность XML.
При этом, разумеется, совершенно невозможно туда запихнуть текст, который потом развернется в какую-нибудь бяку типа яваскрипта, или испортит что-то где-то.
Кроме того, в этих же XML-элементах сделаны такие элементы, как циклы, которые позволяют генерировать наборы элементов, и условные включения элементов, можно написать такой маленький when, и если условие истинно, то элемент появится, в зале C я потом все это продемонстрирую.
&lt;/p&gt;&lt;p&gt;Самый пожалуй мощный на сегодня макрос, это Nemerle.PEG, макрос-генератор парсеров в идеалогии PEG.
PEG — это относительно новая, хотя на самом деле забытая старая технология создания парсеров без (???) 25:40,
что делает парсер очень расширяемым, очень гибким.
&lt;/p&gt;&lt;p&gt;Кроме того, наш парсер поддерживает неограниченность (???) 25:45, и очень большое количество оптимизаций, что позволяет, с писать одной стороны пользовательский парсер с очень сложным языком, на самом деле я не знаю компьютерных языков, которых нельзя было им распарсить, только если они очень сложно контекстно зависимы, и то,
контекстно зависимые языки, такие как C++, можно спокойно парсить, причем довольно просто.
При этом он показывает весьма высокую скорость, соответственно, наши тесты показывают 3-4 мегабайта в секунду,
… т.е. мегабайтные файлы редактируются, без всяких там оптимизаций и так далее.
&lt;/p&gt;&lt;p&gt;Очень мощный парсер, на самом деле на нем тот же XML держится, XML-литералы сделаны на (???) 26:40 … фактически.
&lt;/p&gt;&lt;p&gt;Один фреймворк, на самом деле скорее, не рабочий такой фреймворк, а, скорее экспериментальный (указывает на Nemerle.WUI.Reactive), только проба пера, это &lt;tt&gt;Nemerle.WUI.Reactive&lt;/tt&gt;, который позволяет создавать динамические web-приложения, прямо на статически типизированные языки, я это тоже, продемонстрирую в зале C.
&lt;/p&gt;&lt;p&gt;Можно в принципе показать, действительно красиво, давайте отвлечемся на секундочку, я просто запущу и покажу результат:
&lt;/p&gt;&lt;p&gt;(демонстрация на 41:20)
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-13h56m24s63.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-13h56m24s63.png&quot; src=&quot;/images/thumb/3/33/Nemerle-deep-dive-2012-04-30-13h56m24s63.png/512px-Nemerle-deep-dive-2012-04-30-13h56m24s63.png&quot; width=&quot;512&quot; height=&quot;323&quot; srcset=&quot;/images/thumb/3/33/Nemerle-deep-dive-2012-04-30-13h56m24s63.png/768px-Nemerle-deep-dive-2012-04-30-13h56m24s63.png 1.5x, /images/3/33/Nemerle-deep-dive-2012-04-30-13h56m24s63.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Вот, самый простой примерчик, все строится на идеологии…, есть такой паттерн
«Model-View-View-Model».
Идея его в чем заключается: что вы работаете не с данными приложения на странице, а вы как бы создаете такую сущность, как «View-Model», как модель для предоставления контента. Эта модель отражает те данные, которые у вас находятся в графическом интерфейсе, и которые выводятся на экран.
Т.е. ничего лишнего. Когда вы на сервере такую модель выполняете, вы просто пихаете туда данные из базы данных, и вызываете метод сериализации в JSON.
JSON передаете на клиента, он JSON съедает и заполняет внутреннюю Javascriptовую структуру. Эта внутренняя JavaScriptовая структура генерируется по вот этой модели.
&lt;/p&gt;&lt;p&gt;Это класс с привычным синтаксисом описания тех же типов по другому, вот в данном случае есть «FirstName», «LastName», «FullName», и «FullName» это на самом деле конкатенация строк.
В Nemerle есть такой макрос «бакс» ($), посмотрите, во что он разворачивается:
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-14h08m44s89.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-14h08m44s89.png&quot; src=&quot;/images/thumb/6/6b/Nemerle-deep-dive-2012-04-30-14h08m44s89.png/512px-Nemerle-deep-dive-2012-04-30-14h08m44s89.png&quot; width=&quot;512&quot; height=&quot;125&quot; srcset=&quot;/images/6/6b/Nemerle-deep-dive-2012-04-30-14h08m44s89.png 1.5x, /images/6/6b/Nemerle-deep-dive-2012-04-30-14h08m44s89.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Примерно такой же код генерирует C#, когда вы плюсом пользуетесь.
&lt;/p&gt;&lt;p&gt;Этот макрос позволяет в строку вставлять вот такие включения.
В итоге, у нас при вычислении этого свойства получится строка, в которой у нас сначала будет «FirstName»,
потом будет «LastName», и восклицательный знак после этого.
Вот такая модель. Все это было бы наверно просто и понятно, если бы это работало в каких-нибудь WinForms-приложениях, еще где-то, но на самом деле, это используется в веб, вот это вот модель, и генерируеnся в том числе яваскрипт-код, который так называемый React-Ins поддерживает.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-14h15m59s65.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-14h15m59s65.png&quot; src=&quot;/images/thumb/9/9a/Nemerle-deep-dive-2012-04-30-14h15m59s65.png/512px-Nemerle-deep-dive-2012-04-30-14h15m59s65.png&quot; width=&quot;512&quot; height=&quot;355&quot; srcset=&quot;/images/9/9a/Nemerle-deep-dive-2012-04-30-14h15m59s65.png 1.5x, /images/9/9a/Nemerle-deep-dive-2012-04-30-14h15m59s65.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Вот эта вот вьюшка (HelloWorldView), она работает с вот этой вот конкретной моделью, и в ней нет практически никакого кода, только файл.
Если вы обратите внимание, то вот он код, какое-то поле текстовое, и у него есть такой-то тег, «data-bind»,
в котором «value», т.е. значение этого поля, связывается со свойством «FirstName».
Второе поле связывается со свойством «LastName». А потом просто «span», т.е. грубо говоря просто текстовый блок,
его текст связывается со значением «viewModel.FullName», которое, как мы видели, вычисляемое свойство, которое сконкатенирует значения двух других свойств.
&lt;/p&gt;&lt;p&gt;Теперь запустим все это дело.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-14h24m45s194.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-14h24m45s194.png&quot; src=&quot;/images/thumb/1/16/Nemerle-deep-dive-2012-04-30-14h24m45s194.png/512px-Nemerle-deep-dive-2012-04-30-14h24m45s194.png&quot; width=&quot;512&quot; height=&quot;195&quot; srcset=&quot;/images/1/16/Nemerle-deep-dive-2012-04-30-14h24m45s194.png 1.5x, /images/1/16/Nemerle-deep-dive-2012-04-30-14h24m45s194.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Мы получим такой вот, интерактивный интерфейс:
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-14h28m40s231.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-14h28m40s231.png&quot; src=&quot;/images/thumb/7/70/Nemerle-deep-dive-2012-04-30-14h28m40s231.png/512px-Nemerle-deep-dive-2012-04-30-14h28m40s231.png&quot; width=&quot;512&quot; height=&quot;198&quot; srcset=&quot;/images/7/70/Nemerle-deep-dive-2012-04-30-14h28m40s231.png 1.5x, /images/7/70/Nemerle-deep-dive-2012-04-30-14h28m40s231.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Который на самом деле работает на JavaScript, сейчас я вам его покажу:
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-14h30m15s2.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-14h30m15s2.png&quot; src=&quot;/images/thumb/3/33/Nemerle-deep-dive-2012-04-30-14h30m15s2.png/512px-Nemerle-deep-dive-2012-04-30-14h30m15s2.png&quot; width=&quot;512&quot; height=&quot;349&quot; srcset=&quot;/images/thumb/3/33/Nemerle-deep-dive-2012-04-30-14h30m15s2.png/768px-Nemerle-deep-dive-2012-04-30-14h30m15s2.png 1.5x, /images/3/33/Nemerle-deep-dive-2012-04-30-14h30m15s2.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;А Javascript этот компилируется макросом, во время компиляции:
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-14h31m28s144.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-14h31m28s144.png&quot; src=&quot;/images/thumb/2/24/Nemerle-deep-dive-2012-04-30-14h31m28s144.png/512px-Nemerle-deep-dive-2012-04-30-14h31m28s144.png&quot; width=&quot;512&quot; height=&quot;334&quot; srcset=&quot;/images/thumb/2/24/Nemerle-deep-dive-2012-04-30-14h31m28s144.png/768px-Nemerle-deep-dive-2012-04-30-14h31m28s144.png 1.5x, /images/2/24/Nemerle-deep-dive-2012-04-30-14h31m28s144.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Естественно, перед этим срабатывают все проверки типов,  у нас в IDE работает… сейчас еще раз покажу,…
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-14h34m31s164.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-14h34m31s164.png&quot; src=&quot;/images/thumb/6/69/Nemerle-deep-dive-2012-04-30-14h34m31s164.png/512px-Nemerle-deep-dive-2012-04-30-14h34m31s164.png&quot; width=&quot;512&quot; height=&quot;348&quot; srcset=&quot;/images/6/69/Nemerle-deep-dive-2012-04-30-14h34m31s164.png 1.5x, /images/6/69/Nemerle-deep-dive-2012-04-30-14h34m31s164.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;У нас в IDE работает, видите, весь интерфейс, работает &lt;i&gt;complete code&lt;/i&gt;, нотификация,
стандартные фишки intellisense:
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-14h35m51s224.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-14h35m51s224.png&quot; src=&quot;/images/thumb/5/51/Nemerle-deep-dive-2012-04-30-14h35m51s224.png/512px-Nemerle-deep-dive-2012-04-30-14h35m51s224.png&quot; width=&quot;512&quot; height=&quot;302&quot; srcset=&quot;/images/5/51/Nemerle-deep-dive-2012-04-30-14h35m51s224.png 1.5x, /images/5/51/Nemerle-deep-dive-2012-04-30-14h35m51s224.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Мы можем писать приложение, буквально без программирования,
вернее какое-то программирование потребуется, но все это программирование будет лежать внутри свойств
и методов модели. И эта модель чудесным образом превращается в реактивную модель.
&lt;/p&gt;&lt;p&gt;Т.е. если мы например, вернемся сейчас в броузер, то вы можете увидеть, как FirstName превратился
не просто в какое-то свойство, а превратился на самом деле в некоторый объект «observable» при каких-то начальных значениях.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-14h39m25s135.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-14h39m25s135.png&quot; src=&quot;/images/thumb/4/49/Nemerle-deep-dive-2012-04-30-14h39m25s135.png/512px-Nemerle-deep-dive-2012-04-30-14h39m25s135.png&quot; width=&quot;512&quot; height=&quot;290&quot; srcset=&quot;/images/4/49/Nemerle-deep-dive-2012-04-30-14h39m25s135.png 1.5x, /images/4/49/Nemerle-deep-dive-2012-04-30-14h39m25s135.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Используется javascriptовый фреймворк Knockout, где вот эти вот «observable» рассылают автоматически уведомления о своем изменении, т.е. когда например, вводится binding с полем, то изменение поля, автоматически изменяет значение вот этого свойства.
&lt;/p&gt;&lt;p&gt;Ну и как я сказал, это не готовый фреймворк, а только такой демонстрационный зачаток, но в принципе, планируется в дальнейшем развивать, если найдутся люди готовые этим заняться, кому это будет интересно,  — я этим фреймворком не занимаюсь, я это сделал как демонстрацию.
Дальнейшее развитие — автоматическая сериализация и передача JSONа, автоматическая валидация, то, что в обычных сложных фреймворках делается огромным объемом кода.
Вот то, что я вам демонстрирую, было создано буквально за дня три.
Чтобы это довести до ума, программисту, который хорошо знает макросы, понадобится где-то месяц.
Зато в конце этого месяца человек будет иметь действительно мощный фреймворк, который практически ни от чего не зависит, кроме веб-сервера.
&lt;/p&gt;&lt;p&gt;Вернемся к докладу.
&lt;/p&gt;&lt;p&gt;Кроме того есть еще библиотека, более традиционная, «Nemerle on Rails», где-то аналог «Ruby on Rails», который собственно эмулирует его работу. Там есть так называемая миграция баз данных, поддержка какого-то движка HTMLя, не помню…
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-14h52m33s90.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-14h52m33s90.png&quot; src=&quot;/images/thumb/0/06/Nemerle-deep-dive-2012-04-30-14h52m33s90.png/512px-Nemerle-deep-dive-2012-04-30-14h52m33s90.png&quot; width=&quot;512&quot; height=&quot;330&quot; srcset=&quot;/images/0/06/Nemerle-deep-dive-2012-04-30-14h52m33s90.png 1.5x, /images/0/06/Nemerle-deep-dive-2012-04-30-14h52m33s90.png 2x&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Кроме того, есть множество мелких макросов.
«$-строки» я вам уже показывал. Это все макросы, которые входят в стандартную библиотеку.
Например, макрос «Record» позволяет автоматически сгенерировать конструкторы, для всех полей классов.
Некоторые поля можно просто проигнорировать, туда можно дать какой-то другой атрибут, и эти поля будут исключены.
Все остальные попадут в список полей конструктора → наверное все уже устали писать каждый раз класс-конструктор, который запихивал все значения параметров в поля, так вот, макрос «Record» одним написанием атрибута над классами, решает эту проблему.
&lt;/p&gt;&lt;p&gt;Есть макросы, которые позволяют автоматизировать разные паттерны проектирования, т.е. вместо того, чтобы выписывать этот паттерн под копирку, вы можете применить атрибут, класса, метода или еще чего-то и реализовать
такие паттерны как «абстрактная фабрика», «aggregate», «proxy», «sigleton». И естественно, вы можете создавать какие-то свои макросы, которые решают какие-то ваши прикладные задачи, в соотвествии с какими-то паттернами.
&lt;/p&gt;&lt;p&gt;Макрос «late» — это нечто похожее на «dynamic» из четвертого сишарпа, но на самом деле он создан задолго до появления «dynamic-ов» в C#, и позволяющий без синтаксического оверхеда динамически вызывать методы.
Т.е. пишите макрос &lt;tt&gt;late&lt;/tt&gt;, далее, какой-то динамически типизированный код, далее этот код компилируется только синтаксически, и все вызовы происходят уже динамически.
&lt;/p&gt;&lt;p&gt;Применение макроса «Memoize» к методу позволяет «меморизировать» его состояние для конкретных значений параметров, что позволяет иногда очень сильно повысить производительность, и упростить код.
&lt;/p&gt;&lt;p&gt;На самом деле макросов намного больше.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Nemerle-deep-dive-2012-04-30-15h11m18s83.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Nemerle-deep-dive-2012-04-30-15h11m18s83.png&quot; src=&quot;/images/6/66/Nemerle-deep-dive-2012-04-30-15h11m18s83.png&quot; width=&quot;512&quot; height=&quot;338&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Есть такие макросы, как автоматическая генерация структурного сравнения, «CompareTo» пишется автоматически, просто перебором полей. Естественно, он не очень умный, он за вас не сможет узнать, есть ли какие-то поля,
которые не надо применять в сравнении, но тем не менее, если вам нужна такая быстрая и тупая релизация сравнений по всем полям, то вы его применяете и буквально сразу получаете реализацию без таких-вот…
&lt;/p&gt;&lt;p&gt;То же самое с хеш-кодом, есть макрос для регэкспов, есть так называемый «list comprehension»,
типа очень маленького компактного LINQ-а, но со специализированным синтаксисом для списков.
&lt;/p&gt;&lt;p&gt;Макросов в библиотеке много, перечислить их в докладе невозможно, главное — понять, что это не железно прибитые к языку вещи, а расширяемые конструкции, которые может делать любой из вас, если потратить несколько месяцев на изучение системы макросов.
&lt;/p&gt;&lt;p&gt;Сам язык понятен C# программистам, ну может для начала потратят пару дней и изучат прочтением пары статей.
&lt;/p&gt;&lt;p&gt;Для более глубокого изучения нужен опыт — ведь никто не научился программировать по книжке или статье, только реальное программирование может этому научить.  
Но зато, потратив месяц-два на изучение, производительность труда вырастает очень серьезно.
Можно просто решать какие-нибудь задачи, которые раньше решались очень тяжело.
&lt;/p&gt;&lt;p&gt;Я думаю, что мое время уже истекло, поэтому, спасибо за внимание, еще скажу, что через час, в зале C будет расширенная версия моего доклада, где можно будет задавать вопросы, посмотреть на код — я будут показывать все то же самое в виде кода, и соответственно в конце моего доклада будет еще отдельный большой, ну нормальный такой доклад, по &lt;tt&gt;Nemerle.PEG&lt;/tt&gt;, вот этому самому генератору парсеров, который на самом деле уникальный, аналогов ему на самом деле нет.
Cпасибо за внимание!
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Ответы на вопросы начались с 38:35, и там тоже было интересно.
В частности, по результам этого обсуждения стартовал эпический &lt;a rel=&quot;nofollow&quot; class=&quot;external text&quot; href=&quot;http://www.it4business.ru/lib/2499/&quot;&gt;тред в духе «Менеджеры против гиков»&lt;/a&gt; («Тчортовы гики, вы рискуете чужим баблом!»).
&lt;/p&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011)/%D0%A1%D1%82%D0%B5%D0%BD%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0</id>
		<title>Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011)/Стенограмма</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011)/%D0%A1%D1%82%D0%B5%D0%BD%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0"/>
				<updated>2012-05-07T21:20:19Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: переименовал Участник:StasFomin/Language Oriented Programming в Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011)/Стенограмма&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=1&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0001-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Сегодня у меня первый доклад, рассказывать я будут про языковый тему (???) в программировании.
&lt;/p&gt;&lt;p&gt;Меня зовут Максим Мазин, я работаю в компании JetBrains инженером в проекте YouTrack.
YouTrack — это багтрекер, и самое увлекательное в YouTrack то, что он написан с помощью
Language Record программирования.
Что это такое? Это такая концепция, которая полагает, что при написании программ, первым делом вы создаете
специальный предметно-ориентированный язык, а затем, на этом предметно-ориентированном языке, вы начинаете уже писать собственно код программы.
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=2&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0002-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Для чего это? Какой от этого прок, и что мешает делать так всем — об этом я и буду сегодня рассказывать.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=3&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0003-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Смотрите — вот существуют универсальные языки программирования. При программировании при помощи языка Java,
PHP или C# возникает проблема — у вас при программировании возникает огромное количество bullet plate (??? 01:15) -кода, т.е. такого кода, который будет повторяться из раза в раз, но не потому, что он делает какую-то содержательную работу, а просто для того, чтобы компилятор мог этот код скомпилировать.
Писать скобочки круглые, точки, … ну и так далее.
&lt;/p&gt;&lt;p&gt;В случае, когда вы пользуетесь каким-то фреймворком, то у вас появляется еще дополнительная боль от фреймворка.
Вам нужно инициализировать библиотеки, открывать окна, устанавливать какие-то свойства, в зависимости от того, что у вас за библиотека.
В принципе, во многих современных языках программирования, ну например, С#, существует практика добавлять в язык предметно-ориентированные конструкции.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=4&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0004-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;В языке Java существует конструкция &lt;tt&gt;synchronized&lt;/tt&gt;, которая не является какой-то конструкцией общего назначения, является специальной, предметно-ориентированной конструкцией, предназначенной для параллельного программирования.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=5&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0005-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Точно так же, в языке C++, существует перегрузка операторов. Вот, сравните.
В нормальной ситуации, если бы у вас не было конструкции &lt;tt&gt;synchronized&lt;/tt&gt; вам бы пришлось написать вот столько вот кода.
Блок «finally» и блок получения блокировки, это все вот bullet-plate код, который не интересно писать постоянно.
Вместо этого существует DSL-ная конструкция «synchronized», которая позволяет захватить блокировку и не беспокоится о том, что ее надо отпустить.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=6&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0006-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Точно также в языке C++ есть механизм перегрузки операторов, который позволяет вам сделать вид, как будто у вас определены специальные операции, например, над комплексными числами.
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=7&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0007-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Это все очень хорошо, но как вы знаете, что в языке Java, начиная с пятой версии, появились read-write локи,
и это означает для нас, что нам снова нужно писать код вот такого стиля, как показано слева:
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=5&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0005-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Т.е. надо блокировки захватывать, блокировки отпускать, … это все полностью нивелирует удобства.
&lt;/p&gt;&lt;p&gt;Если бы можно было писать… самостоятельно расширять языки, нам бы удалось решить разные проблемы.
Например, те конструкции, языковые расширения, которые есть, в языке Java, они позволяют вам решать определенный набор задач. Но мы в жизни сталкиваемся и с другими задачами. Например, если мы пишем веб-аппликейшн, то нам нужно
работать с базами данных, писать веб-уровень, и так далее. Для этого DSLей нет, есть только фреймворк.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=7&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0007-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Точно также, если мы используем какую-нибудь концепцию вроде dependency injection, то нам тоже нужно для этого использовать фреймворки, и хуже того — использовать смеси языков,  писать одновременно на Java, на XMLе, и все это не очень весело.
И главное — нам ничего с этим не поделать, потому что создание языкового расширения грозит нам разными рисками.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=8&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0008-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Какие проблемы возникают при создании DSL и почему бы при возникновении какой-нибудь потребности не бросаться сразу создавать DSL?
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=9&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0009-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Самая главная проблема, с которой все сталкиваются все люди, которые пытаются заниматься созданием DSLей,
это совместимость языковых расширений.
Совместимость имеется в виду возможность использовать одновременно два языковых расширения, которые созданы независимыми разработчиками.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=10&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0010-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Вот например. Если у вас есть некоторые библиотеки и фреймворки, в нашем случае для Java, например
Hibernate, Spring или Joda Time, то
все они между собой совместимы, принципиально, на уровне компиляции.
Т.е. вы можете одновременно использовать в вашем проекте компоненты и Hibernate и Spring, и ничего вам не может помешать.
Но если у вас есть языковые надстройки, в виде каких-то макросов,  или еще каких-нибудь техник, которые добавляют вам предметно-ориентированные конструкции в язык Java, то и эти надстройки созданы независимым образом, то все время существует риск, что эти надстройки будут с друг другом конфликтовать.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=11&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0011-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=12&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0012-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Вот например, такой очень простой пример.
Допустим у нас откуда-то появилось расширение, которое делает что-то полезное, и в частности поддерживает интерполяцию выражений в строках.
Можно написать такую конструкцию, и вместо «resultCount» будет подставлено значение этого выражения.
&lt;/p&gt;&lt;p&gt;В тоже самое время, в друг к нам приходит другое языковое расширение, которое позволяет делать что-то полезное и в частности тоже делает интерполяцию строк. В Java же нет интерполяции строк, поэтому достаточно ожидаемо, что разные люди будут ее релизовывать в разных языковых расширениях.
И допустим, синтаксис слегка отличается. Тогда при совместном использовании языковых расширений A и B, у вас мгновенно возникает неустранимая неоднозначность, как следует интерпретировать вот этот вот buzz.
&lt;/p&gt;&lt;p&gt;Данный пример он очень простой, но по факту, все, кто создает DSL на основе текстовой информации, так или иначе сталкиваются с проблемой, у них возможно нет уверенности в том, что расширения не будут противоречивы.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=13&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0013-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Другая проблема, которая мешает нам создавать DSLи. Допустим тем не менее, вопреки сложностями и проблемам с совместимостью разных расширений вы принимаете решение написать DSL.
Пишите какой-нибудь препроцессор, натравливаете этот препроцессор на вашу программу
вашими DSLными конструкциями, она компилирует и выдает какой-то код, байт-код например,
или какой-то исполняемый код.
Это все очень хорошо, но в наше время никто не пишет код, не используя IDE.
Так не делают просто, потому что без использования IDE продуктивность разработчика драматически снижается.
Поэтому в большинстве случаев, когда вы создадите такой DSL, будут ситуации, когда ваши разработчики, ваши коллеги,
предпочтут использовать просто язык Java в Idea, просто язык C# вместе с ReSharperом, нежели брать ваше поделие, и что-то с помощью вашего поделия писать, потому что нет поддержки IDE.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=14&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0014-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Под поддержкой IDE понимается все возможности, которые современные IDE оказывают разработчику. Т.е. это подсветка синтаксиса естественно, подсветка ошибок до компиляции, рефакторинг, интеграция с Version Control-ами, все остальное.
&lt;/p&gt;&lt;p&gt;И да, можно отметить, что само по себе создание языка
это решенная математическая задача.
Если у вас есть пример для представления синтаксиса, вы сможете создать компилятор.
Но она, тем не менее, трудоемкая, даже если вы используете компилятор компиляторов.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=15&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0015-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;И если вы погружаетесь в языково-ориентированное программирование очень глубоко, т.е. вы начинаете строить разные расширения, то у вас проблема совместимости выходит на новый уровень. Т.е. у вас не только совместимость на уровне грамматики, но также например, на уровне системы типов.
Т.е. если у вас есть два независимых расширения, то нужно, чтобы системы типов этих двух расширений, нормально отрабатывали и нормально приводились друг к другу.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=16&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0016-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Существуют очень много разных попыток сделать это, поддержать DSL в том или ином виде, тема очень горячая, тут наверное еще можно добавить Nemerle, и может быть еще OCaml, сейчас есть очень много разных средств, чтобы создавать DSLи.
В рамках Eclipsa существует XText-фреймворк, который позволяет написать грамматику и получить что-то вроде DSLя c поддержкой IDE.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=17&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0017-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;У всех у них есть проблемы. Главная проблема вытекает из того, что они ориентированы на текстовые грамматики.
А раз они ориентированы на текстовые грамматики, то у них нет никаких шансов избежать проблемы совместимости конструкций.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=18&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0018-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Но к счастью, в нашей компании JetBrains, была создана среда MPS.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=19&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0019-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;MPS означает meta-programming system, в основном предназначена для создания и расширения языков, причем такого расширения, что сразу после его создания появлялась поддержка IDE.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=20&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0020-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Я уже много раз сказал, что текстовые грамматики неизбежно приводят к проблемам. Поэтому естественным решением является работа напрямую с AST → абстрактным синтаксическим деревом, и заставлять программиста прямо, напрямую создавать абстрактное синтаксическое дерево.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=21&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0021-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Попытки такие ранее предпринимались, и как правило такие попытки сводятся к редактированию диаграмм.
Рисуется диаграмма, в некотором смысле… у меня ребенок программирует на свойствах в большей степени, вы рисуете диаграммы, у вас получаются картинки, далее эти картинки собираются, получается код.
&lt;/p&gt;&lt;p&gt;Есть проблема — рисовать эти картинки неудобно — мышкой хватать, таскать, неудобно.
У нас, у программистов, есть привычка писать код вручную.
&lt;/p&gt;&lt;p&gt;Поэтому в MPSе реализована концепция проекционных редакторов.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=22&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0022-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;О чем речь? Вот у вас есть абстрактное синтаксическое дерево. Т.е. это то представление программы, которое получается, в любом случае получается, когда парсер распарсил программу.
В то же время, у вас есть его проекция, во что-то вроде текста.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=23&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0023-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Для каждого узла этого синтаксического дерева есть соответствующая ему ячейка.
Те из вас, кто знакомы с TeXом, должны примерно представлять, примерно похожие концепции.
Точно также, для каждого элемента у вас есть ячейка, ячейки объединяются в еще более крупные ячейки и так далее.
&lt;/p&gt;&lt;p&gt;При этом воздействие на эти ячейки, когда вы пишете в эти ячейки, или каким-то образом на них воздействуете, то сразу же, мгновенно влияет на эту деревяшку.
При этом наша цель, как разработчиков MPS, сделать так, чтобы вы вообще не чувствовали, что вы работаете не с текстом, а с напрямую с деревяшкой. Здесь конечно проблема, но те из вас, кто пользуются IDEA, должны понимать, что когда вы редактируете текст в IDEA, Eclipse или еще где-то, вы тоже не редактируете текст — вы тайпаете что-то, что поглощается IDEA, и она это во что-то превращает.
В случае Eclipse это в большей степени редактирование текста, в случае IDEA — это еще меньше редактирования текста.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=24&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0024-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;У такого проекционного редактора есть положительные стороны, и есть отрицательные стороны.
Положительные стороны понятны. У нас нет никаких текстовых грамматик, никакого текста, никаких проблем текстовых грамматик, никаких конфликтов, все совместимо, все очень хорошо.
&lt;/p&gt;&lt;p&gt;Отрицательная сторона, состоит в том, что все-таки есть некоторое отличие от редактирования текста. В тоже самое время, (???) проблема. Дело в том, что привыкание… по нашему опыту, люди, которые начинают работать с MPSом, они привыкают к стилю программирования внутри MPSа, примерно в течении двух недель.
Т.е. в течении этих двух недель они могут выдавать какую-то положительную обратную связь, о том, что им неудобно, непривычно, чем-то отличается от программирования в текстовом редакторе.
Через две недели они привыкают и начинают работать с той же скоростью, как они работали ранее.
Я надеюсь, что если вы попробуете скачать, и начнете пользоваться, то мы получим больший feedback, и мы сможем сделать проекционный редактор еще более похожим на текстовый редактор.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=25&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0025-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Идея такая. При создании языков вы выписываете мета-модель языков, его абстрактный синтаксис, задаете систему типов, описываете конкретный синтаксис, и автоматически получаете на выходе язык, вместе с компилятором, плюс MPS-тест для работы с кодом на этом языке.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=26&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0026-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Внутри MPSа, вместе с MPSом поставляется ряд готовых расширений,
поскольку мы проекты пишем в конце-концов на Java, т.е. мы все генерим в джаву,
то у нас стек языков который есть предназначен в конце-концов для джавы.
&lt;/p&gt;&lt;p&gt;Вместе с MPSом, внутри него, поставляются разные языковые расширения, для работы с замыканиями, с коллекциями… и так далее. И некоторое количество языков для работы с XML, тупо для работы. Т.е. вы можете вводить XML, и что самое главное — генерировать XML из своего кода.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=27&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0027-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Ну и еще есть некоторое количество языков, которые предназначены для создания языков.
MPS в плане создания языков вполне честно (??? 16:20)
&lt;/p&gt;&lt;p&gt;Вместо демонстрации — выглядит как-то так ↑.
&lt;/p&gt;&lt;p&gt;Я показывают не со своего компьютера, поэтому все, кого интересует демонстрация, приглашаю на стенд в коридоре.
Тут посмотрите, как просто взять и заDSLлить поддержку языковой конструкции.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=29&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0029-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Фактически, это все, что я хотел рассказать, осталось несколько важных вещей.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=30&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0030-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;MSP подходит не только для создания языковых расширений, т.е. не только в Java можно добавить конструкций, которых в них не хватает, но также вы можете создавать какие-то собственные DSLи.
&lt;/p&gt;&lt;p&gt;Вот например, Мартин Фаулер создал язык для описания своей финансовой отчетности.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=31&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0031-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Кроме того, с помощью MPSа мы написали YouTrack, такой большой багтрекер — большой, в смысле с большим количеством кода (сгеренированного). Но мой предыдущий опыт разработки подсказывает мне, что код содержательный,
который мы пишем и редактируем, этого кода достаточно мало.
Опять таки интересующимся, мы на выходе можем показать, как выглядит код в редакторе, сколько там таблиц.
Кода достаточно мало, из-за того, что уровень абстракции поднят достаточно высоко.
Для разработки YouTrack был создан набор языков, часть этих языков открыта, а часть — закрыта.
Мы их пока не отдаем, потому что они не достигли пока продажного качества.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=32&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0032-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Вот, приложение настоящее, живое.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=33&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0033-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;У MPSа есть положительное свойство. Он «Apache 2.0»-лицензированный, абсолюно бесплатный, даже для коммерческого использования.
&lt;/p&gt;
&lt;div class=&quot;center&quot;&gt;&lt;div class=&quot;floatnone&quot;&gt;&lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Language_Oriented_Programming_(LOP)_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD,_ADD-2011).pdf&amp;amp;page=34&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf&quot; src=&quot;/images/thumb/9/9f/Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf/page0034-512px-Language_Oriented_Programming_%28LOP%29_%D0%B2_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B8_%28%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%9C%D0%B0%D0%B7%D0%B8%D0%BD%2C_ADD-2011%29.pdf.jpg&quot; width=&quot;512&quot; height=&quot;384&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Скачать его можно здесь.
Теперь если у вас есть какие-то вопросы, предлагаю вам их задать.
&lt;/p&gt;&lt;p&gt;(18:46)
&lt;/p&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%90%D0%B2%D1%82%D0%BE%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%B0_%D1%81_Ruby_%D0%B8_Rspec_(%D0%98%D0%B3%D0%BE%D1%80%D1%8C_%D0%9B%D1%8E%D0%B1%D0%B8%D0%BD,SQADays-2011)</id>
		<title>Автотестирование веб-сервиса с Ruby и Rspec (Игорь Любин,SQADays-2011)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%90%D0%B2%D1%82%D0%BE%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%B0_%D1%81_Ruby_%D0%B8_Rspec_(%D0%98%D0%B3%D0%BE%D1%80%D1%8C_%D0%9B%D1%8E%D0%B1%D0%B8%D0%BD,SQADays-2011)"/>
				<updated>2012-04-27T20:10:23Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9F%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B0%D1%81%D1%81%D0%BE%D0%B2%D1%8B%D1%85_%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%B0%D1%85_(ProductCampSPB-2012)</id>
		<title>Поведение пользователей на массовых сервисах (ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9F%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%BC%D0%B0%D1%81%D1%81%D0%BE%D0%B2%D1%8B%D1%85_%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%B0%D1%85_(ProductCampSPB-2012)"/>
				<updated>2012-04-27T20:01:33Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: /* Слайды */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9E_%D1%87%D0%B5%D0%BC_%D0%BC%D1%8B_%D0%B7%D0%B0%D0%B1%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC_%D0%B2_QA_%D0%B8%D0%BB%D0%B8_%E2%80%9C%D0%97%D0%BD%D0%B0%D0%BA%D0%BE%D0%BC%D1%8C%D1%82%D0%B5%D1%81%D1%8C_%E2%80%93_Manageability!%E2%80%9D_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%AE%D1%84%D0%B5%D1%80%D0%B5%D0%B2,_SQADays-2011)</id>
		<title>О чем мы забываем в QA или “Знакомьтесь – Manageability!” (Роман Юферев, SQADays-2011)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9E_%D1%87%D0%B5%D0%BC_%D0%BC%D1%8B_%D0%B7%D0%B0%D0%B1%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC_%D0%B2_QA_%D0%B8%D0%BB%D0%B8_%E2%80%9C%D0%97%D0%BD%D0%B0%D0%BA%D0%BE%D0%BC%D1%8C%D1%82%D0%B5%D1%81%D1%8C_%E2%80%93_Manageability!%E2%80%9D_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%AE%D1%84%D0%B5%D1%80%D0%B5%D0%B2,_SQADays-2011)"/>
				<updated>2012-04-27T19:51:45Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: /* Аннотация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/Java_One_2012:%D0%9E%D1%82%D1%87%D0%B5%D1%82_%D0%91%D0%B5%D0%BB%D0%BE%D0%B1%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%B2%D0%B0_%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D1%8F</id>
		<title>Java One 2012:Отчет Белобородова Дмитрия</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/Java_One_2012:%D0%9E%D1%82%D1%87%D0%B5%D1%82_%D0%91%D0%B5%D0%BB%D0%BE%D0%B1%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%B2%D0%B0_%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D1%8F"/>
				<updated>2012-04-23T15:59:16Z</updated>
		
		<summary type="html">&lt;p&gt;DmitryBeloborodov: /* Язык Kotlin для платформы Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;p&gt;Конференции &lt;a rel=&quot;nofollow&quot; class=&quot;external text&quot; href=&quot;http://www.oracle.com/javaone/ru-ru/index.html&quot;&gt;Java One и Oracle Develop 2012&lt;/a&gt; в России проходили 17-18 апреля в здании Российской Академии Наук (Ленинский проспект, 32a). Несколько параллельных треков включали доклады, связанные с языком &lt;i&gt;Java&lt;/i&gt; и прочими технологиями &lt;i&gt;Oracle&lt;/i&gt;. В холлах были также стенды самой компании &lt;i&gt;Oracle&lt;/i&gt; и компаний-партнеров. Меня заинтересовали только доклады, касающиеся языка &lt;i&gt;Java&lt;/i&gt;, впечатления о посещении которых далее и приведены.
&lt;/p&gt;&lt;p&gt;Общие впечатления, что &lt;b&gt;понравилось&lt;/b&gt; на конференции:
&lt;/p&gt;
&lt;ol&gt;&lt;li&gt; Интересные темы докладов, причем, сделанные не только работниками &lt;i&gt;Oracle&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt; Удовлетворительные условия технического характера, созданные для просмотра и прослушивания докладов:
&lt;ul&gt;&lt;li&gt; презентации демонстрировались на больших экранах, хорошо видных из любой части аудитории;&lt;/li&gt;
&lt;li&gt; наличие синхронного перевода (качество не оценивал).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt; Раздаваемый участникам конференции набор включал необходимый минимум (расписание докладов со схемой аудиторий, ручку, блокнот) и был почти без рекламной макулатуры.&lt;/li&gt;
&lt;li&gt; На открытии продемонстрирован забавный клип &lt;a rel=&quot;nofollow&quot; class=&quot;external text&quot; href=&quot;http://www.youtube.com/watch?v=b-Cr0EWwaTk&quot;&gt;Java Life&lt;/a&gt;, показанный впервые на американском &lt;i&gt;Java One 2011&lt;/i&gt;.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Что &lt;b&gt;не понравилось&lt;/b&gt;:
&lt;/p&gt;
&lt;ol&gt;&lt;li&gt; Катастрофическая ситуация с питанием, особенно во второй день конференции. Совсем-совсем ничего не досталось на обед минимум половине людей. Пришлось даже уйти чуть раньше с доклада до перерыва перед последними двумя докладами, чтобы досталось хоть что-то поесть и смочь досидеть до конца конференции. Учитывая тот факт, что это первая на моей памяти платная оракловская конференция (оказывается, прошлогодняя тоже была платной), просто непонятно, почему нельзя было избежать проблемы с едой...&lt;/li&gt;
&lt;li&gt; В первый день не удалось попасть в синий зал на два последних доклада (не было свободных мест), подобное уже было в прошлом году на &lt;a href=&quot;/Java_Tech_Day_2011:%D0%9E%D1%82%D1%87%D0%B5%D1%82_%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D1%8F_%D0%91%D0%B5%D0%BB%D0%BE%D0%B1%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%B2%D0%B0&quot; title=&quot;Java Tech Day 2011:Отчет Дмитрия Белобородова&quot;&gt;питерском Java Tech Day&lt;/a&gt;: слишком маленькое помещение или неправильно выбраны аудитории организаторами.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Файлы презентаций пока недоступны на официальном сайте, но ссылки на некоторые доклады появились в &lt;a rel=&quot;nofollow&quot; class=&quot;external text&quot; href=&quot;http://habrahabr.ru/post/142344/&quot;&gt;отзыве о конференции на Хабре&lt;/a&gt;.
&lt;/p&gt;
&lt;center&gt;
&lt;table border=&quot;0&quot; style=&quot;border-collapse:collapse&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&lt;div class=&quot;thumb tright&quot;&gt;&lt;div class=&quot;thumbinner&quot; style=&quot;width:190px;&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-agenda.jpg&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/images/thumb/6/67/J1-2012-agenda.jpg/188px-J1-2012-agenda.jpg&quot; width=&quot;188&quot; height=&quot;256&quot; class=&quot;thumbimage&quot; srcset=&quot;/images/thumb/6/67/J1-2012-agenda.jpg/282px-J1-2012-agenda.jpg 1.5x, /images/thumb/6/67/J1-2012-agenda.jpg/376px-J1-2012-agenda.jpg 2x&quot; /&gt;&lt;/a&gt;  &lt;div class=&quot;thumbcaption&quot;&gt;&lt;div class=&quot;magnify&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-agenda.jpg&quot; class=&quot;internal&quot; title=&quot;Увеличить&quot;&gt;&lt;/a&gt;&lt;/div&gt;Подробная программа конференции&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;&lt;div class=&quot;thumb tright&quot;&gt;&lt;div class=&quot;thumbinner&quot; style=&quot;width:252px;&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-entrance-1.jpg&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/images/thumb/4/48/J1-2012-entrance-1.jpg/250px-J1-2012-entrance-1.jpg&quot; width=&quot;250&quot; height=&quot;188&quot; class=&quot;thumbimage&quot; srcset=&quot;/images/thumb/4/48/J1-2012-entrance-1.jpg/375px-J1-2012-entrance-1.jpg 1.5x, /images/thumb/4/48/J1-2012-entrance-1.jpg/500px-J1-2012-entrance-1.jpg 2x&quot; /&gt;&lt;/a&gt;  &lt;div class=&quot;thumbcaption&quot;&gt;&lt;div class=&quot;magnify&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-entrance-1.jpg&quot; class=&quot;internal&quot; title=&quot;Увеличить&quot;&gt;&lt;/a&gt;&lt;/div&gt;Коридор со стендами&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;&lt;div class=&quot;thumb tright&quot;&gt;&lt;div class=&quot;thumbinner&quot; style=&quot;width:252px;&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-entrance-3.jpg&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/images/thumb/6/62/J1-2012-entrance-3.jpg/250px-J1-2012-entrance-3.jpg&quot; width=&quot;250&quot; height=&quot;188&quot; class=&quot;thumbimage&quot; srcset=&quot;/images/thumb/6/62/J1-2012-entrance-3.jpg/375px-J1-2012-entrance-3.jpg 1.5x, /images/thumb/6/62/J1-2012-entrance-3.jpg/500px-J1-2012-entrance-3.jpg 2x&quot; /&gt;&lt;/a&gt;  &lt;div class=&quot;thumbcaption&quot;&gt;&lt;div class=&quot;magnify&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-entrance-3.jpg&quot; class=&quot;internal&quot; title=&quot;Увеличить&quot;&gt;&lt;/a&gt;&lt;/div&gt;Стенд с расписанием и планом&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;&lt;div class=&quot;thumb tright&quot;&gt;&lt;div class=&quot;thumbinner&quot; style=&quot;width:190px;&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-entrance-2.jpg&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/images/thumb/8/88/J1-2012-entrance-2.jpg/188px-J1-2012-entrance-2.jpg&quot; width=&quot;188&quot; height=&quot;251&quot; class=&quot;thumbimage&quot; srcset=&quot;/images/thumb/8/88/J1-2012-entrance-2.jpg/282px-J1-2012-entrance-2.jpg 1.5x, /images/thumb/8/88/J1-2012-entrance-2.jpg/376px-J1-2012-entrance-2.jpg 2x&quot; /&gt;&lt;/a&gt;  &lt;div class=&quot;thumbcaption&quot;&gt;&lt;div class=&quot;magnify&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-entrance-2.jpg&quot; class=&quot;internal&quot; title=&quot;Увеличить&quot;&gt;&lt;/a&gt;&lt;/div&gt;Вход в большой зал&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;&lt;div class=&quot;thumb tright&quot;&gt;&lt;div class=&quot;thumbinner&quot; style=&quot;width:252px;&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-keynote-hall.jpg&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/images/thumb/e/e6/J1-2012-keynote-hall.jpg/250px-J1-2012-keynote-hall.jpg&quot; width=&quot;250&quot; height=&quot;188&quot; class=&quot;thumbimage&quot; srcset=&quot;/images/thumb/e/e6/J1-2012-keynote-hall.jpg/375px-J1-2012-keynote-hall.jpg 1.5x, /images/thumb/e/e6/J1-2012-keynote-hall.jpg/500px-J1-2012-keynote-hall.jpg 2x&quot; /&gt;&lt;/a&gt;  &lt;div class=&quot;thumbcaption&quot;&gt;&lt;div class=&quot;magnify&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-keynote-hall.jpg&quot; class=&quot;internal&quot; title=&quot;Увеличить&quot;&gt;&lt;/a&gt;&lt;/div&gt;Сцена большого зала&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;&lt;div class=&quot;thumb tright&quot;&gt;&lt;div class=&quot;thumbinner&quot; style=&quot;width:252px;&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-stairs.jpg&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/images/thumb/1/1a/J1-2012-stairs.jpg/250px-J1-2012-stairs.jpg&quot; width=&quot;250&quot; height=&quot;188&quot; class=&quot;thumbimage&quot; srcset=&quot;/images/thumb/1/1a/J1-2012-stairs.jpg/375px-J1-2012-stairs.jpg 1.5x, /images/thumb/1/1a/J1-2012-stairs.jpg/500px-J1-2012-stairs.jpg 2x&quot; /&gt;&lt;/a&gt;  &lt;div class=&quot;thumbcaption&quot;&gt;&lt;div class=&quot;magnify&quot;&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:J1-2012-stairs.jpg&quot; class=&quot;internal&quot; title=&quot;Увеличить&quot;&gt;&lt;/a&gt;&lt;/div&gt;Пуфики в коридоре&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/center&gt;
&lt;p&gt;Отзывы о докладах расположены в хронологическом порядке их посещения и оценены по пятибалльной шкале (&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Javaduke.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Javaduke.png&quot; src=&quot;/images/d/d3/Javaduke.png&quot; width=&quot;32&quot; height=&quot;32&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Javaduke.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Javaduke.png&quot; src=&quot;/images/d/d3/Javaduke.png&quot; width=&quot;32&quot; height=&quot;32&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Javaduke.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Javaduke.png&quot; src=&quot;/images/d/d3/Javaduke.png&quot; width=&quot;32&quot; height=&quot;32&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Javaduke.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Javaduke.png&quot; src=&quot;/images/d/d3/Javaduke.png&quot; width=&quot;32&quot; height=&quot;32&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;/%D0%A4%D0%B0%D0%B9%D0%BB:Javaduke.png&quot; class=&quot;image&quot;&gt;&lt;img alt=&quot;Javaduke.png&quot; src=&quot;/images/d/d3/Javaduke.png&quot; width=&quot;32&quot; height=&quot;32&quot; /&gt;&lt;/a&gt;).
&lt;/p&gt;&lt;/div&gt;</summary>
		<author><name>DmitryBeloborodov</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D1%8B_%D0%B2_%D0%96%D0%9A%D0%A5:_%D0%BA%D1%82%D0%BE_%D0%B2%D0%B8%D0%BD%D0%BE%D0%B2%D0%B0%D1%82_%D0%B8_%D1%87%D1%82%D0%BE_%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%3F</id>
		<title>Взаиморасчеты в ЖКХ: кто виноват и что делать?</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D1%8B_%D0%B2_%D0%96%D0%9A%D0%A5:_%D0%BA%D1%82%D0%BE_%D0%B2%D0%B8%D0%BD%D0%BE%D0%B2%D0%B0%D1%82_%D0%B8_%D1%87%D1%82%D0%BE_%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%3F"/>
				<updated>2012-04-18T15:19:33Z</updated>
		
		<summary type="html">&lt;p&gt;AlexandraVelyaninova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;В журнале &lt;a rel=&quot;nofollow&quot; class=&quot;external text&quot; href=&quot;http://gkhprofi.ru/&quot;&gt;«Коммунальный комплекс России»&lt;/a&gt; (№3/2012) опубликована статья «Взаиморасчеты в ЖКХ: кто виноват и что делать?» ведущего аналитика нашей компании &lt;a href=&quot;/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%A2%D0%B0%D1%82%D1%8C%D1%8F%D0%BD%D0%B0_%D0%9B%D0%B8%D1%81%D0%B8%D0%BD%D0%B0_(%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8)&quot; title=&quot;Категория:Татьяна Лисина (Статьи)&quot;&gt;Татьяны Лисиной&lt;/a&gt;. Татьяна рассматривает проблемы взаиморасчетов в ЖКХ и предлагает пути их решения. Работа управляющих компаний вызывает много нареканий по поводу злоупотреблений, хищений и бесконтрольности их деятельности. Выходом из сложившейся ситуации является развитие единых расчетных центров, оснащенных современными биллинговыми системами.&lt;/i&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;С самого начала предвыборного 2011&amp;#160;года и&amp;#160;до сих пор одно за&amp;#160;другим появляются в&amp;#160;СМИ сообщения о&amp;#160;совещаниях, коллегиях, выездных заседаниях с участием самых высокопоставленных лиц. Лейтмотив всех выступлений примерно такой: «…Злоупотребления и хищения в&amp;#160;сфере ЖКХ приобрели характер эпидемии» (Д.&amp;#160;А.&amp;#160;Медведев, выступление на заседании коллегии МВД России, 10&amp;#160;февраля 2012&amp;#160;года). Слово «эпидемия» можно расценить только как признание, что дела идут все хуже. Необходимо срочно разыскать злоумышленников.
&lt;/p&gt;&lt;p&gt;А далеко ходить не надо. Еще в октябре 2011&amp;#160;года министр регионального развития Виктор Басаргин назначил виноватых в привычном развале жилищно-коммунального хозяйства: «Прежде всего, необходимо из процесса расчетов убрать посредников. В первую очередь это как раз управляющие компании, которые прокручивают деньги жильцов. Для некоторых компаний это вообще основной источник доходов. Второе&amp;#160;— расчетно-кассовые центры. Сегодня руководитель РКЦ субъективно решает, кому платить, а кому&amp;#160;— нет. И это благодатная почва для злоупотреблений». И вот уходящий Президент грозно требует от полиции активного пресечения злоупотреблений, а губернаторам поручает следить за расходами управляющих компаний.
&lt;/p&gt;&lt;p&gt;Странная рыночная экономика у нас получается. Управляющие компании, которые появились после принятия Жилищного кодекса,&amp;#160;— коммерческие организации, на каком основании будет раскрыта структура их расходов?
&lt;/p&gt;&lt;p&gt;Поймите правильно&amp;#160;— иллюзий о&amp;#160;качестве управляющих компаний, созданных на основе спешно приватизированных городских жилищных контор, не было ни у кого. Смена названия и даже организационно-правовой формы никак не повлияла на качество их услуг. Для качественного изменения управляющих компаний, превращения их в ответственных субъектов рыночной экономики не было главного условия&amp;#160;— заинтересованности в этом самих управляющих компаний. И не могло быть. Ведь акционирование жилищных компаний фактически повлекло за собой полную отмену контроля за их деятельностью. Естественным следствием этого стало безудержное стремление управляющих компаний к&amp;#160;достижению максимальной выгоды без учета интересов других сторон.
&lt;/p&gt;&lt;p&gt;По Жилищному кодексу управление многоквартирными домами включает взаимодействие с&amp;#160;поставщиками ресурсов, выставление счетов населению с&amp;#160;учетом недопоставок, обеспечение сбора и&amp;#160;перечисление поставщикам оплаты, работы по содержанию жилого фонда и&amp;#160;внутридомовых коммуникаций, а&amp;#160;также капитальный ремонт домов. Отсутствие контроля приводит к&amp;#160;проблемам для жителей и&amp;#160;поставщиков ресурсов буквально на каждом шагу (см.&amp;#160;табл.&amp;#160;1).
&lt;/p&gt;&lt;p&gt;&lt;b&gt;Таблица 1&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;&lt;b&gt;Недостатки в работе управляющих компаний и вызванные ими проблемы для потребителей ЖКУ и поставщиков ресурсов&lt;/b&gt;
&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;4&quot; border=&quot;1&quot;&gt;
&lt;tr&gt;
&lt;th&gt; Проблемное поведение управляющей компании
&lt;/th&gt;
&lt;th&gt; Следствие для граждан
&lt;/th&gt;
&lt;th&gt; Следствие для поставщиков
&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; УК не ведет расчета квитанций
&lt;/td&gt;
&lt;td&gt; Неудобство оплаты по&amp;#160;абонентским книжкам/расчетным листкам поставщиков, необходимость сверки начислений с&amp;#160;поставщиками
&lt;/td&gt;
&lt;td&gt; Уменьшение сборов
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; УК не ведет учета аварий, недопоставок
&lt;/td&gt;
&lt;td&gt; Переплата, необходимость сверки начислений в&amp;#160;аварийные периоды
&lt;/td&gt;
&lt;td&gt; Уменьшение сборов, перерасчеты задним числом
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; УК задерживает перечисление оплаты поставщикам
&lt;/td&gt;
&lt;td&gt; Отключения
&lt;/td&gt;
&lt;td&gt; Отсутствие оборотных средств, в&amp;#160;том числе для&amp;#160;оплаты налогов по&amp;#160;начислению
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; УК не оплачивает задолженность перед поставщиком
&lt;/td&gt;
&lt;td&gt; Отключения, повторное взимание оплаты при&amp;#160;банкротстве УК, судебные издержки
&lt;/td&gt;
&lt;td&gt; Отсутствие оборотных средств, в&amp;#160;том числе для&amp;#160;оплаты налогов по&amp;#160;начислению, судебные издержки
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; УК выполняет не все работы (объемы, состав)
&lt;/td&gt;
&lt;td&gt; Переплата, ухудшение состояния дома
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; УК использует платежи на&amp;#160;капитальный ремонт не&amp;#160;по&amp;#160;назначению
&lt;/td&gt;
&lt;td&gt; Не накапливаются средства для капитального ремонта, ухудшение состояния дома, повторная оплата ремонта
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; УК не ведет учета по&amp;#160;домовым счетчикам
&lt;/td&gt;
&lt;td&gt; Переплата
&lt;/td&gt;
&lt;td&gt; Уменьшение сборов
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; УК оплачивает завышенные объемы работ/услуг
&lt;/td&gt;
&lt;td&gt; Переплата, ухудшение состояния дома
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; УК не отчитывается перед муниципальными властями
&lt;/td&gt;
&lt;td&gt; Бесконтрольность УК, ухудшение состояния дома
&lt;/td&gt;
&lt;td&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;По сообщениям СМИ, приведенные в таблице сценарии реализуются в полной мере, а результатами деятельности управляющих компаний недовольны буквально все. Долги перед поставщиками растут, качество услуг УК плохое, тарифы и нормативы потребления завышены, качество капитального ремонта не выдерживает критики. И это несмотря на то, что в результате монетизации льгот и роста тарифов жильцы стали платить больше. Граждане жалуются на принуждение к подписанию договоров и невозможность контролировать УК, на чехарду с умышленными банкротствами управляющих компаний и многое другое&amp;#160;— проблемы разнообразны, как сама жизнь.
&lt;/p&gt;&lt;/div&gt;</summary>
		<author><name>AlexandraVelyaninova</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/IPazzPort</id>
		<title>IPazzPort</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/IPazzPort"/>
				<updated>2012-04-18T14:57:07Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;p&gt;Модель KP-810-02
&lt;/p&gt;&lt;p&gt;Позиционируется, как:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; Пульт для домашнего кинотеатра;&lt;/li&gt;
&lt;li&gt; Устройство для грамотного презентатора (обучение, тренинги), все что выходит за рамки тупого перелистывания слайдов. Например, с его помощью уже можно использовать &lt;tt&gt;ZoomIt&lt;/tt&gt; (как в режиме увеличения, так и рисования).&lt;/li&gt;
&lt;li&gt; Управление безклавиатурными девайсами (станки с ЧПУ, и прочее, куда некуда засунуть клавиатуру).&lt;/li&gt;&lt;/ul&gt;
&lt;dl&gt;&lt;dt&gt;Интерфейс&lt;/dt&gt;
&lt;dd&gt; 2.4Ghz dongle — это лучше, чем BlueTooth. Больше дальность, надежность, девайс не «теряется».&lt;/dd&gt;&lt;/dl&gt;
&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%A0%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%BA%D0%B0%D0%B4%D1%80%D0%BE%D0%B2_%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8_%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8</id>
		<title>Ротация кадров внутри компании</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A0%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%BA%D0%B0%D0%B4%D1%80%D0%BE%D0%B2_%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8_%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8"/>
				<updated>2012-04-12T17:31:43Z</updated>
		
		<summary type="html">&lt;p&gt;AlexandraVelyaninova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;Руководитель HR-службы &lt;a href=&quot;/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D1%8F_%D0%A3%D0%B4%D0%B0%D0%BB%D0%BE%D0%B2%D0%B0_(%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8)&quot; title=&quot;Категория:Евгения Удалова (Статьи)&quot;&gt;Евгения Удалова&lt;/a&gt; рассказала журналу CIO о&amp;#160;ротации сотрудников внутри компании. В&amp;#160;каких случаях ротация персонала приносит положительный результат, а&amp;#160;когда может навредить? Почему при&amp;#160;кажущейся простоте ротация сотрудников&amp;#160;— довольно непростой управленческий инструмент? Евгения делится положительными примерами внутренней ротации и&amp;#160;обращает внимание на&amp;#160;возможные «подводные камни».&lt;/i&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;На моем опыте были как&amp;#160;положительные, так и&amp;#160;негативные примеры внутренней ротации. К&amp;#160;счастью, хороших примеров было больше.
&lt;/p&gt;&lt;p&gt;Итак, в&amp;#160;каких случаях ротация кадров внутри компании может быть эффективной:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; &lt;b&gt;Распространение производственных практик,&lt;/b&gt; когда человек, переходя из&amp;#160;одного подразделения в&amp;#160;другое, как при перекрестном опылении, переносит с&amp;#160;собой полезные наработки, подходы, секреты мастерства.&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt; &lt;b&gt;Повышение мотивации и лояльности к компании.&lt;/b&gt; Долго работать над одним проектом, на&amp;#160;одном стеке технологий, зная «свою» систему до последней мелочи и&amp;#160;чувствуя, как «песок скрипит на зубах» от&amp;#160;ее&amp;#160;древности, сможет далеко не каждый сотрудник. Перевод такого «старожила» на&amp;#160;другой проект всегда воспринимается очень хорошо как самим сотрудником, так и&amp;#160;всем коллективом.&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt; &lt;b&gt;Обучение персонала.&lt;/b&gt; Благодаря ротации вы можете погружать персонал в&amp;#160;ту среду (производственную или управленческую), которая способствует развитию нужных компетенций и&amp;#160;навыков. Например, перевод руководителя проекта в&amp;#160;другое бизнес-направление позволит ему увидеть в&amp;#160;действии и&amp;#160;попробовать на&amp;#160;практике новые подходы к&amp;#160;управлению.&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt; &lt;b&gt;Проектный, технологический аудит.&lt;/b&gt; Здесь речь идет о&amp;#160;переводе сотрудника на&amp;#160;другой проект (или в&amp;#160;другое подразделение) на&amp;#160;какой-то ограниченный срок (до&amp;#160;года, например). Предполагается, что за&amp;#160;это время он проведет аудит состояния проекта, архитектуры, программного кода, погрузившись в&amp;#160;проект и&amp;#160;непосредственно участвуя в&amp;#160;производственной деятельности.&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt; &lt;b&gt;Быстрый старт нового проекта.&lt;/b&gt; Если в&amp;#160;компании налажены механизмы ротации персонала, у&amp;#160;вас не возникнет сложностей с&amp;#160;тем, чтобы собрать новую команду из&amp;#160;уже работающих сотрудников. Плюсы формирования такого «костяка» стартующего проекта очевидны: люди лояльны к&amp;#160;компании и&amp;#160;хорошо знают используемые технологии, их&amp;#160;профессионализм доказан, вокруг «костяка» можно быстро нарастить достаточно большую команду (до&amp;#160;10&amp;#160;человек), приходящие люди не&amp;#160;будут «оторваны» от&amp;#160;компании, поскольку их&amp;#160;погружением и&amp;#160;адаптацией будут заниматься уже работающие у&amp;#160;вас сотрудники.&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt; &lt;b&gt;Развитие горизонтальных связей между подразделениями.&lt;/b&gt; По нашему опыту, видимый эффект появляется через 3-4&amp;#160;года после начала мероприятий по&amp;#160;ротации. Горизонтальные связи между производственными подразделениями&amp;#160;— как рабочие, так и&amp;#160;личные&amp;#160;— улучшают координацию и&amp;#160;взаимодействие при&amp;#160;совместной работе над&amp;#160;задачами, сохраняют целостность компании, позволяют делиться опытом и&amp;#160;успешными практиками. Этот механизм также помогает руководителям производственных направлений видеть компанию в&amp;#160;целом, а&amp;#160;не&amp;#160;ограничиваться только своей «частью».&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt; &lt;b&gt;Уход от производственных конфликтов. &lt;/b&gt;Если между какими-то специалистами «пробегает искра», мы всегда можем перевести одного из них в&amp;#160;другое подразделение.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;И, чтобы «уравновесить» сказанное, несколько слов о&amp;#160;том, когда ротация может сыграть с&amp;#160;компанией злую шутку:
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; &lt;b&gt;Нарушение слаженности работы коллектива.&lt;/b&gt; Здесь речь идет даже не&amp;#160;о&amp;#160;командной работе, а&amp;#160;просто о&amp;#160;«сбитом» коллективе, способном решать производственные задачи совместными усилиями. Только представьте себе, что происходит с&amp;#160;таким коллективом, если каждые три месяца к&amp;#160;ним кого-то переводят из&amp;#160;другой проектной группы, а&amp;#160;кого-то забирают в&amp;#160;другие проекты. Существенно увеличиваются затраты на&amp;#160;погружение и&amp;#160;обучение новичков, снижается темп работы и&amp;#160;производительность, появляется ощущение «дня сурка» и&amp;#160;воцаряется атмосфера «времянки».&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt; &lt;b&gt;Резкая смена вида деятельности.&lt;/b&gt; Эксперимент с&amp;#160;переводом сотрудников на&amp;#160;позиции, подразумевающие другой вид деятельности или&amp;#160;полную смену технологий, может завершиться неудачей. Например, перевод инженера по&amp;#160;внедрению на&amp;#160;проект разработки ИТ-модуля в&amp;#160;надежде, что он достаточно быстро «потянет» аналитические задачи. Такими перестановками и&amp;#160;«рокировками» можно снизить мотивацию сотрудника или, наоборот, сформировать у&amp;#160;него завышенные ожидания, а&amp;#160;в&amp;#160;результате получить специалиста, неспособного демонстрировать требуемое качество работы.&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt; &lt;b&gt;Вывод ключевых специалистов.&lt;/b&gt; Эксперты по&amp;#160;системе (проекту) всегда были и&amp;#160;будут «штучными» специалистами, поэтому, если уровень технологизации производства невысок, ротация основного состава, «костяка» проектной группы может привести к&amp;#160;печальным для&amp;#160;проекта последствиям.&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;&lt;li&gt; &lt;b&gt;Неэффективное решение производственных конфликтов.&lt;/b&gt; Как уже говорилось, ротация может помочь уйти от&amp;#160;производственных конфликтов, однако такой метод не&amp;#160;решает проблему и&amp;#160;не&amp;#160;учит сотрудников налаживать отношения конструктивными методами. Мы&amp;#160;просто разводим «льва» и&amp;#160;«тигра» по&amp;#160;углам «клетки», но&amp;#160;это вовсе не&amp;#160;гарантирует, что они не&amp;#160;найдут повода «сцепиться» вновь, припомнив друг другу старые обиды, а&amp;#160;у&amp;#160;вас как управленца с&amp;#160;каждым таким ходом будет все больше ограничений для&amp;#160;привлечения сотрудников к&amp;#160;совместной работе.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;При кажущейся простоте и&amp;#160;удобстве, ротация персонала&amp;#160;— это сложно настраиваемый управленческий инструмент, звучание которого зависит как от&amp;#160;правильной настройки, так и&amp;#160;от&amp;#160;мастерства исполнителя.
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?layout=button_count&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=recommend&amp;amp;font=segoe+ui&amp;amp;colorscheme=light&amp;amp;height=21&amp;amp;href=http://lib.custis.ru%2F%25D0%25A0%25D0%25BE%25D1%2582%25D0%25B0%25D1%2586%25D0%25B8%25D1%258F_%25D0%25BA%25D0%25B0%25D0%25B4%25D1%2580%25D0%25BE%25D0%25B2_%25D0%25B2%25D0%25BD%25D1%2583%25D1%2582%25D1%2580%25D0%25B8_%25D0%25BA%25D0%25BE%25D0%25BC%25D0%25BF%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B8&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:450px; height:21px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;

&lt;/p&gt;
&lt;div style=&quot;font-size:60%&quot;&gt;
&lt;p&gt;Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».
&lt;/p&gt;&lt;p&gt;Репликация: &lt;a href=&quot;http://www.custis.ru&quot;&gt; База Знаний «Заказных Информ Систем» &amp;#8594; «&lt;strong&gt;Ротация кадров внутри компании&lt;/strong&gt;»&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</summary>
		<author><name>AlexandraVelyaninova</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/DDD:_%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D1%83%D0%B5%D0%BC_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%D0%92%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE%D0%BD%D1%81%D0%BA%D0%B0%D1%8F_%D0%B1%D0%B0%D1%88%D0%BD%D1%8F_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%A6%D0%B5%D0%BF%D0%BA%D0%BE%D0%B2,_Software_People_2012)</id>
		<title>DDD: Реализуем проект Вавилонская башня (Максим Цепков, Software People 2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/DDD:_%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D1%83%D0%B5%D0%BC_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82_%D0%92%D0%B0%D0%B2%D0%B8%D0%BB%D0%BE%D0%BD%D1%81%D0%BA%D0%B0%D1%8F_%D0%B1%D0%B0%D1%88%D0%BD%D1%8F_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%A6%D0%B5%D0%BF%D0%BA%D0%BE%D0%B2,_Software_People_2012)"/>
				<updated>2012-04-10T20:37:36Z</updated>
		
		<summary type="html">&lt;p&gt;MaksTsepkov: /* Коммунальный биллинг */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>MaksTsepkov</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%92%D0%B7%D0%B3%D0%BB%D1%8F%D0%B4_%D0%BD%D0%B0_%D0%BE%D0%B1%D0%BB%D0%B0%D0%BA%D0%BE_%D1%81_%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D1%85_%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD</id>
		<title>Взгляд на облако с разных сторон</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%92%D0%B7%D0%B3%D0%BB%D1%8F%D0%B4_%D0%BD%D0%B0_%D0%BE%D0%B1%D0%BB%D0%B0%D0%BA%D0%BE_%D1%81_%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D1%85_%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD"/>
				<updated>2012-04-10T15:35:16Z</updated>
		
		<summary type="html">&lt;p&gt;AlexandraVelyaninova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;Ведущий системный инженер &lt;a href=&quot;/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D0%B9_%D0%9C%D0%BE%D1%80%D0%BE%D0%B7%D0%BE%D0%B2_(%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D0%B8)&quot; title=&quot;Категория:Дмитрий Морозов (Статьи)&quot;&gt;Дмитрий Морозов&lt;/a&gt; рассказал журналу &lt;a rel=&quot;nofollow&quot; class=&quot;external text&quot; href=&quot;http://www.iemag.ru/numbers/index.php?YEAR_ID=1359&amp;amp;ID=25313&quot;&gt;Intelligent Enterprise&lt;/a&gt; об&amp;#160;эффективном внедрении частного облака. Что дает перевод инфраструктуры в&amp;#160;облако и&amp;#160;как его проводить в&amp;#160;условиях непрерывности бизнес-процессов компании? Своим опытом Дмитрий делится в&amp;#160;комментарии к&amp;#160;статье «Незаметная революция» (о&amp;#160;внедрении облачного решения в&amp;#160;РГТЭУ).&lt;/i&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Облако&amp;#160;— это симбиоз технических (виртуализация) и&amp;#160;организационных (унификация процессов) средств управления инфраструктурой компании. Максимальный эффект возникает при&amp;#160;их&amp;#160;правильном сочетании, поэтому эффективное внедрение частного облака требует специальных усилий не&amp;#160;только от&amp;#160;сотрудников ИТ-отдела, но и&amp;#160;от&amp;#160;тех специалистов, чьи бизнес-процессы будут затронуты виртуализацией.
&lt;/p&gt;&lt;p&gt;Перевод инфраструктуры в&amp;#160;облако делает ее более прозрачной и&amp;#160;управляемой, расширяет возможности для&amp;#160;ее&amp;#160;масштабирования, упрощает и&amp;#160;ускоряет внесение в&amp;#160;нее изменений. Однако эти изменения проводятся не&amp;#160;«в&amp;#160;вакууме», а&amp;#160;в&amp;#160;условиях непрерывности бизнес-процессов компании. У&amp;#160;нас сложилась и&amp;#160;хорошо себя зарекомендовала практика проведения анализа тех процессов, которые предстоит перевести в&amp;#160;частное облако. Таким образом, вырабатываются соглашения об&amp;#160;объеме предоставляемых IT-отделом услуг, а&amp;#160;также правила и&amp;#160;регламенты взаимодействия сотрудников бизнес- и&amp;#160;IT-подразделений&amp;#160;— своего рода SLA. И&amp;#160;только с&amp;#160;учетом этих условий создается техническая архитектура облака.
&lt;/p&gt;&lt;p&gt;Например, чтобы при&amp;#160;размещении базы данных (БД) Oracle в&amp;#160;облаке одновременно учесть интересы пользователей и&amp;#160;возможности ИТ-отдела, разрабатывается набор правил. В&amp;#160;них указывается количество и&amp;#160;объемы поддерживаемых БД, частота появления новых БД, регламент резервного копирования и&amp;#160;т.&amp;#160;д. В&amp;#160;результате SLA между пользователями и&amp;#160;ИТ-отделом задает параметры для&amp;#160;технических регламентов и&amp;#160;влияет на&amp;#160;архитектуру облака.
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
&lt;iframe src=&quot;http://www.facebook.com/plugins/like.php?layout=button_count&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=recommend&amp;amp;font=segoe+ui&amp;amp;colorscheme=light&amp;amp;height=21&amp;amp;href=http://lib.custis.ru%2F%25D0%2592%25D0%25B7%25D0%25B3%25D0%25BB%25D1%258F%25D0%25B4_%25D0%25BD%25D0%25B0_%25D0%25BE%25D0%25B1%25D0%25BB%25D0%25B0%25D0%25BA%25D0%25BE_%25D1%2581_%25D1%2580%25D0%25B0%25D0%25B7%25D0%25BD%25D1%258B%25D1%2585_%25D1%2581%25D1%2582%25D0%25BE%25D1%2580%25D0%25BE%25D0%25BD&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;border:none; overflow:hidden; width:450px; height:21px;&quot; allowTransparency=&quot;true&quot;&gt;&lt;/iframe&gt;

&lt;/p&gt;
&lt;div style=&quot;font-size:60%&quot;&gt;
&lt;p&gt;Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».
&lt;/p&gt;&lt;p&gt;Репликация: &lt;a href=&quot;http://www.custis.ru&quot;&gt; База Знаний «Заказных Информ Систем» &amp;#8594; «&lt;strong&gt;Взгляд на облако с разных сторон&lt;/strong&gt;»&lt;/a&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</summary>
		<author><name>AlexandraVelyaninova</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9E%D0%BF%D1%8B%D1%82_%D0%B2%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D1%8F_Product_Management._%D0%9F%D0%BE%D0%B4%D0%B2%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5_%D0%BA%D0%B0%D0%BC%D0%BD%D0%B8_(%D0%90%D0%BD%D0%BD%D0%B0_%D0%9B%D0%BE%D0%BF%D0%B0%D1%82%D1%83%D1%85%D0%B8%D0%BD%D0%B0,_ProductCampSPB-2012)</id>
		<title>Опыт внедрения Product Management. Подводные камни (Анна Лопатухина, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9E%D0%BF%D1%8B%D1%82_%D0%B2%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D1%8F_Product_Management._%D0%9F%D0%BE%D0%B4%D0%B2%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5_%D0%BA%D0%B0%D0%BC%D0%BD%D0%B8_(%D0%90%D0%BD%D0%BD%D0%B0_%D0%9B%D0%BE%D0%BF%D0%B0%D1%82%D1%83%D1%85%D0%B8%D0%BD%D0%B0,_ProductCampSPB-2012)"/>
				<updated>2012-04-10T09:06:30Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [http://ru.linkedin.com/in/alopatuhina Анна Лопатухина] &amp;lt;blockquote&amp;gt; * Необходимо четко...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D1%84%D0%B8%D1%81%D0%B0_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80%D0%BE%D0%B2_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2_(%D0%98%D0%B3%D0%BE%D1%80%D1%8C_%D0%9F%D0%B0%D1%80%D1%84e%D0%BD%D0%BE%D0%B2,_ProductCampSPB-2012)</id>
		<title>Построение офиса менеджеров продуктов (Игорь Парфeнов, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D1%84%D0%B8%D1%81%D0%B0_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80%D0%BE%D0%B2_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2_(%D0%98%D0%B3%D0%BE%D1%80%D1%8C_%D0%9F%D0%B0%D1%80%D1%84e%D0%BD%D0%BE%D0%B2,_ProductCampSPB-2012)"/>
				<updated>2012-04-10T08:57:04Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [http://www.linkedin.com/in/igorparfenov Игорь Парфeнов] &amp;lt;blockquote&amp;gt; Я расскажу о своем ...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9D%D0%B0_%D0%BA%D0%B0%D0%BA%D0%BE%D0%BC_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B8%D1%82%D1%8C_%D1%81_%D0%A1%D1%85%D0%9E_(%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B9_%D0%9A%D0%BE%D0%BB%D0%BF%D0%B0%D0%BA%D0%BE%D0%B2,_ProductCampSPB-2012)</id>
		<title>На каком языке говорить с СхО (Сергей Колпаков, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9D%D0%B0_%D0%BA%D0%B0%D0%BA%D0%BE%D0%BC_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B8%D1%82%D1%8C_%D1%81_%D0%A1%D1%85%D0%9E_(%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B9_%D0%9A%D0%BE%D0%BB%D0%BF%D0%B0%D0%BA%D0%BE%D0%B2,_ProductCampSPB-2012)"/>
				<updated>2012-04-10T08:48:03Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: /* Примечания и отзывы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81_(%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D0%B2%D0%B5%D1%82%D0%B0_%D0%A5%D0%BE%D0%B1%D0%BE%D1%82%D0%B8%D0%BD%D0%B0,_ProductCampSPB-2012)</id>
		<title>Коллективный процесс (Елизавета Хоботина, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81_(%D0%95%D0%BB%D0%B8%D0%B7%D0%B0%D0%B2%D0%B5%D1%82%D0%B0_%D0%A5%D0%BE%D0%B1%D0%BE%D1%82%D0%B8%D0%BD%D0%B0,_ProductCampSPB-2012)"/>
				<updated>2012-04-09T23:27:31Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D1%8B%D0%BD%D0%BA%D0%B0_%D0%B8_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B4%D0%BB%D1%8F_%D1%88%D0%BE%D0%BF%D0%BF%D0%B8%D0%BD%D0%B3%D0%B0_(%D0%AF%D0%BD%D0%B0_%D0%9A%D1%83%D0%B7%D1%8C%D0%BC%D0%B8%D0%BD%D0%B0,_ProductCampSPB-2012)</id>
		<title>Анализ мобильного рынка и приложений для шоппинга (Яна Кузьмина, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%80%D1%8B%D0%BD%D0%BA%D0%B0_%D0%B8_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B4%D0%BB%D1%8F_%D1%88%D0%BE%D0%BF%D0%BF%D0%B8%D0%BD%D0%B3%D0%B0_(%D0%AF%D0%BD%D0%B0_%D0%9A%D1%83%D0%B7%D1%8C%D0%BC%D0%B8%D0%BD%D0%B0,_ProductCampSPB-2012)"/>
				<updated>2012-04-09T23:23:48Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D1%8B_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_B2B_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%B0_%C2%AB%D0%95%D0%B4%D0%B8%D0%BD%D1%8B%D0%B9_%D0%9A%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%C2%BB_(%D0%95%D0%BB%D0%B5%D0%BD%D0%B0_%D0%96%D1%83%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%B2%D0%B0,_ProductCampSPB-2012)</id>
		<title>Процессы разработки B2B продукта «Единый Клиент» (Елена Журавлева, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D1%8B_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_B2B_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%B0_%C2%AB%D0%95%D0%B4%D0%B8%D0%BD%D1%8B%D0%B9_%D0%9A%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%C2%BB_(%D0%95%D0%BB%D0%B5%D0%BD%D0%B0_%D0%96%D1%83%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%B2%D0%B0,_ProductCampSPB-2012)"/>
				<updated>2012-04-09T23:10:58Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [http://zhuravleva-kholodova.moikrug.ru/ Елена Журавлева] &amp;lt;blockquote&amp;gt; &amp;lt;/blockquote&amp;gt;  == Видео ==...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%82%D1%84%D0%B5%D0%BB%D1%8F_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5_Comindware_(%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D0%B8%D0%BD_%D0%91%D1%80%D0%B5%D0%B4%D1%8E%D0%BA,_ProductCampSPB-2012)</id>
		<title>Проектирование продуктового портфеля на примере Comindware (Константин Бредюк, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%82%D1%84%D0%B5%D0%BB%D1%8F_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5_Comindware_(%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D0%B8%D0%BD_%D0%91%D1%80%D0%B5%D0%B4%D1%8E%D0%BA,_ProductCampSPB-2012)"/>
				<updated>2012-04-09T07:06:08Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%97%D0%B0%D0%B2%D0%BE%D0%B4_%D0%92%D0%B5%D1%80%D1%82%D0%B8%D0%BA%D0%B0%D0%BB%D0%B5%D0%B9_(%D0%AE%D1%80%D0%B8%D0%B9_%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2,_ProductCampSPB-2012)</id>
		<title>Завод Вертикалей (Юрий Воронцов, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%97%D0%B0%D0%B2%D0%BE%D0%B4_%D0%92%D0%B5%D1%80%D1%82%D0%B8%D0%BA%D0%B0%D0%BB%D0%B5%D0%B9_(%D0%AE%D1%80%D0%B8%D0%B9_%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2,_ProductCampSPB-2012)"/>
				<updated>2012-04-09T06:57:17Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: переименовал Завод Вертикалей (Юрий Воронцов, ProductCampSPB-2012 ) в Завод Вертикалей (Юрий Воронцов, ProductCampSPB-2012)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%A1%D1%82%D0%B5%D0%B9%D0%BA%D1%85%D0%BE%D0%BB%D0%B4%D0%B5%D1%80%D1%8B,_%D0%B8%D1%85_%D0%B8%D0%B4%D0%B5%D0%B8,_%D0%B8%D1%85_%D0%BF%D1%80%D0%B8%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D1%82%D1%8B._KJ_method:_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B8%D0%B7_%D1%85%D0%B0%D0%BE%D1%81%D0%B0._(%D0%98%D0%B2%D0%B0%D0%BD_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2,_ProductCampSPB-2012)</id>
		<title>Стейкхолдеры, их идеи, их приоритеты. KJ method: порядок из хаоса. (Иван Михайлов, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A1%D1%82%D0%B5%D0%B9%D0%BA%D1%85%D0%BE%D0%BB%D0%B4%D0%B5%D1%80%D1%8B,_%D0%B8%D1%85_%D0%B8%D0%B4%D0%B5%D0%B8,_%D0%B8%D1%85_%D0%BF%D1%80%D0%B8%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D1%82%D1%8B._KJ_method:_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B8%D0%B7_%D1%85%D0%B0%D0%BE%D1%81%D0%B0._(%D0%98%D0%B2%D0%B0%D0%BD_%D0%9C%D0%B8%D1%85%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2,_ProductCampSPB-2012)"/>
				<updated>2012-04-09T06:39:57Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: /* Примечания и отзывы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%A3%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B4%D0%B0%D0%B6_%D0%B7%D0%B0_%D1%81%D1%87%D0%B5%D1%82_%D0%B2%D1%8B%D1%81%D1%82%D1%80%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2_(ProductCampSPB-2012)</id>
		<title>Увеличение продаж за счет выстраивания матрицы продуктов (ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A3%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B4%D0%B0%D0%B6_%D0%B7%D0%B0_%D1%81%D1%87%D0%B5%D1%82_%D0%B2%D1%8B%D1%81%D1%82%D1%80%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2_(ProductCampSPB-2012)"/>
				<updated>2012-04-09T06:30:32Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: /* Видео */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9F%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D1%80%D1%8B%D0%BD%D0%BA%D0%B5_ECM_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B0%D1%80%D1%85%D0%B8%D0%B2%D0%B0_(%D0%9B%D0%B8%D0%BB%D0%B8%D1%8F_%D0%9A%D0%BE%D1%87%D0%B5%D1%82%D0%BA%D0%BE%D0%B2%D0%B0,_ProductCampSPB-2012)</id>
		<title>Позиционирование на рынке ECM на примере системы электронного архива (Лилия Кочеткова, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9F%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D1%80%D1%8B%D0%BD%D0%BA%D0%B5_ECM_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B0%D1%80%D1%85%D0%B8%D0%B2%D0%B0_(%D0%9B%D0%B8%D0%BB%D0%B8%D1%8F_%D0%9A%D0%BE%D1%87%D0%B5%D1%82%D0%BA%D0%BE%D0%B2%D0%B0,_ProductCampSPB-2012)"/>
				<updated>2012-04-08T20:37:00Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: Лилия Кочеткова &amp;lt;blockquote&amp;gt; &amp;lt;/blockquote&amp;gt;  == Видео ==  {{vimeoembed|39974348|720|304}} {{CONFID...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%A1%D0%BC%D0%B5%D0%BD%D0%B0_%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D0%B8_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%B0_GUI_Machine_(%D0%A0%D1%83%D1%81%D1%82%D0%B5%D0%BC_%D0%93%D0%B0%D0%B9%D1%84%D1%83%D1%82%D0%B4%D0%B8%D0%BD%D0%BE%D0%B2,_ProductCampSPB-2012)</id>
		<title>Смена концепции программного продукта GUI Machine (Рустем Гайфутдинов, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A1%D0%BC%D0%B5%D0%BD%D0%B0_%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D0%B8_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%B0_GUI_Machine_(%D0%A0%D1%83%D1%81%D1%82%D0%B5%D0%BC_%D0%93%D0%B0%D0%B9%D1%84%D1%83%D1%82%D0%B4%D0%B8%D0%BD%D0%BE%D0%B2,_ProductCampSPB-2012)"/>
				<updated>2012-04-08T20:29:50Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: /* Видео */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D1%80%D1%8B%D0%BD%D0%BA%D0%BE%D0%B2_(%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D0%B9_%D0%96%D1%83%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%B2,_ProductCampSPB-2012)</id>
		<title>Создание новых рынков (Дмитрий Журавлев, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D1%80%D1%8B%D0%BD%D0%BA%D0%BE%D0%B2_(%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D0%B9_%D0%96%D1%83%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%B2,_ProductCampSPB-2012)"/>
				<updated>2012-04-08T20:20:13Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [http://www.linkedin.com/in/dmitryzhuravlev Дмитрий Журавлев] &amp;lt;blockquote&amp;gt; &amp;lt;/blockquote&amp;gt;  == Виде...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/Saas-%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%B0%D0%BF_HR-%D1%80%D0%B5%D0%BA%D1%80%D1%83%D1%82%D0%B8%D0%BD%D0%B3%D0%B0_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%98%D0%B3%D0%BD%D0%B0%D1%82%D0%BE%D0%B2,_ProductCampSPB-2012)</id>
		<title>Saas-стартап HR-рекрутинга (Максим Игнатов, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/Saas-%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%B0%D0%BF_HR-%D1%80%D0%B5%D0%BA%D1%80%D1%83%D1%82%D0%B8%D0%BD%D0%B3%D0%B0_(%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC_%D0%98%D0%B3%D0%BD%D0%B0%D1%82%D0%BE%D0%B2,_ProductCampSPB-2012)"/>
				<updated>2012-04-08T18:52:24Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == Категория:Максим Игнатов ;Докладчик: [[:Категория:Максим Игнатов|Максим И...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%A7%D1%82%D0%BE_%D0%BF%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B5%D1%82%D1%8C_%D1%81%D0%B5%D0%B3%D0%BE%D0%B4%D0%BD%D1%8F_%D0%B2%D0%B5%D1%87%D0%B5%D1%80%D0%BE%D0%BC%3F_Yota_Play_(%D0%92%D0%B8%D1%82%D0%B0%D0%BB%D0%B8%D0%B9_%D0%93%D1%80%D0%B8%D0%B3%D0%BE%D1%80%D0%B0%D1%88,_ProductCampSPB-2012)</id>
		<title>Что посмотреть сегодня вечером? Yota Play (Виталий Григораш, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A7%D1%82%D0%BE_%D0%BF%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B5%D1%82%D1%8C_%D1%81%D0%B5%D0%B3%D0%BE%D0%B4%D0%BD%D1%8F_%D0%B2%D0%B5%D1%87%D0%B5%D1%80%D0%BE%D0%BC%3F_Yota_Play_(%D0%92%D0%B8%D1%82%D0%B0%D0%BB%D0%B8%D0%B9_%D0%93%D1%80%D0%B8%D0%B3%D0%BE%D1%80%D0%B0%D1%88,_ProductCampSPB-2012)"/>
				<updated>2012-04-08T18:41:26Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: /* Слайды */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%98%D0%B3%D1%80%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%BA%D0%B8_%D0%B2_%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D1%85_(%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D0%B9_%D0%9E%D1%80%D0%BB%D0%BE%D0%B2,_ProductCampSPB-2012)</id>
		<title>Игровые механики в полезных приложениях (Дмитрий Орлов, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%98%D0%B3%D1%80%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%BA%D0%B8_%D0%B2_%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%D1%85_(%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D0%B9_%D0%9E%D1%80%D0%BB%D0%BE%D0%B2,_ProductCampSPB-2012)"/>
				<updated>2012-04-08T18:37:13Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: /* Видео */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%92%D1%8B%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D0%B8_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%B0_(%D0%9E%D0%BB%D1%8C%D0%B3%D0%B0_%D0%9F%D0%B0%D0%B2%D0%BB%D0%BE%D0%B2%D0%B0,_ProductCampSPB-2012)</id>
		<title>Выработка концепции интерфейса продукта (Ольга Павлова, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%92%D1%8B%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D0%B8_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%B0_(%D0%9E%D0%BB%D1%8C%D0%B3%D0%B0_%D0%9F%D0%B0%D0%B2%D0%BB%D0%BE%D0%B2%D0%B0,_ProductCampSPB-2012)"/>
				<updated>2012-04-08T18:31:41Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == Категория:Ольга Павлова ;Докладчик: [[:Категория:Ольга Павлова|Ольга Павл...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2_%D0%B8_%D0%B8%D0%B4%D0%B5%D0%B9_(%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B9_%D0%9C%D0%BE%D1%80%D0%BE%D0%B7%D0%BE%D0%B2,_ProductCampSPB-2012)</id>
		<title>Генерация новых продуктов и идей (Сергей Морозов, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2_%D0%B8_%D0%B8%D0%B4%D0%B5%D0%B9_(%D0%A1%D0%B5%D1%80%D0%B3%D0%B5%D0%B9_%D0%9C%D0%BE%D1%80%D0%BE%D0%B7%D0%BE%D0%B2,_ProductCampSPB-2012)"/>
				<updated>2012-04-08T18:24:36Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: /* Видео */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9A%D0%B0%D0%BA_%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C_%D0%BA%D1%80%D1%83%D0%BF%D0%BD%D1%8B%D1%85_%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%3F_(%D0%90%D0%BD%D1%82%D0%BE%D0%BD_%D0%9C%D0%B0%D1%80%D1%87%D0%B5%D0%BD%D0%BA%D0%BE,_ProductCampSPB-2012)</id>
		<title>Как заполучить крупных клиентов? (Антон Марченко, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9A%D0%B0%D0%BA_%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C_%D0%BA%D1%80%D1%83%D0%BF%D0%BD%D1%8B%D1%85_%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%3F_(%D0%90%D0%BD%D1%82%D0%BE%D0%BD_%D0%9C%D0%B0%D1%80%D1%87%D0%B5%D0%BD%D0%BA%D0%BE,_ProductCampSPB-2012)"/>
				<updated>2012-04-08T17:54:02Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [http://marchenkoanton.moikrug.ru/ Антон Марченко] &amp;lt;blockquote&amp;gt; Доклад будет построе...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%90%D0%B4%D0%B0%D0%BF%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D1%80%D1%83%D0%B1%D0%B5%D0%B6%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2:_%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C_%D0%B8%D0%BB%D0%B8_%D1%83%D0%BA%D1%80%D0%B0%D1%81%D1%82%D1%8C%3F_(%D0%9C%D0%B8%D1%85%D0%B0%D0%B8%D0%BB_%D0%97%D0%B0%D1%80%D0%B8%D0%BD,_ProductCampSPB-2012)</id>
		<title>Адаптация зарубежных продуктов: Создать или украсть? (Михаил Зарин, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%90%D0%B4%D0%B0%D0%BF%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D1%80%D1%83%D0%B1%D0%B5%D0%B6%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2:_%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C_%D0%B8%D0%BB%D0%B8_%D1%83%D0%BA%D1%80%D0%B0%D1%81%D1%82%D1%8C%3F_(%D0%9C%D0%B8%D1%85%D0%B0%D0%B8%D0%BB_%D0%97%D0%B0%D1%80%D0%B8%D0%BD,_ProductCampSPB-2012)"/>
				<updated>2012-04-08T17:43:21Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D0%B5_%D0%9F%D0%9E_vs_SaaS_-_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BA_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5_%D0%B8_%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3%D1%83_(%D0%9C%D0%B0%D1%80%D0%B8%D1%8F_%D0%91%D0%BE%D0%BD%D0%B4%D0%B0%D1%80%D0%B5%D0%BD%D0%BA%D0%BE,_ProductCampSPB-2012)</id>
		<title>Лицензируемое ПО vs SaaS - подходы к разработке и маркетингу (Мария Бондаренко, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D0%B5_%D0%9F%D0%9E_vs_SaaS_-_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D1%8B_%D0%BA_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5_%D0%B8_%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3%D1%83_(%D0%9C%D0%B0%D1%80%D0%B8%D1%8F_%D0%91%D0%BE%D0%BD%D0%B4%D0%B0%D1%80%D0%B5%D0%BD%D0%BA%D0%BE,_ProductCampSPB-2012)"/>
				<updated>2012-04-06T20:18:52Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B0_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%B0_-_%D0%BD%D1%83%D0%B6%D0%BD%D1%8B_%D0%BB%D0%B8_%D0%B2%D0%B0%D0%BC_%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B8_%D0%B8_%D0%BA%D0%B0%D0%BA_%D0%B8%D1%85_%D1%80%D0%B0%D0%B7%D0%B4%D0%BE%D0%B1%D1%8B%D1%82%D1%8C%3F_(%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B5%D0%B9_%D0%98%D0%BB%D1%8C%D0%B8%D0%BD,_ProductCampSPB-2012)</id>
		<title>Аналитика использования продукта - нужны ли вам метрики и как их раздобыть? (Алексей Ильин, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B0_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%B0_-_%D0%BD%D1%83%D0%B6%D0%BD%D1%8B_%D0%BB%D0%B8_%D0%B2%D0%B0%D0%BC_%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B8_%D0%B8_%D0%BA%D0%B0%D0%BA_%D0%B8%D1%85_%D1%80%D0%B0%D0%B7%D0%B4%D0%BE%D0%B1%D1%8B%D1%82%D1%8C%3F_(%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B5%D0%B9_%D0%98%D0%BB%D1%8C%D0%B8%D0%BD,_ProductCampSPB-2012)"/>
				<updated>2012-04-06T19:56:14Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D0%B2_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B5_(%D0%94%D0%B8%D0%BD%D0%B0_%D0%A8%D0%B5%D0%BB%D0%B5%D0%BF%D0%B8%D0%BD%D0%B0,_ProductCampSPB-2012)</id>
		<title>Взаимодействие в команде (Дина Шелепина, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D0%B2_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B5_(%D0%94%D0%B8%D0%BD%D0%B0_%D0%A8%D0%B5%D0%BB%D0%B5%D0%BF%D0%B8%D0%BD%D0%B0,_ProductCampSPB-2012)"/>
				<updated>2012-04-06T19:45:35Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/Product_Management_Course_%D0%B2_UC_Berkeley_(ProductCampSPB-2012)</id>
		<title>Product Management Course в UC Berkeley (ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/Product_Management_Course_%D0%B2_UC_Berkeley_(ProductCampSPB-2012)"/>
				<updated>2012-04-06T15:56:29Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9E%D0%BF%D1%8B%D1%82_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%BC%D0%B5%D0%BD%D1%82%D0%B0_%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%B0%D0%BF%D0%B0_(%D0%A1%D1%82%D0%B0%D1%81_%D0%94%D0%B0%D0%B2%D1%8B%D0%B4%D0%BE%D0%B2,_ProductCampSPB-2012)</id>
		<title>Опыт продуктового менеджмента мобильного стартапа (Стас Давыдов, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9E%D0%BF%D1%8B%D1%82_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%BC%D0%B5%D0%BD%D1%82%D0%B0_%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%B0%D0%BF%D0%B0_(%D0%A1%D1%82%D0%B0%D1%81_%D0%94%D0%B0%D0%B2%D1%8B%D0%B4%D0%BE%D0%B2,_ProductCampSPB-2012)"/>
				<updated>2012-04-06T14:31:03Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/ISPMA_%E2%80%94_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B8_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80%D0%BE%D0%B2_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2_(%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%9C%D0%B0%D0%B3%D0%BB%D0%B8%D0%B0%D1%81,_ProductCampSPB-2012)</id>
		<title>ISPMA — стандарт обучения и сертификации менеджеров продуктов (Андрей Маглиас, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/ISPMA_%E2%80%94_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B8_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80%D0%BE%D0%B2_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2_(%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9_%D0%9C%D0%B0%D0%B3%D0%BB%D0%B8%D0%B0%D1%81,_ProductCampSPB-2012)"/>
				<updated>2012-04-06T14:14:47Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: Новая страница: «== Аннотация == ;Докладчик: [mailto:andrey.maglyas@lut.fi  Андрей Маглиас] &amp;lt;blockquote&amp;gt; &amp;lt;/blockquote&amp;gt;   == Видео ==  {{vimeoem...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4_%D0%BE%D1%82_%D1%85%D0%B0%D0%BE%D1%81%D0%B0_%D0%BA_%D0%BF%D0%BB%D0%B0%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E,_%D0%B8%D0%BB%D0%B8_%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B_%D1%80%D0%BE%D1%81%D1%82%D0%B0_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82-%D0%BE%D1%82%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2_%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8_%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B9_(%D0%AF%D0%BD%D0%B0_%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B8%D0%BD%D0%B0,_ProductCampSPB-2012)</id>
		<title>Переход от хаоса к планированию, или проблемы роста интернет-отделов внутри компаний (Яна Москвина, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4_%D0%BE%D1%82_%D1%85%D0%B0%D0%BE%D1%81%D0%B0_%D0%BA_%D0%BF%D0%BB%D0%B0%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E,_%D0%B8%D0%BB%D0%B8_%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B_%D1%80%D0%BE%D1%81%D1%82%D0%B0_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82-%D0%BE%D1%82%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2_%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8_%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B9_(%D0%AF%D0%BD%D0%B0_%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B8%D0%BD%D0%B0,_ProductCampSPB-2012)"/>
				<updated>2012-04-06T14:02:18Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9A%D0%BE%D1%80%D0%BF%D0%BE%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%B8%D0%BD%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D0%BE%D1%80_-_%D0%BF%D1%83%D1%82%D1%8C_%D0%BA_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D1%83_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%91%D0%B5%D0%BB%D0%BE%D0%B4%D0%B5%D0%B4,_ProductCampSPB-2012)</id>
		<title>Корпоративный инкубатор - путь к продуктоводству (Роман Белодед, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9A%D0%BE%D1%80%D0%BF%D0%BE%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%B8%D0%BD%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D0%BE%D1%80_-_%D0%BF%D1%83%D1%82%D1%8C_%D0%BA_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D1%83_(%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD_%D0%91%D0%B5%D0%BB%D0%BE%D0%B4%D0%B5%D0%B4,_ProductCampSPB-2012)"/>
				<updated>2012-04-06T13:51:05Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9A%D0%B0%D0%BA_%D0%BD%D0%B5_%D0%BD%D0%B0%D0%B4%D0%BE_%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C_%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(%D0%A2%D0%B0%D1%82%D1%8C%D1%8F%D0%BD%D0%B0_%D0%90%D0%B2%D0%BB%D0%BE%D1%87%D0%B8%D0%BD%D1%81%D0%BA%D0%B0%D1%8F,_ProductCampSPB-2012)</id>
		<title>Как не надо делать мобильные приложения (Татьяна Авлочинская, ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9A%D0%B0%D0%BA_%D0%BD%D0%B5_%D0%BD%D0%B0%D0%B4%D0%BE_%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C_%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(%D0%A2%D0%B0%D1%82%D1%8C%D1%8F%D0%BD%D0%B0_%D0%90%D0%B2%D0%BB%D0%BE%D1%87%D0%B8%D0%BD%D1%81%D0%BA%D0%B0%D1%8F,_ProductCampSPB-2012)"/>
				<updated>2012-04-06T09:19:21Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%9C%D0%B5%D0%B3%D0%B0%D0%BF%D0%BB%D0%B0%D0%BD._%D0%9F%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B,_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8,_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0._(ProductCampSPB-2012)</id>
		<title>Мегаплан. Продукты, управление требованиями, команда. (ProductCampSPB-2012)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%9C%D0%B5%D0%B3%D0%B0%D0%BF%D0%BB%D0%B0%D0%BD._%D0%9F%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B,_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8,_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0._(ProductCampSPB-2012)"/>
				<updated>2012-04-06T08:58:05Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: /* Видео */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/%D0%A1%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA%D0%BE%D0%B2._%D0%A1%D1%82%D0%B0%D1%80%D1%82_%D0%B4%D0%B0%D0%BD._%D0%98_%D1%87%D1%82%D0%BE_%D0%B4%D0%B0%D0%BB%D1%8C%D1%88%D0%B5%3F_(%D0%9A%D1%80%D1%83%D0%B3%D0%BB%D1%8B%D0%B9_%D1%81%D1%82%D0%BE%D0%BB,_SQADays-2011)</id>
		<title>Сообщества тестировщиков. Старт дан. И что дальше? (Круглый стол, SQADays-2011)</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A1%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA%D0%BE%D0%B2._%D0%A1%D1%82%D0%B0%D1%80%D1%82_%D0%B4%D0%B0%D0%BD._%D0%98_%D1%87%D1%82%D0%BE_%D0%B4%D0%B0%D0%BB%D1%8C%D1%88%D0%B5%3F_(%D0%9A%D1%80%D1%83%D0%B3%D0%BB%D1%8B%D0%B9_%D1%81%D1%82%D0%BE%D0%BB,_SQADays-2011)"/>
				<updated>2012-04-06T08:48:13Z</updated>
		
		<summary type="html">&lt;p&gt;StasFomin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	</feed>