<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Просто про веб технологии &#187; Clear Code</title>
	<atom:link href="http://pro100pro.com/category/complete_code/feed" rel="self" type="application/rss+xml" />
	<link>http://pro100pro.com</link>
	<description>Про PHP, MySQL, Sphinx и Zend Framework, про архитектуру и производителность, про высокие нагрузки и масштабирование</description>
	<lastBuildDate>Fri, 10 Sep 2010 07:31:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ускоряем PHP с HipHop</title>
		<link>http://pro100pro.com/uskoryaem-php-s-hiphop</link>
		<comments>http://pro100pro.com/uskoryaem-php-s-hiphop#comments</comments>
		<pubDate>Thu, 04 Feb 2010 10:09:01 +0000</pubDate>
		<dc:creator>Yaroslav Vorozhko</dc:creator>
				<category><![CDATA[HipHop]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[C plus plus]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Zend Engine]]></category>

		<guid isPermaLink="false">http://pro100pro.com/?p=417</guid>
		<description><![CDATA[Сегодня Facebook анонсировал релиз HipHop.
Коротко, что такое HipHop для PHP:

HipHop &#8211; это компилятор кода PHP в C++. Т.е. он преобразует PHP код в C++ код для дальнейшей компиляции. Это не другой язык. И это не компилятор времени исполнения (JIT).
HipHop будет выпущен Facebook под opensource лицензией, под такой же как и основной код PHP. Facebook возлагает [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://developers.facebook.com/news.php?blog=1&amp;story=358">Сегодня Facebook анонсировал релиз HipHop</a>.</p>
<p>Коротко, что такое HipHop для PHP:</p>
<ul>
<li>HipHop &#8211; это компилятор кода PHP в C++. Т.е. он преобразует PHP код в C++ код для дальнейшей компиляции. Это не другой язык. И это не компилятор времени исполнения (JIT).</li>
<li>HipHop будет выпущен Facebook под opensource лицензией, под такой же как и основной код PHP. Facebook возлагает надежды, что разработчики улучшать HipHop и расширят его функциональность, таким образом HipHop сможет заменить больший набор функций PHP.</li>
<li>HipHop был одним из проектов в Facebook по улучшению его производительности. Все таки Facebook, второй сайт по объему траффика в интерент и в основном построенный на PHP. HipHop запущен на большинстве LAMP PHP серверах Facebook и в среднем улучшил производительность этих серверов в два раза.</li>
<li>HipHop достигает этого, путем исследования вашего PHP приложения и на его основе строить C++ проект. C++ проект потом компилируется и запускается на собственном веб серврере. Это дает возможность исключить PHP Zend engine и Apache из цепочки.</li>
<li>Учитывая что, некоторые возможности PHP не поддерживаются. Также, дополнения к PHP написанные на C, должны быть переписаны в HipHop C++ дополнения.</li>
<li>Преимущества в скороости HipHop достигаются благодаря статическому анализу, который парсит ваш PHP код ищя пути преобразования динамических частей в статические.<br />
Учитывая это, ваше улучшение производительности, может сильно варьроваться &#8211; более структурированный код получить наибольший прирост в производительности.</li>
</ul>
<p>Что значит HipHop для вас:</p>
<ul>
<li>Если ваш проект использует sharing хостинг &#8211; то <strong>ничего</strong>.</li>
<li>Если ваш проект использует 2 или менее серверов &#8211; то <strong>ничего</strong>.</li>
<li>Если у вас нет выделенного development и deployment окружения и у вас нет разработчика знающего C++ &#8211; то <strong>ничего</strong>.</li>
<li>Если вы разработчик open source приложения &#8211; то <strong>немного</strong>.</li>
<li>Если вы shared хостинг компания &#8211; то <strong>немного</strong>.</li>
<li>Если PHP не bottleneck вашего приложения &#8211; то <strong>пока еще ничего</strong>.</li>
<li>Если ваше приложения использует много серверов, и в основном на них работает PHP, а также у вас есть все исходники PHP кода, у вас есть немного знаний C/C++, тогджа ответ <strong>возможно</strong>.</li>
<li>Если вы разрабатываете php framework, то ответ <strong>иногда</strong>.</li>
<li>Если у вас есть сильно-связанные части архитектуры, которые удовлетворяют требованиям выше и эти части слабо связаны (через API) с остальной системой, то ответ <strong>много</strong> <strong>что</strong>.</li>
<li>Если вы обдумываете какой язык выбрать для реализации вашей системы, то ответ <strong>очень много</strong>.</li>
<li>Если вы обдумываете аргумент, переписать весь сайт на другой язык, то <strong>вы потеряли свой аргумент</strong>.</li>
</ul>
<p>Есть очень много языковы возможностей, хороших или плохих, которые PHP должен поддерживать, а HipHop нет. Потому как HipHop уникальное решение, он <strong>никгода</strong> не заменит Zend Engine.</p>
<p>Статья является частичным переводом статьи Terry Chay <a href="http://terrychay.com/article/hiphop-for-faster-php.shtml">Faster PHP fo shizzle—HipHop for PHP</a></p>
<hr />
<p><small>© Yaroslav Vorozhko  for <a href="http://pro100pro.com">Просто про веб технологии</a>, 2010. |
<a href="http://pro100pro.com/uskoryaem-php-s-hiphop">Permalink</a> |
<a href="http://pro100pro.com/uskoryaem-php-s-hiphop#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://pro100pro.com/uskoryaem-php-s-hiphop&title=Ускоряем PHP с HipHop">del.icio.us</a>
<br/>
Post tags: <a href="http://pro100pro.com/tag/c-plus-plus" rel="tag">C plus plus</a>, <a href="http://pro100pro.com/tag/facebook" rel="tag">Facebook</a>, <a href="http://pro100pro.com/tag/hiphop" rel="tag">HipHop</a>, <a href="http://pro100pro.com/tag/performance" rel="tag">Performance</a>, <a href="http://pro100pro.com/tag/php" rel="tag">PHP</a>, <a href="http://pro100pro.com/tag/zend-engine" rel="tag">Zend Engine</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://pro100pro.com/uskoryaem-php-s-hiphop/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Введение в Unit тестрование на Zend Framework 1.8+</title>
		<link>http://pro100pro.com/vvedenie_unit_testing_on_zend_framework_1_8</link>
		<comments>http://pro100pro.com/vvedenie_unit_testing_on_zend_framework_1_8#comments</comments>
		<pubDate>Mon, 02 Nov 2009 06:06:07 +0000</pubDate>
		<dc:creator>Yaroslav Vorozhko</dc:creator>
				<category><![CDATA[Clear Code]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[ZendFramework]]></category>

		<guid isPermaLink="false">http://pro100pro.com/?p=363</guid>
		<description><![CDATA[Michelangelo van Dam написал краткое введение в Unit тестрование на Zend Framework 1.8+.
Так как версия Zend Framwork 1.8 была сильно переработана, то по сути это первое руководство описывающее как писать Unit тесты в ZF 1.8+.
Начиная с этого момента, можно сказать, что теперь разработчикам не на что жаловаться &#8211; руководство есть, начинаем писать тесты. :)

© Yaroslav [...]]]></description>
			<content:encoded><![CDATA[<p>Michelangelo van Dam написал краткое <a href="http://www.dragonbe.com/2009/11/unit-testing-with-zend-framework-18.html">введение в Unit тестрование на Zend Framework 1.8+</a>.<br />
Так как версия Zend Framwork 1.8 была сильно переработана, то по сути это первое руководство описывающее как писать Unit тесты в ZF 1.8+.<br />
Начиная с этого момента, можно сказать, что теперь разработчикам не на что жаловаться &#8211; руководство есть, начинаем писать тесты. :)</p>
<hr />
<p><small>© Yaroslav Vorozhko  for <a href="http://pro100pro.com">Просто про веб технологии</a>, 2009. |
<a href="http://pro100pro.com/vvedenie_unit_testing_on_zend_framework_1_8">Permalink</a> |
<a href="http://pro100pro.com/vvedenie_unit_testing_on_zend_framework_1_8#comments">2 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://pro100pro.com/vvedenie_unit_testing_on_zend_framework_1_8&title=Введение в Unit тестрование на Zend Framework 1.8+">del.icio.us</a>
<br/>
Post tags: <br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://pro100pro.com/vvedenie_unit_testing_on_zend_framework_1_8/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Мифы PHP оптимизации</title>
		<link>http://pro100pro.com/mifi-php-optimizacii</link>
		<comments>http://pro100pro.com/mifi-php-optimizacii#comments</comments>
		<pubDate>Tue, 11 Aug 2009 08:55:48 +0000</pubDate>
		<dc:creator>Yaroslav Vorozhko</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[myths]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[php4]]></category>
		<category><![CDATA[PHP5]]></category>

		<guid isPermaLink="false">http://pro100pro.com/?p=224</guid>
		<description><![CDATA[Одни оптимизации полезны, другие просто пустая трата времени.
Вот пример наиболее частых заблуждений:
а. echo быстрее чем print
Echo может быть быстрее, так как оно не возвращает значение. Но, в моем бенчмарке преимущество было очень мало. А, в некоторых ситуациях print будет быстрее echo, например когда ob_start включен.
б. меньше комментариев ускоряет код
Если вы используете кеширование opcodes, то комментарии [...]]]></description>
			<content:encoded><![CDATA[<p>Одни оптимизации полезны, другие просто пустая трата времени.<br />
Вот пример наиболее частых заблуждений:</p>
<p><strong>а. echo быстрее чем print</strong><br />
Echo может быть быстрее, так как оно не возвращает значение. Но, в моем бенчмарке преимущество было очень мало. А, в некоторых ситуациях print будет быстрее echo, например когда ob_start включен.</p>
<p><strong>б. меньше комментариев ускоряет код</strong><br />
Если вы используете кеширование opcodes, то комментарии уже игнорируются. Этот миф идет от PHP3, когда каждая строка PHP интерпретировалась во время исполнения.</p>
<p><strong>в. 'var='.$var быстрее чем, "var=$var"</strong><br />
Так было до версии 4.2 и было исправлено в версии 4.3.</p>
<p><strong>Ускоряет ли код использование ссылок?</strong><br />
Ссылки не дают преимущества строковым, целым и другим базовым типам данных.<br />
Например:</p>
<div class="igBar"><span id="lphp-5"><a href="#" onclick="javascript:showPlainTxt('php-5'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-5">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">function</span> TestRef<span style="color:#006600; font-weight:bold;">&#40;</span>&amp;<span style="color:#0000FF;">$a</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$b</span> = <span style="color:#0000FF;">$a</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$c</span> = <span style="color:#0000FF;">$a</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$one</span> = <span style="color:#CC66CC;color:#800000;">1</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">ProcessArrayRef<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$one</span><span style="color:#006600; font-weight:bold;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
И тот же самый код без ссылки.</p>
<div class="igBar"><span id="lphp-6"><a href="#" onclick="javascript:showPlainTxt('php-6'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-6">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">function</span> TestNoRef<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$a</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$b</span> = <span style="color:#0000FF;">$a</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$c</span> = <span style="color:#0000FF;">$a</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$one</span> = <span style="color:#CC66CC;color:#800000;">1</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">ProcessArrayNoRef<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$one</span><span style="color:#006600; font-weight:bold;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
PHP не создает дубликат переменной "отправленной по значению", вместо этого он использует внутренних высокоскоростной подсчет ссылок. Поэтому в TestRef(), $b и $c будут дольше устанавливаться, так как надо вести "трэкинг" ссылок, в то время как в TestNoRef(), $b и $c сразу будут ссылаться на исходное значение $a, а значение счетчика ссылок будет инкрементировано.<br />
В сравнении, функции которые принимают массивы и объекты, работают быстрее тех, которых принимают ссылки. Потому что, массивы и объекты не используют подсчет ссылок, а используется оригинальное значение переданное в параметре.<br />
Например:</p>
<div class="igBar"><span id="lphp-7"><a href="#" onclick="javascript:showPlainTxt('php-7'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-7">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">function</span> ObjRef<span style="color:#006600; font-weight:bold;">&#40;</span>&amp;<span style="color:#0000FF;">$o</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$a</span> =<span style="color:#0000FF;">$o</span>-&gt;<span style="color:#006600;">name</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
медленнее чем:</p>
<div class="igBar"><span id="lphp-8"><a href="#" onclick="javascript:showPlainTxt('php-8'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-8">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">function</span> ObjRef<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$o</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000FF;">$a</span> = <span style="color:#0000FF;">$o</span>-&gt;<span style="color:#006600;">name</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
Примечание: в PHP5 все объекты передаются по ссылке, и нет необходимости устанавливать знак '&#038;' в списке параметров. Производительность работы с объектами в PHP5 значительно выше, чем в php4.</p>
<hr />
<p><small>© Yaroslav Vorozhko  for <a href="http://pro100pro.com">Просто про веб технологии</a>, 2009. |
<a href="http://pro100pro.com/mifi-php-optimizacii">Permalink</a> |
<a href="http://pro100pro.com/mifi-php-optimizacii#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://pro100pro.com/mifi-php-optimizacii&title=Мифы PHP оптимизации">del.icio.us</a>
<br/>
Post tags: <a href="http://pro100pro.com/tag/myths" rel="tag">myths</a>, <a href="http://pro100pro.com/tag/optimization" rel="tag">optimization</a>, <a href="http://pro100pro.com/tag/php" rel="tag">PHP</a>, <a href="http://pro100pro.com/tag/php4" rel="tag">php4</a>, <a href="http://pro100pro.com/tag/php5" rel="tag">PHP5</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://pro100pro.com/mifi-php-optimizacii/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Читай код</title>
		<link>http://pro100pro.com/read-code</link>
		<comments>http://pro100pro.com/read-code#comments</comments>
		<pubDate>Fri, 08 May 2009 09:16:08 +0000</pubDate>
		<dc:creator>Yaroslav Vorozhko</dc:creator>
				<category><![CDATA[Clear Code]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[reverse engineering]]></category>
		<category><![CDATA[архитектура]]></category>

		<guid isPermaLink="false">http://pro100pro.com/?p=180</guid>
		<description><![CDATA[Интересная статья описывающая важность умения читать код и документации.
Когда я заступил на работу в компанию CQG в конце 1999 года, у меня уже был, как мне казалось, достаточно большой опыт в разработке ПО – три года создания корпоративных приложений БД под заказ. Мне уже казалось, что я очень много знаю и умею, и я был [...]]]></description>
			<content:encoded><![CDATA[<p>Интересная статья описывающая важность умения читать код и документации.</p>
<p>Когда я заступил на работу в компанию CQG в конце 1999 года, у меня уже был, как мне казалось, достаточно большой опыт в разработке ПО – три года создания корпоративных приложений БД под заказ. Мне уже казалось, что я очень много знаю и умею, и я был крайне самоуверен. Однако, возникла некоторая загвоздка – CQG не являлось приложением баз данных, основанном на комбинации готовых сторонних технологий, таких как MS SQL сервер, Visual Basic, Delphi, JavaScript, и 1C – к которым я привык. Меня потряс объем приложения – почти 50 мегабайт основных исходников, не считая свистулек, прибамбасов, разного рода служебных и системных штук, по размеру почему-то превосходящих размер основных исходников.</p>
<p>Это был действительно серьезный и успешный программный комплекс, разрабатывавшийся десятками людей на тот момент на протяжении десяти лет, целиком написанный на С++, со своим собственным специализированным сервером БД, собственным встроенным языком программирования, собственным толстым клиентом, умеющим все, что может и не может пожелать трейдер, отказоустойчивый, работающий в реальном времени, сервера которого развернуты на ферме из сотен компьютеров и обслуживали порядка десятка тысяч пользователей одновременно.</p>
<p>Задание, которое мне было выдано, предполагало модификацию движка обработки данных и сервера, подкупало своей простотой, и практически свело меня с ума – завершить его я смог только через 7 месяцев после начала работ, после того, как прослушал лекции по архитектуре данного комплекса. Что характерно, после лекций пришлось выкинуть все, что я написал до них, и за два месяца сделать правильно.</p>
<p>В этот раз, перед тем, как что-либо писать, я предусмотрительно показал свой предварительный дизайн (подход к решению проблемы) Толу Корину (Tal Korin), автору и главному архитектору данной системы, и он направил меня в правильном направлении. У Тола ушло на это 5 минут. Это был первый случай, когда я сам инициировал дизайн-ревью (не зная, как оно называется), и был рад найденным у меня проблемам. После успешного выполнения данного задания я поступил в распоряжение Тола Корина, поскольку, с его слов и к моему безмерному удивлению, я оказался одним из немногих, кому пошли впрок лекции по архитектуре.</p>
<p>Каких-либо иллюзий на свой счет, меж тем, к тому моменту у меня уже не осталось – я понял, что цена всем моим знаниям, университетскому образованию, и опыту – ломаный грош. Меня поражал простой факт – я был объективно образован в Computer Science гораздо лучше Тола, и _знал_ больше. При этом, и, после некоторого опыта работы, я был в этом абсолютно уверен – я бы не смог спроектировать и реализовать такую систему за год, как это десять лет назад с одним помощником сделал Тол. Сложность системы явно превосходила мои возможности - я бы по ходу работы закопался в деталях. И уж тем более, у меня не получилось сделать систему так гибко, чтобы она прожила 10 лет, и была до сих пор адекватна ситуации.</p>
<p>То есть, до меня начало доходить, что есть нечто очень важное, что совершенно перпендикулярно университетскому образованию, чего нас просто не учили даже замечать. Оно перпендикулярно «дизайн-паттернам» и книгам по ОО проектированию. И оно, это нечто, у Тола есть, а у меня – нет. Если мои знания не могут мне помочь сделать такую систему – то много ли они стоят? Понимание и знание требуется для действия, ни для чего другого – это не китайская декоративная ваза.</p>
<p>С этого момента я начал внимательно наблюдать за Толом, изучать его решения и подход, и твердо решил разобраться, что же это такое за неуловимая штука, которой я не понимаю. То есть, я «записался в ученики», и Тол с удовольствием взял роль наставника. И за несколько лет Тол сделал меня инженером, показав мне на практике, что это такое, и за что я ему буду всегда благодарен.</p>
<p>По большей части это напоминало дзен, когда вам дают задание, разрывающее мозг, вроде хлопка одной ладонью, и через некоторое время вы неожиданно ловите просветление. Удивительный опыт. Вот один небольшой пример, на что это было похоже.<br />
- Тол, скажи, а как работает вот эта штука.<br />
- Влад, вот этого я на самом деле не знаю. А ты почитай код, и разберись!<br />
- Тол, ты издеваешься надо мной?! Здесь пятьдесят мегабайт этого гребанного недокументированного кода! Ты знаешь все Тол, и это ни для кого не секрет.<br />
- Хорошо, смотри, – не стал спорить Тол, - Я тебе говорю – я не знаю, и поэтому я должен сам почитать код, чтобы ответить на твой вопрос. Поэтому, я открываю код.<br />
Тол открывает правильный файл в одну попытку, продираясь через файловую систему, не пользуясь класс-браузером, мотает файл в правильную середину.<br />
- Так. Ты сказал, вот эта фигня? Вот, открыл. Так… Тебе нужен вот этот метод. Читаем. Вот, смотри, он вызывает вот этого парня (так Тол называл классы и объекты – look – now this guy tell that guy to do this thing). Видишь? Вот, происходит тут то-то и то-то. Все просто.<br />
- Спасибо, Тол! Теперь все ясно. А говорил – не знаешь!<br />
- Я тебе говорю – код читай, блин! Все то же самое ты можешь сделать сам!<br />
- Тол, ну в нем же нихрена не понятно без документации, - сказал я, будучи совершенно уверен, что я не смогу сделать того же сам. Происходящее напоминало ловкий фокус.<br />
- Тебе, чтобы читать код, нужна документация? Прости – какая?<br />
- Ну, там, диаграммы классов, например.<br />
- У нас была одна, вроде, составленная лет пять назад. Она сейчас, мягко говоря, не соответствует действительности. Сам понимаешь, у нас 50 инженеров, и разработка идет очень активная. Но если ты уверен, что она тебе поможет, я могу поискать, – участливо смотрит на меня Тол, - ну так что, искать?<br />
- Не, устаревшая, мне, пожалуй, не поможет, - подумав, ответил я, - это ж я все равно должен весь код изучить, чтобы понять, где ей можно доверять, а где нет.<br />
- На самом деле, я не уверен, что тебе сильно поможет даже новая, и поэтому я тебе и говорю: код – лучшая документация! – терпеливо разъясняет Тол, - Она _всегда_ актуальна, и _никогда_ не устаревает, помимо того, что более информативна чем диаграмма классов, конечно.<br />
- Хорошо, я понял, а может, ты мне еще объяснишь, вот в этом месте как работает…<br />
- Нет. Это ты мне объяснишь, после того, как прочтешь. Мне как раз надо скоро будет туда правки вносить. Давай, парень, я не тебя рассчитываю. Иди - читай код.<br />
- Хорошо, Тол, – обреченно сказал я, и пошел читать код.</p>
<p>Да, надо сказать, я тогда немного обиделся на Тола, я думал, что он нифига не понимает. И долгое время считал, что он был не прав. Как-то года через три ко мне подошел коллега, с вопросом. Я был утомлен от работы, голова соображала вяло. К этому моменту я выкинул все свои диаграммы классов, за ненадобностью – зачем на них смотреть, если они давно уже в голове?</p>
<p>- Слушай, Влад, не поможешь, объясни, как работает вот эта подсистема?<br />
Я вяло поднимаю глаза на коллегу, вижу безнадежность в его взгляде, тяжело вздыхаю, и решаю ему помочь. Хоть я ничего и не понимаю в этой подсистеме – так, рядом проходил.<br />
- Хорошо, смотри, – тут я «вслепую», без всяких класс-браузеров, продираюсь к «правильному» файлу, открываю его, и поиском нахожу нужный метод, - видишь, вот здесь что происходит?</p>
<p>Я читаю код, без труда восстанавливая логику поведения и структуру программы в уме, и одновременно простыми словами объясняю это коллеге. Тут у меня в голове что-то перещелкивает, и я с изумлением вспоминаю наш разговор с Толом трехлетней давности, сознание у меня как бы раздваивается, и я наблюдаю за собой со стороны.</p>
<p>- Вот, видишь, как все просто, - заканчиваю я. И к своему чудовищному удивлению добавляю, то, что надо сказать, потому что это правда:<br />
- А вообще - читай код. Код – лучшая документация. Ты вот думаешь, я разбираюсь в этой подсистеме? Нет, я этот код вижу в первый раз, так же как и ты.<br />
- Но этот код совершенно не документирован! Диаграммы хоть какие-нибудь бы!<br />
- Смотри, - говорю я улыбаясь, окончательно осознавая, что Тол в очередной раз, как и всегда, оказался прав, - вот я запускаю Rational Rose, где у меня всосана вся наша система в режиме reverse engineering, и бросаю на чистый лист эти пять классов. Видишь? Вот тебе свежая, актуальная диаграмма. Какой смысл тратить усилия на документирование того, что устаревает за год, и может быть в любой момент восстановлено за пару минут? Если она тебе сильно поможет, я сейчас ее тебе распечатаю. Распечатать?<br />
- Да нет, пожалуй, - задумчиво отвечает коллега, рассматривая диаграмму. Ясности она не добавляла.<br />
- Вот. Диаграммы не стоят ничего, ценны мыслительные процессы, происходящие у тебя в голове в процессе их составления. Поэтому я и говорю: код – лучшая документация. Читай код.</p>
<p>Разумеется, Тол хотел мне показать не только и не столько практическую бесполезность проектной документации, как это могло показалось на первый взгляд. Философия "код - лучшая документация" дает гораздо большее, чем отсутствие документации. Это необходимое ограничение, только приняв и осознав которое, и в результате - рассчитывая только на свои силы, понимая - что код - основной источник информации, его нельзя боятся, с ним надо столкнуться в лоб, и этого не получится избежать, обойти, и перепрыгнуть, - можно достичь мастерства в reverse engineering и вообще понять, что это такое.</p>
<p>Создать свою структуру и пришлепать ее сбоку может любой дурак. Квалифицированный инженер-программист (с упором на первом слове, не путать с "программером") умеет проводить анализ "чужой" подсистемы, восстановит мысль и идею автора, сможет мысль автора развить, продолжить ее, и эффективно решить свою задачу в рамках чужого подхода к проблеме. Все это - работая с кодом. Это отличительная компетенция архитектора, высший уровень инженерного мастерства. И это имеет весьма отдаленное отношение к "рефакторингу".</p>
<p>Толу на самом деле было все равно, есть документация или нет. В совершенстве владея reverse engineering, он в уме потрясающе легко умел переходить от кода к архитектуре, и наоборот. В результате, проектируя, он всегда детально представлял, в какой код превратятся его мысли, и поэтому был способен быстро прокручивать в голове огромное количество вариантов, отбрасывая "плохие". В его понимании, архитектор, не умеющий читать чужой код с "листа", и не пишущий своего - подобен инвалиду, пытающемуся бегать на костылях. Он довольно быстро закончит очень плохим архитектором - вопрос нескольких лет.</p>
<p>Второй важный аспект этой философии - понимание того, что код пишется в первую очередь для человека, и только во вторую - для компьютера. Это приводит нас к идеям, близким по духу к literate programming, за которое ратует Кнут. Как может человек, который не в состоянии внятно выразить свою мысль на неформальном, знакомом ему с детства естественном языке, выразить эту же мысль понятным образом на существенно более формальном языке программирования? Но это уже другая история.</p>
<p>Оригинал статьи здесь: <a href="http://gaperton.livejournal.com/32772.html">http://gaperton.livejournal.com/32772.html</a></p>
<hr />
<p><small>© Yaroslav Vorozhko  for <a href="http://pro100pro.com">Просто про веб технологии</a>, 2009. |
<a href="http://pro100pro.com/read-code">Permalink</a> |
<a href="http://pro100pro.com/read-code#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://pro100pro.com/read-code&title=Читай код">del.icio.us</a>
<br/>
Post tags: <a href="http://pro100pro.com/tag/development" rel="tag">Development</a>, <a href="http://pro100pro.com/tag/reverse-engineering" rel="tag">reverse engineering</a>, <a href="http://pro100pro.com/tag/architectura" rel="tag">архитектура</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://pro100pro.com/read-code/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clickjacking новая техника взлома веб сайтов</title>
		<link>http://pro100pro.com/clickjacking-tehnika-vzloma-saita</link>
		<comments>http://pro100pro.com/clickjacking-tehnika-vzloma-saita#comments</comments>
		<pubDate>Fri, 13 Feb 2009 10:26:53 +0000</pubDate>
		<dc:creator>Yaroslav Vorozhko</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Clickjacking]]></category>
		<category><![CDATA[взлом сайта]]></category>

		<guid isPermaLink="false">http://pro100pro.com/?p=162</guid>
		<description><![CDATA[Техника Clickjacking заключается в создании специального iFrame с помощью CSS и Javascript, который загрузит вредоносный код.

С помощью Clickjacking взломщик может получить доступ к учетной записи пользователя или к данным его компьютера.]]></description>
			<content:encoded><![CDATA[<p>Техника Clickjacking заключается в создании специального iFrame с помощью CSS и Javascript, который создает кнопку-подделку. По нажатию на эту кнопку в невидимый iframe загрузится специальная страница с вредоносным кодом. Спрятанная страница может быть подделкой текущей и заставить юзера делать, то что он не желал, например заново пройти аутентификацию, для считывания его регистрационных данных. Бороться против этого на данном этапе уже поздно.</p>
<p>На данный момент FireFox не имеет методов борьбы с ClickJacking, но вы можете установить расширение No-Script который имеет новую возможность ClearClick и защищает пользователя от данного типа атаки.</p>
<p>InternetExplorer также не имеет никакой техникик защиты, только в IE8 появилась частичная защита от ClickJacking.</p>
<p>Будте бдительны нажимая на интригующие кнопки обманки и ставте себе No-Script.</p>
<p><a href="http://en.wikipedia.org/wiki/Clickjacking">Clickjacking on Wiki </a></p>
<p><a href="http://shiflett.org/blog/2009/feb/twitter-dont-click-exploit">Twitter пострадал от ClickJacking</a></p>
<p><a href="http://beerpla.net/2009/02/12/how-to-fight-clickjacking-using-the-recent-twitter-hijacking-as-an-example/">Как бороться с ClickJacking</a></p>
<hr />
<p><small>© Yaroslav Vorozhko  for <a href="http://pro100pro.com">Просто про веб технологии</a>, 2009. |
<a href="http://pro100pro.com/clickjacking-tehnika-vzloma-saita">Permalink</a> |
<a href="http://pro100pro.com/clickjacking-tehnika-vzloma-saita#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://pro100pro.com/clickjacking-tehnika-vzloma-saita&title=Clickjacking новая техника взлома веб сайтов">del.icio.us</a>
<br/>
Post tags: <a href="http://pro100pro.com/tag/clickjacking" rel="tag">Clickjacking</a>, <a href="http://pro100pro.com/tag/vzlom-saita" rel="tag">взлом сайта</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://pro100pro.com/clickjacking-tehnika-vzloma-saita/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XtraDB новый Storage Engine от Percona</title>
		<link>http://pro100pro.com/xtradb-novyi-storage-engine-percona</link>
		<comments>http://pro100pro.com/xtradb-novyi-storage-engine-percona#comments</comments>
		<pubDate>Tue, 23 Dec 2008 12:17:02 +0000</pubDate>
		<dc:creator>Yaroslav Vorozhko</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Percona]]></category>
		<category><![CDATA[XtraDB]]></category>

		<guid isPermaLink="false">http://pro100pro.com/?p=136</guid>
		<description><![CDATA[Новый движок XtraDB был выпущен Percona как замена стандартного InnoDB.
Percona XtraDB включает всю InnoDB ACID-совместимую архитектуру и расширенную MVCC архитектуру, добавлены новые возможности, более тюнингована, более информативна, более масштабируема на мульти-процессорных системах, и с улучшенной системой использования оперативной памяти.]]></description>
			<content:encoded><![CDATA[<p>Новый движок <strong>XtraDB </strong>был выпущен Percona как замена стандартного InnoDB.</p>
<p>XtraDB на 100% совместим с InnoDB, поэтому вы можете использовать его как полную замену InnoDB. XtraDB разрабатывался для улучшения масштабируемости на современном железе, а также включает в себя множество других возможностей и патчей оптимизированных для высоко нагруженных систем.</p>
<p><strong>Percona XtraDB</strong> включает всю InnoDB ACID-совместимую архитектуру и расширенную MVCC архитектуру, добавлены новые возможности, более тюнингована, более информативна, более масштабируема на мульти-процессорных системах, и с улучшенной системой использования оперативной памяти.</p>
<p>Что нового в этом движке? Вот список улучшений:</p>
<ul>
<li><strong>INFORMATION_SCHEMA.XTRADB_ENHANCEMENTS</strong>. Эта таблица содержит информацию про различия XtraDb и той же версии InnoDb.</li>
<li><strong>Улучшения в SHOW INNODB STATUS</strong>.</li>
<li><strong>Улучшения в </strong><strong>InnoDB IO.</strong></li>
<li><strong>InnoDB RW-lock fixes.</strong> Улучшена масштабируемость для систем с 8+ ядер.</li>
<li><strong>Buffer pool fixes</strong></li>
<li><strong>innodb_buffer_pool_pages</strong></li>
</ul>
<p>В общем это сейчас тунингованый InnoDB, только OpenSource. Для комьюнити публичный OpenSource считаю большим плюсом.</p>
<p>Percona сделала и продолжает делать отличную работу по развитию и поддержке MySQL.</p>
<p>Думаю Percona это новая MySQL и уже в скором будущем мы не раз в этом убедимся. :)</p>
<p><a title="Оффициальный анонс XtraDb" href="http://www.mysqlperformanceblog.com/2008/12/16/announcing-percona-xtradb-storage-engine-a-drop-in-replacement-for-standard-innodb/">Оффициальный анонс XtraDB</a></p>
<p><a title="Тесты производительность ввода вывода XtraDB" href="http://www.mysqlperformanceblog.com/2008/12/18/xtradb-benchmarks-15x-gain/">Тесты производительность ввода вывода XtraDB</a></p>
<p><a title="Тесты производительность и нагрузки CPU XtraDB" href="http://www.mysqlperformanceblog.com/2008/12/18/xtradb-in-cpu-bound-benchmark/">Тесты производительности и нагрузки CPU XtraDb</a></p>
<p>Документация по XtraDB <a title="XtraDB документация" href="http://www.percona.com/docs/wiki/percona-xtradb:start">http://www.percona.com/docs/wiki/percona-xtradb:start</a></p>
<p>Исходные коды на XtraDB <a title="XtraDB исходные коды" href="https://launchpad.net/percona-xtradb">https://launchpad.net/percona-xtradb</a></p>
<p>Обсуждения XtraDB и остальных разработок Perocona <a title="Percona Dev groups" href="http://groups.google.com/group/percona-dev">http://groups.google.com/group/percona-dev</a></p>
<hr />
<p><small>© Yaroslav Vorozhko  for <a href="http://pro100pro.com">Просто про веб технологии</a>, 2008. |
<a href="http://pro100pro.com/xtradb-novyi-storage-engine-percona">Permalink</a> |
<a href="http://pro100pro.com/xtradb-novyi-storage-engine-percona#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://pro100pro.com/xtradb-novyi-storage-engine-percona&title=XtraDB новый Storage Engine от Percona">del.icio.us</a>
<br/>
Post tags: <a href="http://pro100pro.com/tag/mysql" rel="tag">MySQL</a>, <a href="http://pro100pro.com/tag/opensource" rel="tag">OpenSource</a>, <a href="http://pro100pro.com/tag/percona" rel="tag">Percona</a>, <a href="http://pro100pro.com/tag/performance" rel="tag">Performance</a>, <a href="http://pro100pro.com/tag/xtradb" rel="tag">XtraDB</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://pro100pro.com/xtradb-novyi-storage-engine-percona/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Рефакторинг для начинающих. Дополнение.</title>
		<link>http://pro100pro.com/refactoring-dlya-nachinaushih-dopolnenie</link>
		<comments>http://pro100pro.com/refactoring-dlya-nachinaushih-dopolnenie#comments</comments>
		<pubDate>Fri, 12 Sep 2008 15:19:43 +0000</pubDate>
		<dc:creator>Yaroslav Vorozhko</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[методы рефакторинга]]></category>
		<category><![CDATA[рефакторинг]]></category>

		<guid isPermaLink="false">http://pro100pro.com/?p=126</guid>
		<description><![CDATA[Это статья дополнение, в которой я попытался описать видимые и невидимые проблемы, которые будут стоять перед программистом при провидении рефакторинга. Я не претендую на полноту изложения, пусть это послужит для вас отправной точкой к профессиональному рефакторингу.]]></description>
			<content:encoded><![CDATA[<p>Хочу сказать спасибо всем, кто дал отзыв в первой части статьи «<a href="/refactoring-dlya-nachinaushih">Рефакторинг для начинающих</a>». Особенно спасибо Yury Veretelnikov, за его (в большинстве случаев) справедливую критику, которая открыла мне глаза на проблемы в оформлении и написании статьи.</p>
<p>Это статья дополнение, в которой я попытался описать видимые и невидимые проблемы, которые будут стоять перед программистом при провидении рефакторинга. Я не претендую на полноту изложения, пусть это послужит для вас отправной точкой к профессиональному рефакторингу.</p>
<p>Кратко содержание:</p>
<ul>
<li>Цель рефакторинга</li>
<li>Простые и сложные методы рефакторинга</li>
<li>Когда начинать рефакторинг?</li>
<li>Как начать рефакторинг?</li>
<li>Как не поломать рабочий код?</li>
<li>Когда рефакторинг не нужен?</li>
<li>Каталог методов рефакторинга и 	примеры рефакторинга</li>
</ul>
<p>А теперь кратко по каждому пункту.</p>
<h2>Цель рефакторинга</h2>
<p>Определите задачи, которые перед вами стоят, в большинстве случаев это упрощение ввода новых функций. Но, есть еще и другие цели. Профессиональные программисты знакомые с паттернами проектирования стараются привести структуру кода в порядок в соответствии с подходящими паттернами для улучшения поддержки, расширяемости и повторного использования кода.</p>
<p>Вы также можете использовать автоматизированные средства поиска кода подлежащего рефакторингу, это могут быть функции с большим количеством аргументов или слишком длинные функции. С помощью автоматических средств можно также  выявлять структурное сходство различных методов. Такие функции являются кандидатами на проведение рефакторинга.</p>
<h2>Простые и сложные методы рефакторинга</h2>
<p>Простые методы рефакторинга — это базовые, фундаментальные методы применяемые в рефакторинге. Например это: выделение метода, перемещение поля класса, выделение класса, переименование метода, класса или поля и т.д.</p>
<p>Учите простые методы рефакторинга, так как это фундамент на основе которого строится любой вид рефакторинга. Нельзя начать рефакторинг не зная фундаментальные методы.</p>
<p>Сложные методы рефакторинга — это по сути комбинация простых методов, но решающих одну базовую задачу. Пример сложного метода рефакторинга может быть:  разделение наследования. Который включает в себя: выделение класса, перемещение метода, подъем метода и подъем поля.</p>
<h2>Когда начинать рефакторинг?</h2>
<p>Применяйте рефакторинг при добавлении новой функции. Причина по которой стоит проводить рефакторинг добавляя новую функцию, это возможно несовместимый или неясный дизайн кода для добавления новых функций.</p>
<p>Применяйте рефакторинг, если требуется исправить ошибку. При исправлении ошибок польза рефакторинга в том, что код становиться более понятным. Если мы получаем сообщение об ошибке, то это признак необходимости рефакторинга, потому что код не был достаточно ясным и мы не смогли увидеть ошибку.</p>
<p>Применяйте рефакторинг при разборе кода. Разбор кода это хорошая практика, когда в команде разработчиков, разработчики проверяют код друг друга.</p>
<h2>Как начать рефакторинг?</h2>
<p>Убедитесь, что вы понимаете над какой частью кода вы будете производить рефакторинг. Вы должны четко знать какую часть кода могут затронуть ваши изменения.</p>
<p>Определите методы с помощью которых 	вы будете производить рефакторинг. 	Выпишите эти методы и для каждого 	составьте последовательность шагов, 	которые будет необходимо выполнить. 	Проделайте эту работу один раз для 	каждого метода, чтоб быть уверенным, 	что вы ничего не пропустили. Большинство 	методов рефакторинга уже имеют порядок 	действий и описание применения, 	ознакомьтесь с этими методами и 	применяйте их.</p>
<h2>Как не поломать рабочий код?</h2>
<p>Постройте набор тестов для перерабатываемой части кода. Тесты важны, так как даже при последовательном проведении рефакторинга можно допустить ошибки, тесты помогут вам исключить возможные ошибки.</p>
<p>Проводя рефакторинг можно полагаться на тесты. Если вы допустите ошибку, то тесты сразу же вам об этом сообщат. Старайтесь покрыть тестами достаточную часть кода для работы функции, тесты должны быть как чистые проверяющие вычисления правильных данных, так и грязные, посылающие в тест недопустимые, не ожидаемые данные.</p>
<h2>Когда рефакторинг не нужен?</h2>
<p>Иногда рефакторинг не нужен. Например, когда надо переписать программу с нуля. Иногда имеющийся код настолько запутан, что подвергнуть его рефакторингу, конечно, можно, но проще начат все с самого начала.</p>
<p>Явный признак необходимости переписать код — это его неработоспособность. Это обнаруживается при его тестировании, когда ошибок так много, что сделать код устойчивым не удается.</p>
<p>Другой случай, когда следует воздержаться от рефакторинга, это близость даты завершения. Однако приближение срока окончания работ — единственный случай, когда можно отложить рефакторинг, ссылаясь на недостаток времени.</p>
<h2>Каталог методов рефакторинга и примеры рефакторинга</h2>
<p>Большой каталог методов рефакторинга можно найти на <a href="http://www.refactoring.com/catalog/index.html">refactoring.com</a> вместо примеров кода, тут применяются примеры на языке UML.</p>
<p>Также, хороший <a href="http://en.wikipedia.org/wiki/Refactoring#List_of_refactoring_techniques">каталог методов рефакторинга</a> можно найти на wikipeadia, каждый метод снабжен примером на C#.</p>
<h2>В заключении</h2>
<p>Применение методов рефакторинга требует от вас: хорошего знания ООП, умение писать тесты, быть терпеливым делая рефакторинг небольшими шагами, проверять каждый шаг и постоянно учиться.</p>
<hr />
<p><small>© Yaroslav Vorozhko  for <a href="http://pro100pro.com">Просто про веб технологии</a>, 2008. |
<a href="http://pro100pro.com/refactoring-dlya-nachinaushih-dopolnenie">Permalink</a> |
<a href="http://pro100pro.com/refactoring-dlya-nachinaushih-dopolnenie#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://pro100pro.com/refactoring-dlya-nachinaushih-dopolnenie&title=Рефакторинг для начинающих. Дополнение.">del.icio.us</a>
<br/>
Post tags: <a href="http://pro100pro.com/tag/metody-refactoringa" rel="tag">методы рефакторинга</a>, <a href="http://pro100pro.com/tag/refaktoring" rel="tag">рефакторинг</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://pro100pro.com/refactoring-dlya-nachinaushih-dopolnenie/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Рефакторинг для начинающих</title>
		<link>http://pro100pro.com/refactoring-dlya-nachinaushih</link>
		<comments>http://pro100pro.com/refactoring-dlya-nachinaushih#comments</comments>
		<pubDate>Mon, 08 Sep 2008 19:12:42 +0000</pubDate>
		<dc:creator>Yaroslav Vorozhko</dc:creator>
				<category><![CDATA[Clear Code]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Tips And Tricks]]></category>
		<category><![CDATA[код для людей]]></category>
		<category><![CDATA[мартин фаулер]]></category>
		<category><![CDATA[реорганизация]]></category>
		<category><![CDATA[рефакторинг]]></category>
		<category><![CDATA[уроки кодирования]]></category>

		<guid isPermaLink="false">http://pro100pro.com/?p=125</guid>
		<description><![CDATA[Рефакторинг - это реорганизация существующего кода без изменения функциональности.

Я считаю, что каждый программист должен хорошо владеть таким инструментом как рефакторинг. Хорошее знание рефакторинга поможет вам писать код не только для машин, но и для людей. Такой код легкий в понимании и сопровождении, такой код написан для людей а не для машин, рефакторинг - это одна из ключевых ежедневных обязанностей программиста.]]></description>
			<content:encoded><![CDATA[<p>Рефакторинг - это реорганизация существующего кода без изменения функциональности.</p>
<p>Я считаю, что каждый программист должен хорошо владеть таким инструментом как рефакторинг. Хорошее знание рефакторинга поможет вам писать код не только для машин, но и для людей. Такой код легкий в понимании и сопровождении, такой код написан для людей а не для машин, рефакторинг - это одна из ключевых ежедневных обязанностей программиста.</p>
<p>Вот 7 хороших советов для проведения рефакторинга:</p>
<ol>
<li>Всегда выполняйте рефакторинг короткими шагами с перерывом на перекомпиляцию и запуском тестов. Чем меньше ваши шаги, тем лучше вы локализуете потенциальные ошибки и тем быстрее вы их устраните. То, что ошибки будут можно не сомневаться. ;-)</li>
<li>Проводите рефакторинг снизу вверх, особенно, если у вас длинная и запутанная цепочка наследования классов. Старайтесь всегда сначала производить изменения в потомственных классах, прежде чем приступать к базовым классам.</li>
<li>Вы должны знать основные методы рефакторинга, для этого советую вам купить книгу Мартина Фаулера - "Рефакторинг".</li>
<li>У вас всегда должна быть цель с которой вы производите рефакторинг, не делайте его там где он не нужен или только, если это не первоочередная задача. Чем лучше вы понимаете зачем вы это делаете, тем качественнее будет результат.</li>
<li>Не увлекайтесь рефакторингом, рефакторинг не добавляет функционала в программу, поэтому и каких либо видимых результатов вы также не получите. Делайте перерывы для того, чтоб сделать, что то, что можно увидеть и оценить. Тогда ваш начальник будет вами доволен. :)</li>
<li>Любой вид рефакторинга можно сделать за 5, 20 минут, максимум за один час. Но в основном рефакторинг является комплексной задачей, которая может выполняться в течении недель или месяцев над действующим проектом. Идея в том, что двигаться нужно постепенно и небольшими шагами, и возможно уделяя этому не больше одного часа в день. Это хороший метод рефакторинга, потому как не занимает много времени и убедить начальство в необходимости будет намного проще, ведь 1 час это так мало, не так ли?</li>
<li>В долгосрочной перспективе у вас будет красивый и легко сопровождаемый код, код который написан для людей, а не для машин, код которым вы можете гордиться и показывать в пример, код который работает так как вы этого хотите, и все это за невысокую цену рефакторинга!</li>
</ol>
<hr />
<p><small>© Yaroslav Vorozhko  for <a href="http://pro100pro.com">Просто про веб технологии</a>, 2008. |
<a href="http://pro100pro.com/refactoring-dlya-nachinaushih">Permalink</a> |
<a href="http://pro100pro.com/refactoring-dlya-nachinaushih#comments">7 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://pro100pro.com/refactoring-dlya-nachinaushih&title=Рефакторинг для начинающих">del.icio.us</a>
<br/>
Post tags: <a href="http://pro100pro.com/tag/kod-dlya-ludey" rel="tag">код для людей</a>, <a href="http://pro100pro.com/tag/martin-fauler" rel="tag">мартин фаулер</a>, <a href="http://pro100pro.com/tag/reorganizaciya" rel="tag">реорганизация</a>, <a href="http://pro100pro.com/tag/refaktoring" rel="tag">рефакторинг</a>, <a href="http://pro100pro.com/tag/uroki-kodirovaniya" rel="tag">уроки кодирования</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://pro100pro.com/refactoring-dlya-nachinaushih/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Как выработать хорошую практику кодирования?</title>
		<link>http://pro100pro.com/coding-good-practice</link>
		<comments>http://pro100pro.com/coding-good-practice#comments</comments>
		<pubDate>Wed, 06 Aug 2008 16:13:48 +0000</pubDate>
		<dc:creator>Yaroslav Vorozhko</dc:creator>
				<category><![CDATA[Clear Code]]></category>
		<category><![CDATA[кодирование]]></category>
		<category><![CDATA[хорошая практика]]></category>

		<guid isPermaLink="false">http://pro100pro.com/?p=123</guid>
		<description><![CDATA[Для улучшения практики кодирования можно внедрить в проект технический стандарт. Внедрение такого стандарта со стороны менеджера можеть быть не лучшей идеей. Лучше, если этим человеком будет архитектор, пользующейся уважением. Если этот архитектор считается идейным лидером проекта, то скорее всего команда будет придерживаться стандартов, установленных им. Но, если архитектор - это человек, который уже давно не принимает участие в кодировании, то он не может быть хорошей кандидатурой для внедрения стандарта.]]></description>
			<content:encoded><![CDATA[<h2><strong>Как содействовать выработке хорошей практики кодирования?</strong></h2>
<p>Для улучшения практики кодирования можно внедрить в проект технический стандарт. Внедрение такого стандарта со стороны менеджера можеть быть не лучшей идеей. Лучше, если этим человеком будет архитектор, пользующейся уважением. Если этот архитектор считается идейным лидером проекта, то скорее всего команда будет придерживаться стандартов, установленных им. Но, если архитектор - это человек, который уже давно не принимает участие в кодировании, то он не может быть хорошей кандидатурой для внедрения стандарта.</p>
<h2>Способы достижения хорошего кодирования</h2>
<ul>
<li><em><strong>Назначить двух человек на каждую часть проекта. </strong>У вас как минимум будет гарантия, что хотя бы два человека думают, что код работает.</em></li>
<li><em><strong>Рецензируйте каждую строку кода. </strong>В рецензировании кода участвует программист и как минимум еще два человека. Рецензирование кода улучшает его качество, так как программист знает, что как минимум 2 человека будут читать его код, а также это является страховкой на тот случай если человек покинет проект.</em></li>
<li><em><strong>Введите процедуру подписания кода. </strong>Подписанный код показывает, что программист соотвествует уровню квалификации и только подписанный код считается завершенным.</em></li>
<li><em><strong>Распространяйте для ознакомления хорошие примеры кода. </strong>Это предоставит ясный пример, того качества, которого вы хотите добиться. Никакое описание не передаст более точно, то что можно показать в примере кода.</em></li>
<li><em><strong>Подчеркивайте, что код - это общее имущество. </strong>Иногда программисты считают, что код который они написали - "их" личная собственность. Хотя это результат их работы, но он является частью свего проекта и должен быть доступен любому участнику проекта.</em></li>
<li><em><strong>Награждайте за хороший код. </strong>1. Награда должна представлять интерес для программиста. 2. Код поощряемый таким образом должен быть исключительно хорошим.</em></li>
<li><em><strong>Один простой стандарт. </strong>Если вы управляете программным проектом и в прошлом были программистом, то простым и эффективным способом добиться хорошего результат будет фраза: "Я должен быть в состоянии прочесть и понять любой код написанный в проекте".</em></li>
</ul>
<p style="text-align: right;"><em>Стив Макконнелл. Совершенный код.</em></p>
<p><strong><br />
</strong></p>
<hr />
<p><small>© Yaroslav Vorozhko  for <a href="http://pro100pro.com">Просто про веб технологии</a>, 2008. |
<a href="http://pro100pro.com/coding-good-practice">Permalink</a> |
<a href="http://pro100pro.com/coding-good-practice#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://pro100pro.com/coding-good-practice&title=Как выработать хорошую практику кодирования?">del.icio.us</a>
<br/>
Post tags: <a href="http://pro100pro.com/tag/kodirovanie" rel="tag">кодирование</a>, <a href="http://pro100pro.com/tag/horoshaya-praktika" rel="tag">хорошая практика</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://pro100pro.com/coding-good-practice/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQL Row Format Tuning</title>
		<link>http://pro100pro.com/mysql-row-format-tuning</link>
		<comments>http://pro100pro.com/mysql-row-format-tuning#comments</comments>
		<pubDate>Tue, 18 Mar 2008 09:15:21 +0000</pubDate>
		<dc:creator>Yaroslav Vorozhko</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[blob]]></category>
		<category><![CDATA[char]]></category>
		<category><![CDATA[row format]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[tuning]]></category>
		<category><![CDATA[varchar]]></category>
		<category><![CDATA[динамический формат]]></category>
		<category><![CDATA[кеширование]]></category>
		<category><![CDATA[обновление]]></category>
		<category><![CDATA[производительность]]></category>
		<category><![CDATA[скорость]]></category>

		<guid isPermaLink="false">http://pro100pro.com/mysql-row-format-tuning</guid>
		<description><![CDATA[При создании или модифицировании таблиц используя MyISAM, вы можете запросить MySQL хранить строки в фиксированном или динамическом формате. Если таблица не содержит BLOB и TEXT полей, то фиксированный формат выбирается по умолчанию, который автоматически конвертирует VARCHAR в CHAR. Иначе если выбрать динамический формат, то MySQL конвертирует все колонки из типа CHAR в VARCHAR. 

Для MySQL, фиксированный формат легче в доступе, кешировании и обновлении информации. Также этот формат менее подвержен порче данных. Если дисковое пространство не является критическим, то фиксированный формат будет лучшим выбором.]]></description>
			<content:encoded><![CDATA[<p>При создании или модифицировании таблиц используя MyISAM, вы можете запросить MySQL хранить строки в фиксированном или динамическом формате. Если таблица не содержит BLOB и TEXT полей, то фиксированный формат выбирается по умолчанию, который автоматически конвертирует VARCHAR в CHAR. Иначе, если выбрать динамический формат, то MySQL конвертирует все колонки из типа CHAR в VARCHAR. </p>
<p>Для MySQL, фиксированный формат легче в доступе, кешировании и обновлении информации. Также этот формат менее подвержен порче данных. Если дисковое пространство не является критическим, то фиксированный формат будет хорошим выбором.</p>
<p>Динамический формат использует меньше дискового пространства, но более подвержен риску фрагментации и/или порче данных. </p>
<p>Но давайте сначала посмотрим, на тесты и потом сделаем окончательное заключение.</p>
<p>(...)<br/>Read the rest of <a href="http://pro100pro.com/mysql-row-format-tuning">MySQL Row Format Tuning</a> (291 words)</p>
<hr />
<p><small>© Yaroslav Vorozhko  for <a href="http://pro100pro.com">Просто про веб технологии</a>, 2008. |
<a href="http://pro100pro.com/mysql-row-format-tuning">Permalink</a> |
<a href="http://pro100pro.com/mysql-row-format-tuning#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://pro100pro.com/mysql-row-format-tuning&title=MySQL Row Format Tuning">del.icio.us</a>
<br/>
Post tags: <a href="http://pro100pro.com/tag/blob" rel="tag">blob</a>, <a href="http://pro100pro.com/tag/char" rel="tag">char</a>, <a href="http://pro100pro.com/tag/mysql" rel="tag">MySQL</a>, <a href="http://pro100pro.com/tag/row-format" rel="tag">row format</a>, <a href="http://pro100pro.com/tag/text" rel="tag">text</a>, <a href="http://pro100pro.com/tag/tuning" rel="tag">tuning</a>, <a href="http://pro100pro.com/tag/varchar" rel="tag">varchar</a>, <a href="http://pro100pro.com/tag/dinamicheskiy-format" rel="tag">динамический формат</a>, <a href="http://pro100pro.com/tag/keshirovanie" rel="tag">кеширование</a>, <a href="http://pro100pro.com/tag/obnovlenie" rel="tag">обновление</a>, <a href="http://pro100pro.com/tag/proizvoditelnost" rel="tag">производительность</a>, <a href="http://pro100pro.com/tag/skorost" rel="tag">скорость</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://pro100pro.com/mysql-row-format-tuning/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
