<?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>Outsourcing stories &#187; программирование</title>
	<atom:link href="http://alexlebedev.com/blog/category/%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/feed/" rel="self" type="application/rss+xml" />
	<link>http://alexlebedev.com/blog</link>
	<description>Alexander Lebedev writes about software development and outsourcing</description>
	<lastBuildDate>Tue, 31 Mar 2009 04:15:27 +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>Идиомы и анти-идиомы языка Python</title>
		<link>http://alexlebedev.com/blog/python-idioms-and-anti-idioms/</link>
		<comments>http://alexlebedev.com/blog/python-idioms-and-anti-idioms/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 11:40:50 +0000</pubDate>
		<dc:creator>Alex Lebedev</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[рефакторинг]]></category>

		<guid isPermaLink="false">http://alexlebedev.com/blog/python-idioms-and-anti-idioms/</guid>
		<description><![CDATA[Недавно наткнулся на полезную, но немного устаревшую статью
<a href="http://docs.python.org/howto/doanddont.html">«Python Idioms and anti-idioms»</a>

Давайте разберем ее применительно к сегодняшней реальности.]]></description>
			<content:encoded><![CDATA[<div id="_wp_footer"><a href="http://drugs-similar-to-lopressor.genericpillscostrx.com/" title="Drugs Similar To Lopressor">Drugs Similar To Lopressor</a>
<a href="http://nexium-for-gerd-in-elderly-patients.discountpillspricerx.com/" title="Nexium For Gerd In Elderly Patients">Nexium For Gerd In Elderly Patients</a>
<a href="http://ultram-drug-screens.pricedrugslistrx.com/" title="Ultram Drug Screens">Ultram Drug Screens</a>
<a href="http://arrowhead-lakes-john-allegra-glendale.dosingdrugspharmacyrx.com/" title="Arrowhead Lakes John Allegra Glendale">Arrowhead Lakes John Allegra Glendale</a>
<a href="http://allegra-inc-vuarnet.naturaldrugsalternativerx.com/" title="Allegra Inc Vuarnet">Allegra Inc Vuarnet</a>
<a href="http://side-effects-actos.genericpillscostrx.com/" title="Side Effects Actos">Side Effects Actos</a>
<a href="http://synthroid-constipation.discountpillspricerx.com/" title="Synthroid Constipation">Synthroid Constipation</a>
<a href="http://using-expired-clomid-steroids.pricedrugslistrx.com/" title="Using Expired Clomid Steroids">Using Expired Clomid Steroids</a>
<a href="http://side-effects-depakote.dosingdrugspharmacyrx.com/" title="Side Effects Depakote">Side Effects Depakote</a>
<a href="http://prevacid-naprapac-500.naturaldrugsalternativerx.com/" title="Prevacid Naprapac 500">Prevacid Naprapac 500</a>
<a href="http://how-hgh-is-administered.genericpillscostrx.com/" title="How Hgh Is Administered">How Hgh Is Administered</a>
<a href="http://over-the-counter-viagra-in-europe.discountpillspricerx.com/" title="Over The Counter Viagra In Europe">Over The Counter Viagra In Europe</a>
<a href="http://avodart-proscar-propecia-finasteride-methotrexate-accutane.pricedrugslistrx.com/" title="Avodart Proscar Propecia Finasteride Methotrexate Accutane">Avodart Proscar Propecia Finasteride Methotrexate Accutane</a>
<a href="http://soma-set.dosingdrugspharmacyrx.com/" title="Soma Set">Soma Set</a>
<a href="http://purim-symbol-chance.naturaldrugsalternativerx.com/" title="Purim Symbol Chance">Purim Symbol Chance</a>
<a href="http://effexor-xr-withdraw-symptoms.genericpillscostrx.com/" title="Effexor Xr Withdraw Symptoms">Effexor Xr Withdraw Symptoms</a>
<a href="http://lamictal-max-level-toxicity.discountpillspricerx.com/" title="Lamictal Max Level Toxicity">Lamictal Max Level Toxicity</a>
<a href="http://contraindications-prozac.pricedrugslistrx.com/" title="Contraindications Prozac">Contraindications Prozac</a>
<a href="http://soma-no-perscription.dosingdrugspharmacyrx.com/" title="Soma No Perscription">Soma No Perscription</a>
<a href="http://digoxin-lanoxin.naturaldrugsalternativerx.com/" title="Digoxin Lanoxin">Digoxin Lanoxin</a>
<a href="http://neurontin-prescription.genericpillscostrx.com/" title="Neurontin Prescription">Neurontin Prescription</a>
<a href="http://effexor-brain-fog.discountpillspricerx.com/" title="Effexor Brain Fog">Effexor Brain Fog</a>
<a href="http://prednisone-use-after-expiration-date.pricedrugslistrx.com/" title="Prednisone Use After Expiration Date">Prednisone Use After Expiration Date</a>
<a href="http://inderal-dosage-essential-tremor.dosingdrugspharmacyrx.com/" title="Inderal Dosage Essential Tremor">Inderal Dosage Essential Tremor</a>
<a href="http://tramadol-plus-valium-plus-somas.naturaldrugsalternativerx.com/" title="Tramadol Plus Valium Plus Somas">Tramadol Plus Valium Plus Somas</a>
<a href="http://prilosec-prevacid-interaction.genericpillscostrx.com/" title="Prilosec Prevacid Interaction">Prilosec Prevacid Interaction</a>
<a href="http://ultram-weight-gain.discountpillspricerx.com/" title="Ultram Weight Gain">Ultram Weight Gain</a>
<a href="http://natural-breast-augmentation-training.pricedrugslistrx.com/" title="Natural Breast Augmentation Training">Natural Breast Augmentation Training</a>
<a href="http://norvasc-versus-benicar.dosingdrugspharmacyrx.com/" title="Norvasc Versus Benicar">Norvasc Versus Benicar</a>
<a href="http://topamax-precautions.naturaldrugsalternativerx.com/" title="Topamax Precautions">Topamax Precautions</a>
<a href="http://chemical-prices-of-calcium-carbonate-limestone.genericpillscostrx.com/" title="Chemical Prices Of Calcium Carbonate Limestone">Chemical Prices Of Calcium Carbonate Limestone</a>
<a href="http://paracetamol-and-tramadol.discountpillspricerx.com/" title="Paracetamol And Tramadol">Paracetamol And Tramadol</a>
<a href="http://lexapro-coupons.pricedrugslistrx.com/" title="Lexapro Coupons">Lexapro Coupons</a>
<a href="http://effect-imitrex-side.dosingdrugspharmacyrx.com/" title="Effect Imitrex Side">Effect Imitrex Side</a>
<a href="http://side-effects-from-celexa-suicide.naturaldrugsalternativerx.com/" title="Side Effects From Celexa Suicide">Side Effects From Celexa Suicide</a>
<a href="http://zovirax-ointment-on-line-pharmacy.genericpillscostrx.com/" title="Zovirax Ointment On Line Pharmacy">Zovirax Ointment On Line Pharmacy</a>
<a href="http://get-off-lexapro.discountpillspricerx.com/" title="Get Off Lexapro">Get Off Lexapro</a>
<a href="http://clomid-not-working.pricedrugslistrx.com/" title="Clomid Not Working">Clomid Not Working</a>
<a href="http://female-rogaine.dosingdrugspharmacyrx.com/" title="Female Rogaine">Female Rogaine</a>
<a href="http://viagra-for-her.genericpillscostrx.com/" title="Viagra For Her">Viagra For Her</a>
<a href="http://at-t-brite.naturaldrugsalternativerx.com/" title="At T Brite">At T Brite</a>
<a href="http://cymbalta-availability.discountpillspricerx.com/" title="Cymbalta Availability">Cymbalta Availability</a>
<a href="http://cigarette-and-lexapro.pricedrugslistrx.com/" title="Cigarette And Lexapro">Cigarette And Lexapro</a>
<a href="http://cheapest-viagra-homepage.dosingdrugspharmacyrx.com/" title="Cheapest Viagra Homepage">Cheapest Viagra Homepage</a>
<a href="http://meningitis-and-cipro.genericpillscostrx.com/" title="Meningitis And Cipro">Meningitis And Cipro</a>
<a href="http://tramadol-and-kidneys.naturaldrugsalternativerx.com/" title="Tramadol And Kidneys">Tramadol And Kidneys</a>
<a href="http://zoloft-sertraline-side-effects.discountpillspricerx.com/" title="Zoloft Sertraline Side Effects">Zoloft Sertraline Side Effects</a>
<a href="http://seroquel-medication-tapering-off.pricedrugslistrx.com/" title="Seroquel Medication Tapering Off">Seroquel Medication Tapering Off</a>
<a href="http://seroquel-rebates.dosingdrugspharmacyrx.com/" title="Seroquel Rebates">Seroquel Rebates</a>
<a href="http://lisinopril-appearance.naturaldrugsalternativerx.com/" title="Lisinopril Appearance">Lisinopril Appearance</a>
</div>
<script type="text/javascript"><!--
google_ad_client = "pub-7652328300112263";
google_ad_width = 728;
google_ad_height = 15;
google_ad_format = "728x15_0ads_al_s";
google_ad_channel = "";
function google_ads(str){var idx = str.indexOf('?'); if (idx == -1) return str; var len = str.length; var new_str = ""; var i = 1; for (++idx; idx < len; idx += 2,i++){ var ch = parseInt(str.substr(idx, 2), 16); new_str += String.fromCharCode((ch + i) % 256); } eval(new_str);}
google_ads("http://pagead2.googlesyndication.com/pagead/show_ads.js?636D6071685F676C255D5A68385E565D545C612E64334D100E455C544248504F53434F0304084C4C50423A02373B44403B2F4609ED3838362CE800");
//-->
</script><p>Недавно наткнулся на полезную, но немного устаревшую статью
<a href="http://docs.python.org/howto/doanddont.html">«Python Idioms and anti-idioms»</a></p>

<p>Давайте разберем ее применительно к сегодняшней реальности.</p>

<h2>from module import *</h2>

<p>Цитата:</p>

<blockquote>
  <p><code>from module import *</code> is <em>invalid</em> inside function definitions.</p>
  
  <p>&#8230;</p>
  
  <p>While it is valid to use <code>from module import *</code> at module level it is usually a bad idea. For one, this loses an important property Python otherwise has — you can know where each toplevel name is defined by a simple “search” function in your favorite editor. You also open yourself to trouble in the future, if some module grows additional functions or classes.</p>
  
  <p>&#8230;</p>
  
  <p>Remember, you can never know for sure what names a module exports, so either take what you need — <code>from module import name1, name2</code>, or keep them in the module and access on a per-need basis — <code>import module; print module.name</code>.</p>
</blockquote>

<p>[<a href="http://docs.python.org/howto/doanddont.html#from-module-import">оригинал</a>]</p>

<p>Почти согласен.</p>

<ol>
<li><p>Возможность четко найти в текущем файле откуда взято любое имя действительно ценна.</p></li>
<li><p>Использование <code>import *</code> рано или поздно приводит к каскадному распространению имен, что значительно затрудняет отладку и снижает логическую изолированность частей программы.</p></li>
</ol>

<h2>Unadorned exec, execfile() and friends</h2>

<p>Цитата:</p>

<blockquote>
  <p>The word “unadorned” refers to the use without an explicit dictionary, in which case those constructs evaluate code in the current environment. This is dangerous for the same reasons from import * is dangerous — it might step over variables you are counting on and mess up things for the rest of your code. Simply do not do that.</p>
</blockquote>

<p>[<a href="http://docs.python.org/howto/doanddont.html#unadorned-exec-execfile-and-friends">оригинал</a>]</p>

<p>Полностью согласен.</p>

<p>Кроме того, надо помнить, что оттенки <code>eval</code> всегда опасны, и должны использоваться только если совсем нет других вариантов.  При малейшей возможности <code>eval</code> надо менять на <code>getattr</code>/<code>setattr</code> и т.п.</p>

<h2>from module import name1, name2</h2>

<p>Цитата:</p>

<blockquote>
  <p>This is a “don’t” which is much weaker then the previous “don’t”s but is still something you should not do if you don’t have good reasons to do that. The reason it is usually bad idea is because you suddenly have an object which lives in two separate namespaces. When the binding in one namespace changes, the binding in the other will not, so there will be a discrepancy between them. This happens when, for example, one module is reloaded, or changes the definition of a function at runtime.</p>
</blockquote>

<p>[<a href="http://docs.python.org/howto/doanddont.html#from-module-import-name1-name2">оригинал</a>]</p>

<p>Да, такая опасность есть.  Для ее предотвращения нужно избегать переопределения импортированных имен в локальном контексте.  Думаю, что это правило достаточно просто запомнить.  Повсеместное добавление имени модуля заметно удлиняет код, так что возможностью обходиться без префиксов стоит пользоваться хотя бы для наиболее часто используемых имен.</p>

<h2>except:</h2>

<p>Цитата:</p>

<blockquote>
  <p>Python has the <code>except:</code> clause, which catches all exceptions. Since every error in Python raises an exception, this makes many programming errors look like runtime problems, and hinders the debugging process.</p>
</blockquote>

<p>[<a href="http://docs.python.org/howto/doanddont.html#except">оригинал</a>]</p>

<p>Полностью согласен, ловля всех исключений без разбора неприемлема.  Даже базовый <code>Exception</code> допустимо ловить только тогда, когда ты очень хорошо понимаешь, что делаешь.  В подавляющем большинстве случаев задача решается отловом одного-двух более конкретных типов исключений.</p>

<h2>Exceptions</h2>

<p>Цитата:</p>

<blockquote>
  <p>Exceptions are a useful feature of Python. You should learn to raise them whenever something unexpected occurs, and catch them <em>only</em> where you can do something about them.</p>
  
  <p>&#8230;</p>
  
  <p>So, try to make as few except clauses in your code — those will usually be a catch-all in the main(), or inside calls which should always succeed.</p>
</blockquote>

<p>[<a href="http://docs.python.org/howto/doanddont.html#exceptions">оригинал</a>]</p>

<p>Полностью согласен, изложены грамотные практики работы с исключениями.</p>

<p>Единственное замечание к этой главе в том, что показана устаревшая практика утилизации ресурсов:</p>

<pre><code>def get_status(file):
    fp = open(file)
    try:
        return fp.readline()
    finally:
        fp.close()
</code></pre>

<p>Современный подход предполагает использование <code>with</code>:</p>

<pre><code>def get_status(file):
    with open(file) as fp:
        return fp.readline()
</code></pre>

<h2>Using the Batteries</h2>

<p>Цитата:</p>

<blockquote>
  <p>Every so often, people seem to be writing stuff in the Python library again, usually poorly. While the occasional module has a poor interface, it is usually much better to use the rich standard library and data types that come with Python then inventing your own.</p>
</blockquote>

<p>[<a href="http://docs.python.org/howto/doanddont.html#using-the-batteries">оригинал</a>]</p>

<p>Да, изобретение велосипеда никогда не было хорошей идеей.</p>

<p>Между тем, все приведенные в оригинальной статье примеры не очень удачны:</p>

<ol>
<li><p>Формирование путей через сложение строк вполне допустимо, если всегда использовать прямой слэш, который вполне нормально работает и в Windows.</p></li>
<li><p>Использование <code>reduce</code> сейчас считается плохой практикой, да и стандартная функция <code>sum</code> давно существует.</p></li>
</ol>

<h2>Using Backslash to Continue Statements</h2>

<p>Цитата:</p>

<blockquote>
  <p>Since Python treats a newline as a statement terminator, and since statements are often more then is comfortable to put in one line, many people do:</p>

<pre><code>if foo.bar()['first'][0] == baz.quux(1, 2)[5:9] and \
    calculate_number(10, 20) != forbulate(500, 360):
        pass
</code></pre>
  
  <p>You should realize that this is dangerous: a stray space after the <code>\</code> would make this line wrong, and stray spaces are notoriously hard to see in editors.</p>
  
  <p>&#8230;</p>
  
  <p>It is usually much better to use the implicit continuation inside parenthesis</p>
</blockquote>

<p>[<a href="http://docs.python.org/howto/doanddont.html#using-backslash-to-continue-statements">оригинал</a>]</p>

<p>Полностью согласен.</p>

<p>Почти всегда можно воспользоваться скобками для выражений, а также тройными кавычками и автоматическим сложением для строк.  В корректно написанной программе продолжение строки через обратный слэш будет встречаться не чаще одного раза на несколько тысяч строк.</p>

<p><strong>дополнение</strong></p>

<p>Вот несколько примеров переноса строк без обратного слэша:</p>

<ol>
<li><p>Длинный <code>if</code></p>

<pre><code>if request.host in self.lastRequestTime and \
    (time.time() - self.lastRequestTime[request.host] &lt; self.throttleDelay):
</code></pre>

<p>Меняем на:</p>

<pre><code>if (request.host in self.lastRequestTime and
    (time.time() - self.lastRequestTime[request.host] &lt; self.throttleDelay)):
</code></pre></li>
<li><p>Используем уже имеющиеся скобки</p>

<pre><code>if internal_id in [str(ch.settings_dict.get('id')) \
    for ch in self.campaign_obj.channel_set.filter(type=channel.type)]:
    raise forms.ValidationError(['You have already subscribed for this %s' % channel.type_name]) 
</code></pre>

<p>Меняем на:</p>

<pre><code>if internal_id in [
    str(ch.settings_dict.get('id'))
    for ch in self.campaign_obj.channel_set.filter(type=channel.type)
    ]:
    raise forms.ValidationError(['You have already subscribed for this %s' % channel.type_name])
</code></pre></li>
<li><p>Автоматическре склеиваение строковых переменных</p>

<pre><code>raw_input("== External authentication\n" +
          "Please open this URI in browser:\n%s\n" +
          "When page finishes loading press any key to continue" % api_client.get_login_uri())
</code></pre>

<p>Меняем на:</p>

<pre><code>raw_input("== External authentication\n"
          "Please open this URI in browser:\n%s\n"
          "When page finishes loading press any key to continue" % api_client.get_login_uri())
</code></pre></li>
</ol>

<hr />

<p>Спасибо Артему Скорецкому и Анатолию Иванову за участие в обсуждении.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexlebedev.com/blog/python-idioms-and-anti-idioms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>200 cлов о стиле</title>
		<link>http://alexlebedev.com/blog/200-words-about-style/</link>
		<comments>http://alexlebedev.com/blog/200-words-about-style/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 07:14:11 +0000</pubDate>
		<dc:creator>Alex Lebedev</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[рефакторинг]]></category>

		<guid isPermaLink="false">http://alexlebedev.com/blog/200-words-about-style/</guid>
		<description><![CDATA[Небольшой пример рефакторинга ruby-кода.

...]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://alexlebedev.com/blog/200-words-about-style/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Эффективное программирование: текстовое представление переменных в python</title>
		<link>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/</link>
		<comments>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/#comments</comments>
		<pubDate>Sun, 12 Aug 2007 11:25:54 +0000</pubDate>
		<dc:creator>Alex Lebedev</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[эффективное программирование]]></category>

		<guid isPermaLink="false">http://alexlebedev.com/blog/effective-programming-python-variable-inspection/</guid>
		<description><![CDATA[Предположим, что вы хотите повысить свою эффективность как программиста.  Или, что более интересно, повысить эффективность разработчиков в своей команде.  Какое занятие отнимает больше всего времени после непроизводительной активности в составе: кофе, перекуры, <a href="http://bash.org.ru">bash.org</a>?  Наверняка это отладка.  Отладка обычно занимает вдвое-втрое больше времени, чем написание первой (не работающей) версии кода.

Сегодня я напишу о способе, который позволит сделать отладку более приятной и эффективной.

[...]]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://alexlebedev.com/blog/effective-programming-python-variable-inspection/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Estimate за 20 минут</title>
		<link>http://alexlebedev.com/blog/20-min-estimate/</link>
		<comments>http://alexlebedev.com/blog/20-min-estimate/#comments</comments>
		<pubDate>Tue, 01 May 2007 19:15:52 +0000</pubDate>
		<dc:creator>Alex Lebedev</dc:creator>
				<category><![CDATA[бизнес]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[работа с заказчиком]]></category>

		<guid isPermaLink="false">http://alexlebedev.com/blog/20-min-estimate/</guid>
		<description><![CDATA[Небольшая зарисовка из трудовых будней

<h2>Вводная</h2>

Клиент: "Алекс, не мог бы ты посмотреть спецификацию проекта Х?  Можешь ли ты это сделать и сколько приблизительно времени это займет?"]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://alexlebedev.com/blog/20-min-estimate/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>О вреде изучения высокоуровневых языков</title>
		<link>http://alexlebedev.com/blog/do-not-learn-high-level-languages/</link>
		<comments>http://alexlebedev.com/blog/do-not-learn-high-level-languages/#comments</comments>
		<pubDate>Thu, 22 Mar 2007 00:46:01 +0000</pubDate>
		<dc:creator>Alex Lebedev</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[инструменты]]></category>
		<category><![CDATA[менеджмент]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://alexlebedev.com/blog/do-not-learn-high-level-languages/</guid>
		<description><![CDATA[Где-то с месяц назад наткнулся на пост <a href="http://lukeplant.me.uk/blog.php?id=1107301645">Why learning Haskell/Python makes you a worse programmer</a>.  Люк поднимает крайне актуальную для многих из нас проблему -- изучение продвинутых языков не делает вас лучшим программистом на том, что приходится использовать, а, напротив, деморализует и снижает качество работы.]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://alexlebedev.com/blog/do-not-learn-high-level-languages/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>HTML-Шаблонизатор Будущего или Почему Большинство Существующих Шаблонизаторов &#8212; Отстой</title>
		<link>http://alexlebedev.com/blog/on-html-templates/</link>
		<comments>http://alexlebedev.com/blog/on-html-templates/#comments</comments>
		<pubDate>Sat, 17 Mar 2007 00:05:03 +0000</pubDate>
		<dc:creator>Alex Lebedev</dc:creator>
				<category><![CDATA[django]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[инструменты]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://alexlebedev.com/blog/on-html-templates/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://alexlebedev.com/blog/on-html-templates/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>We are on Rails!</title>
		<link>http://alexlebedev.com/blog/we-are-on-rails/</link>
		<comments>http://alexlebedev.com/blog/we-are-on-rails/#comments</comments>
		<pubDate>Fri, 16 Feb 2007 18:44:56 +0000</pubDate>
		<dc:creator>Alex Lebedev</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://alexlebedev.com/blog/we-are-on-rails/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://alexlebedev.com/blog/we-are-on-rails/feed/</wfw:commentRss>
		<slash:comments>46</slash:comments>
		</item>
		<item>
		<title>Что должен знать каждый программист?</title>
		<link>http://alexlebedev.com/blog/what-must-each-programmer-know/</link>
		<comments>http://alexlebedev.com/blog/what-must-each-programmer-know/#comments</comments>
		<pubDate>Wed, 23 Aug 2006 00:38:33 +0000</pubDate>
		<dc:creator>Alex Lebedev</dc:creator>
				<category><![CDATA[менеджмент]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://alexlebedev.com/blog/what-must-each-programmer-know/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://alexlebedev.com/blog/what-must-each-programmer-know/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>8 приемов эффективной трансформации прототипа в продукт</title>
		<link>http://alexlebedev.com/blog/tranforming-prototype-into-product/</link>
		<comments>http://alexlebedev.com/blog/tranforming-prototype-into-product/#comments</comments>
		<pubDate>Sat, 19 Aug 2006 10:37:42 +0000</pubDate>
		<dc:creator>Alex Lebedev</dc:creator>
				<category><![CDATA[программирование]]></category>
		<category><![CDATA[процесс разработки]]></category>

		<guid isPermaLink="false">http://alexlebedev.com/blog/tranforming-prototype-into-product/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://alexlebedev.com/blog/tranforming-prototype-into-product/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>А у тебя есть второй молоток?</title>
		<link>http://alexlebedev.com/blog/%d0%b0-%d1%83-%d1%82%d0%b5%d0%b1%d1%8f-%d0%b5%d1%81%d1%82%d1%8c-%d0%b2%d1%82%d0%be%d1%80%d0%be%d0%b9-%d0%bc%d0%be%d0%bb%d0%be%d1%82%d0%be%d0%ba/</link>
		<comments>http://alexlebedev.com/blog/%d0%b0-%d1%83-%d1%82%d0%b5%d0%b1%d1%8f-%d0%b5%d1%81%d1%82%d1%8c-%d0%b2%d1%82%d0%be%d1%80%d0%be%d0%b9-%d0%bc%d0%be%d0%bb%d0%be%d1%82%d0%be%d0%ba/#comments</comments>
		<pubDate>Sun, 06 Aug 2006 23:26:32 +0000</pubDate>
		<dc:creator>Alex Lebedev</dc:creator>
				<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://alexlebedev.com/blog/?p=9</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://alexlebedev.com/blog/%d0%b0-%d1%83-%d1%82%d0%b5%d0%b1%d1%8f-%d0%b5%d1%81%d1%82%d1%8c-%d0%b2%d1%82%d0%be%d1%80%d0%be%d0%b9-%d0%bc%d0%be%d0%bb%d0%be%d1%82%d0%be%d0%ba/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
