<?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>Codito ergo sum &#187; Стефан Кънев</title>
	<atom:link href="http://skanev.com/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://skanev.com</link>
	<description>Блогът на Стефан Кънев</description>
	<lastBuildDate>Fri, 20 Jan 2012 17:52:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Smalltalk и други екзотични езици в initLab</title>
		<link>http://skanev.com/2012/01/20/smalltalk-and-other-exotics-in-initlab/</link>
		<comments>http://skanev.com/2012/01/20/smalltalk-and-other-exotics-in-initlab/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 17:52:33 +0000</pubDate>
		<dc:creator>Стефан Кънев</dc:creator>
				<category><![CDATA[Програмиране]]></category>

		<guid isPermaLink="false">http://skanev.com/?p=499</guid>
		<description><![CDATA[Занимавайки се с разнообразни езици за програмиране съм научил много. Всеки ме изненадва с нещо. Понякога намирам идеи, които &#8222;mainstream&#8220; езиците са усвоили десетки години по-късно. Понякога виждам идеи, които те тепърва усвояват. Не са ужасно практични, но занимавката с тях ме прави по-добър програмист.

Искам да направя серия от малки презентации в initLab за такива [...]]]></description>
			<content:encoded><![CDATA[<p>Занимавайки се с разнообразни езици за програмиране съм научил много. Всеки ме изненадва с нещо. Понякога намирам идеи, които &#8222;mainstream&#8220; езиците са усвоили десетки години по-късно. Понякога виждам идеи, които те тепърва усвояват. Не са ужасно практични, но занимавката с тях ме прави по-добър програмист.</p>

<p>Искам да направя серия от малки презентации в initLab за такива езици. Очаквайте Io, Scheme, Haskell, J, Prolog и прочее. Първият ще е Smalltalk. Датата ще бъде <strong>26ти януари</strong>. Часът ще бъде <strong>19:00</strong>.
<span id="more-499"></span></p>

<p>Smalltalk е първият обектно-ориентиран език за програмиране. Всъщност, вторият, но само технически погледнато. Всичко, което възприемаме като ООП идва по един или друг начин от него. Разбира се, повечето идеи са видоизменени до непознаваемост (в C++, например). Няколко известни имена от Addison-Wesley са (бивши) Smalltalk програмисти &#8211; Kent Beck, Ward Cunningham, Martin Folwer. В днешно време не е много популярен, но определено има какво да ни научи.</p>

<p>Ето няколко любопитни неща, които ще грабнат интереса ви:</p>

<ul>
<li>Кодът не се пази в текстови файлове.</li>
<li>Виртуалната машина и работната среда са силно интегрирани. Можете да редактирате кода на работната среда от самата работна среда. Докато работите в нея.</li>
<li>Няма синтаксис за <code>if</code> &#8211; имплементиран е в стандартната библиотека.</li>
<li>Design Pattern-ите в <a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612" title="Gang of Four">GoF</a> изглеждат малко странни в C++ и Java. В Smalltalk изглеждат учудващо на място.</li>
<li>Динамично типизиран, но въпреки това има IDE и debugger, сравними с тези за Java.</li>
<li>Някои странни имена в Ruby (<code>collect</code>, <code>inject</code>, <code>initialize</code>) идват от Smalltalk.</li>
<li>Изключително прост синтаксис, сравним с този на LISP.</li>
</ul>

<p>Ако това ви е грабнало вниманието, може да дойдете и да гледате <strong>на 26 януари, от 19:00 в initLab</strong>. Входът, разбира се, е безплатен.</p>
]]></content:encoded>
			<wfw:commentRss>http://skanev.com/2012/01/20/smalltalk-and-other-exotics-in-initlab/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Code Retreat №3</title>
		<link>http://skanev.com/2011/11/25/code-retreat-%e2%84%963/</link>
		<comments>http://skanev.com/2011/11/25/code-retreat-%e2%84%963/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 20:12:58 +0000</pubDate>
		<dc:creator>Стефан Кънев</dc:creator>
				<category><![CDATA[Разни]]></category>

		<guid isPermaLink="false">http://skanev.com/?p=497</guid>
		<description><![CDATA[Ще организираме трети Code Retreat в София.

Този път събитието ще се проведе в офиса на Software Society. Може да намерите повече информация на сайта им.
]]></description>
			<content:encoded><![CDATA[<p>Ще организираме <a href="http://software-society.com/coderetreat/">трети Code Retreat</a> в София.</p>

<p>Този път събитието ще се проведе в офиса на Software Society. Може да намерите повече информация <a href="http://software-society.com/coderetreat/">на сайта им</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://skanev.com/2011/11/25/code-retreat-%e2%84%963/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Retreat на 9ти юли</title>
		<link>http://skanev.com/2011/06/28/code-retreat-9-july/</link>
		<comments>http://skanev.com/2011/06/28/code-retreat-9-july/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 19:42:50 +0000</pubDate>
		<dc:creator>Стефан Кънев</dc:creator>
				<category><![CDATA[Програмиране]]></category>

		<guid isPermaLink="false">http://skanev.com/?p=489</guid>
		<description><![CDATA[Code retreat е интересен начин да усъвършенствате програмистските си умения. Събирате се група хора (четен брой) и решавате един конкретен проблем (Conway&#8217;s Game of Life). Работите по двойки (pair programming) с test-driven development. Пишете на сесии от 45 минути, след които правите кратка ретроспекция, изтривате кода и сменяте партньора. И така цял ден, с различни [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://coderetreat.com/">Code retreat</a> е интересен начин да усъвършенствате програмистските си умения. Събирате се група хора (четен брой) и решавате един конкретен проблем (<a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life">Conway&#8217;s Game of Life</a>). Работите по двойки (pair programming) с test-driven development. Пишете на сесии от 45 минути, след които правите кратка ретроспекция, <strong>изтривате кода</strong> и сменяте партньора. И така цял ден, с различни хора.</p>

<p>Идеята не е да решите проблема. Идеята е да обмените умения и да затвърдите фундаментални познания. Това е адски добър начин да научите test-driven development или някой друг трик с текстовия редактор/шела.</p>

<p>Чух за идеята миналата година на NordicRuby, но чак през април се престраших да я пробвам. Организирах малко събитие в initLab, в което поканих само познати. Събрахме се 6 човека и направихме 5 сесии. Писахме на C#, JavaScript, Ruby, Python и дори Scala. Бяхме много доволни. Всеки си тръгна научил нещо.</p>

<p>Искам да организирам друг и този път смятам да поканя всички, които искат да дойдат. Събитието ще се проведе <strong>от 9:00 на 9 юли, събота</strong> в <a href="http://initlab.org/">initLab</a>. Ако искате да участвате сте добре дошли. Не е нужно да сте опитни в TDD — просто носете компютър и добро настроение.</p>

<p>Ето как ще протече:</p>

<p>Ще направим нещата &#8222;по книга&#8220; &#8211; времето ще е 45 минути, проблема ще е <a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life">Game of Life</a>, ще трием кода на края на сесиите и ще ползваме test-driven development.</p>

<p>Всяка двойка ще се уговаря помежду си на какъв език да пише. Със сигурност ще си намерите партньори за C#, Java, JavaScript, PHP, Python и Ruby. Вероятно ще има всякакви екзотики.</p>

<p>След всяка сесия ще събираме всички и ще обсъждаме как е минало. Ретроспекциите отнемат към 15 минути, след което ще продължаваме с друга двойка.</p>

<p>За да компенсирам ранното ставане, ще има закуска и кафе в initLab. Ако имате по-специални изисквания (не ядете месо или сте веган), кажете и ще се погрижа. След третата сесия ще отидем в близко заведение да обядваме. След това се връщаме и продължаваме. Реалистично погледнато, ще направим 6 сесии и ще приключим към 17:00.</p>

<p>Първите 20 минути ще се запознаем и закусим, след което ще разкажа подробно как ще протече събитието. След това започваме първата сесия.</p>

<p>Събитието ще е напълно безплатно (включително закуската).</p>

<p>Не нужно да сте опитни в TDD. Въпреки това, имаме следните изисквания към всеки участник:</p>

<ul>
<li>Носете компютър</li>
<li>Научете правилата на Game of Life. Ако имате възможност, пробвайте да няколко шаблона.</li>
<li>Изберете си езици, на които ще пишете и научете поне един тестов framework във всеки. Важно е да познавате инструментите и да можете бързо да пускате тестове.</li>
<li>Задължително подкарайте празен проект за всяка двойка (език, testing framework), с които смятате да работите на вашия компютър. Не искате да прекарате голяма част от сесията в подкарване на проект.</li>
</ul>

<p><strong>Ако идвате, моля елате в 9:00 и останете за целия ден</strong>. Ако ще идвате, пишете ми на stefan точка kanev маймунка гмейл точка ком. Имам нужда да знам колко човека ще присъстват. Моля пишете само ако сте сигурни. Ако ви изникне нещо в последния момент, ще се радвам да ме предупредите.</p>

<p>Ако имате някакви въпроси, ползвайте формата за коментари, пишете в пощенския списък <a href="http://groups.google.com/group/software-craftsmanship-bulgaria">Software Craftsmanship Bulgaria</a> или ми пратете писмо. Може да погледнете <a href="https://groups.google.com/d/topic/software-craftsmanship-bulgaria/W6B8k-VMaI0/discussion">кратките отзиви от предишния code retreat</a> или да намерите повече информация на <a href="http://coderetreat.com/">coderetreat.com</a>.</p>

<p>Ще се радвам да ви видя на 9ти!</p>
]]></content:encoded>
			<wfw:commentRss>http://skanev.com/2011/06/28/code-retreat-9-july/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Python @ FMI, v 5.0</title>
		<link>http://skanev.com/2011/02/28/python-fmi-v-5-0/</link>
		<comments>http://skanev.com/2011/02/28/python-fmi-v-5-0/#comments</comments>
		<pubDate>Sun, 27 Feb 2011 22:09:37 +0000</pubDate>
		<dc:creator>Стефан Кънев</dc:creator>
				<category><![CDATA[Разни]]></category>

		<guid isPermaLink="false">http://skanev.com/?p=485</guid>
		<description><![CDATA[Тази година с Николай ще правим за пети път курс по Python във ФМИ. Избираем е за студенти от втори курс нагоре. Ако попадате в тази демография, горещо ви го препоръчвам. Ако пък не, може въпреки това да дойдете и да видите за какво иде реч.

Първото събиране ще е във вторник, 1ви март, от 19:00 [...]]]></description>
			<content:encoded><![CDATA[<p>Тази година с <a href="http://nikolay.bg">Николай</a> ще правим за пети път <a href="http://fmi.py-bg.net">курс по Python във ФМИ</a>. Избираем е за студенти от втори курс нагоре. Ако попадате в тази демография, горещо ви го препоръчвам. Ако пък не, може въпреки това да дойдете и да видите за какво иде реч.</p>

<p>Първото събиране ще е във вторник, 1ви март, от 19:00 в зала 200. Ще се радвам да ви видя там.</p>
]]></content:encoded>
			<wfw:commentRss>http://skanev.com/2011/02/28/python-fmi-v-5-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Видео от 2010</title>
		<link>http://skanev.com/2011/01/31/video-from-2010/</link>
		<comments>http://skanev.com/2011/01/31/video-from-2010/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 21:50:29 +0000</pubDate>
		<dc:creator>Стефан Кънев</dc:creator>
				<category><![CDATA[Разни]]></category>

		<guid isPermaLink="false">http://skanev.com/?p=482</guid>
		<description><![CDATA[През 2010 имах честта да говоря на три конференции &#8212; WebTech, OpenFest и WordCamp BG. Доволен съм и от трите. От две от тях има видео:


Как блогът ми ме направи по-добър професионалист на WordCamp BG
Защо MongoDB? от OpenFest


Слайдовете са на обичайното място.

През 2011 ще се опитам да се представя още по-добре.
]]></description>
			<content:encoded><![CDATA[<p>През 2010 имах честта да говоря на три конференции &#8212; WebTech, OpenFest и WordCamp BG. Доволен съм и от трите. От две от тях има видео:</p>

<ul>
<li><a href="http://wordpress.tv/2010/10/02/stefan-kanev-how-my-blog-made-me-a-better-professional/">Как блогът ми ме направи по-добър професионалист</a> на WordCamp BG</li>
<li><a href="http://storage.erihon.com/OpenFest-National/OpenFest%202010/Why%20MongoDB/presentation.avi">Защо MongoDB?</a> от OpenFest</li>
</ul>

<p>Слайдовете са на <a href="http://www.slideshare.net/skanev">обичайното място</a>.</p>

<p>През 2011 ще се опитам да се представя още по-добре.</p>
]]></content:encoded>
			<wfw:commentRss>http://skanev.com/2011/01/31/video-from-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://storage.erihon.com/OpenFest-National/OpenFest%202010/Why%20MongoDB/presentation.avi" length="689040290" type="video/x-msvideo" />
		</item>
		<item>
		<title>Pragmatic Thinking &amp; Learning</title>
		<link>http://skanev.com/2011/01/24/pragmatic-thinking-and-learning/</link>
		<comments>http://skanev.com/2011/01/24/pragmatic-thinking-and-learning/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 23:13:04 +0000</pubDate>
		<dc:creator>Стефан Кънев</dc:creator>
				<category><![CDATA[Разни]]></category>

		<guid isPermaLink="false">http://skanev.com/?p=469</guid>
		<description><![CDATA[Като (добри) програмисти, отделяме сериозно количество време да подобрим работата си. Усъвършенстваме програмния език, текстовия редактор, работната среда, всевъзможните библиотеки и дори скоростта на писане. Но често пропускаме един от най-важните инструмени &#8212; умът ни.




Pragmatic Thinking and Learning е книга, която дава ред начини да станем по-добри, без да инвестираме директно в програмиране. Една от [...]]]></description>
			<content:encoded><![CDATA[<p>Като (добри) програмисти, отделяме сериозно количество време да подобрим работата си. Усъвършенстваме програмния език, текстовия редактор, работната среда, всевъзможните библиотеки и дори скоростта на писане. Но често пропускаме един от най-важните инструмени &#8212; умът ни.</p>

<p><span id="more-469"></span>
<a href="http://skanev.com/wp-content/uploads/2011/01/ahptl.jpg"><img src="http://skanev.com/wp-content/uploads/2011/01/ahptl.jpg" alt="ahptl" title="ahptl" width="540" height="648" class="aligncenter size-full wp-image-471" style="border: 1px solid black;" /></a></p>

<p><a href="http://pragprog.com/titles/ahptl">Pragmatic Thinking and Learning</a> е книга, която дава ред начини да станем по-добри, без да инвестираме директно в програмиране. Една от основните идеи е, че ученето е умение, и като такова, можем да ставаме по-добри в него. Предлага разнообразни подходи за това.</p>

<p>В книгата има два вида информация &#8212; &#8222;теория&#8220; и &#8222;практика&#8220;. &#8222;Теорията&#8220; разказва как мозъкът ни работи. Говори за неща като <a href="http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition">модела на Дрейфус за усвояване на умения</a> или за <a href="http://en.wikipedia.org/wiki/List_of_cognitive_biases">cognitive biases</a>. &#8222;Практиката&#8220; са ред неща, които може да направите, за да подобрите ефективността си. Варират от съвети за боравене с e-mail, през подход за четене на книги, до методи за водене на бележки. Не претендира за изчерпателност или научна достоверност. По-скоро е на принципа &#8222;това работи за мен; пробвайте го &#8212; може да сработи и за вас&#8220;.</p>

<p>Книгата не е методична програма. Вместо това, Анди Хънт разказва много неща, без да навлиза в детайли. Разлистих я преди да започна този текст и се изненадах колко много съм забравил. Идеите са доста и ако искате да приложите всичките, ще се видите в зор.</p>

<p>От друга страна, нещата които си спомням ми влизат в ежедневна употреба. От нея разбрах за <a href="http://www.amazon.com/Mind-Map-Book-Thinking-Potential/dp/0452273226">mind mapping</a>. Тя ми даде идеята да ходя нявсякъде с <a href="http://www.flickr.com/photos/skanev/4073140711/">тефтерче</a> (Field Notes или Moleskine), в което да водя бележки. Части от <a href="http://skanev.com/2010/09/11/how-i-work-pomodoro/">процеса ми</a> са вдъхновени от нея.</p>

<p>Горещо ви я препоръчвам. Книгата е интересно четиво, дори и да не имплементирате нито един от съветите.</p>
]]></content:encoded>
			<wfw:commentRss>http://skanev.com/2011/01/24/pragmatic-thinking-and-learning/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Какво харесвам в pair programming?</title>
		<link>http://skanev.com/2011/01/17/what-i-like-about-pair-programming/</link>
		<comments>http://skanev.com/2011/01/17/what-i-like-about-pair-programming/#comments</comments>
		<pubDate>Sun, 16 Jan 2011 23:59:50 +0000</pubDate>
		<dc:creator>Стефан Кънев</dc:creator>
				<category><![CDATA[Програмиране]]></category>

		<guid isPermaLink="false">http://skanev.com/?p=465</guid>
		<description><![CDATA[Pair programming е една от по-скандалните практики в Extreme Programming. В нея двама програмиста работят заедно на един компютър. Клавиатурата е една и се предава от време на време. Подходяща метафора за това е двойката шофьор и навигатор. Диалогът е ключов &#8212; раждат се идеи, пречупват се през общия опит и резултират в код. Като [...]]]></description>
			<content:encoded><![CDATA[<p>Pair programming е една от по-скандалните практики в <a href="1">Extreme Programming</a>. В нея двама програмиста работят заедно на един компютър. Клавиатурата е една и се предава от време на време. Подходяща метафора за това е двойката шофьор и навигатор. Диалогът е ключов &#8212; раждат се идеи, пречупват се през общия опит и резултират в код. Като практика, pair programming претендира за (1) по-добра ефективност, (2) по-високо качество и (3) по-малко дефекти.</p>

<p>За първи път правех pair programming през 2005. Това е страхотен начин на работа и горещо ви го препоръчвам. Има ред предизвикателства &#8212; да убедите мениджмънта, да се сработите с колегите и дори да си промените навиците (например никакъв IM). Ако се справите с това, резултати се виждат бързо.</p>

<p>Не целя да ви продам идеята или дори да ви обясня какво представлява. Искам само да разкажа защо ми харесва да работя така:
<span id="more-465"></span></p>

<h3>По-високо качество</h3>

<p>Работата по двойки подобрява качеството. Това става по няколко начина. Първо, работи срещу мързела &#8212; ако ме домързи да напиша тест или да направя даден код ясен, човекът до мен ще ме сръчка. Второ, кодът се гледа от друг чифт очи &#8212; партньорът забелязва дефекти и предлага подобрения. Това е като code review в реално време.</p>

<p>Трето, подобрява консистентността на проекта. Всеки се ръководи от правила как да пише, които обикновено са неявни (<em>&#8222;така ми харесва повече&#8220;</em>). Когато имаме разминаване, разговорът първо ги прави явни (<em>&#8222;аз предпочитам това, защото Х, ти онова, защото Y&#8220;</em>), след което ги синтезира (<em>&#8222;нека в този проект да правим Z&#8220;</em>). Резултатът &#8212; еднакъв подход.</p>

<h3>Възможност за учене</h3>

<p>Научавам малки и полезни трикове &#8212; &#8222;горещи клавиши&#8220; на работната среда, нова shell команда, непознат метод или хитър номер във Vim. Запомням по-лесно, понеже ги виждам в контекст. Мога да питам, ако нещо е неясно. Така се научих на ред неща, сред които git, jQuery и Eclipse.</p>

<p>Ако съм нов в проекта, това е добър начин да навляза в него. Когато имам по-запознат програмист зад гърба си, мога да задавам въпроси или смело да правя промени. Дори да познавам проекта, така научам причините за взети решения по дизайна.</p>

<p>Има и по-тънък момент &#8212; сблъсквам с друг начин на мислене. Мога да наблюдавам подхода на партньора, да се опитам да го усвоя и в последствие да разширя собствения си с идеи от неговия. Не съм открил по-ефективен начин да ставам по-добър.</p>

<h3>Социална дейност</h3>

<p>Програмирането често е интровертно. Проблемите изискват внимателен анализ, разучаване, проба и грешка. Най-добре правя това сам. Но аз съм екстровертен &#8212; имам нужда от други хора, с които да взаимодействам. Така ангажирам по-голяма част от мозъка си.</p>

<p>Pair programming-а е ефективен начин да се почувствам част от екипа. Усещам, че преследваме обща цел заедно. Дава ми чувство за принадлежност. Мога да взаимодействам двупосочно с всички чрез човека, с когото работя в момента &#8212; ще ми предаде уроците от другите и ще предаде моите на тях.</p>

<p>И още &#8212; честият pair programming създава връзка между хората. Това сплотява екипа. Поглеждайки назад, чувствах се много по-добре в екипите, в които го практикувахме. Някои от хората ми липсват.</p>

<h3>Обща култура</h3>

<p>Един XP екип има нужда от обща култура. За да има колективната собственост, стилът на различните членове трябва да е подобен (или дори идентичен). Трябва да могат независимо да достигат до еднакви или сходни решения на проблемите. В идеалния случай, когато видя парче код, трябва да не мога да позная дали аз съм го писал.</p>

<p>Pair programming е необходим за такава култура. От една страна, той подпомага създаването &#1117; &#8212; това става всеки път, когато двама стигнат до консенсус и изградят &#8222;правило&#8220; за вбъдеще. Така тя се развива естествено и еволюционно. От друга, това е ефективен начин тя да се разпространява и утвърждава. След известно време, всеки от екипа може да каже &#8222;ние правим така&#8220;, &#8222;ние подхождаме така&#8220; и &#8222;ние мислим така&#8220;. Дори извън екипа да прави, подхожда и мисли по различен начин.</p>
]]></content:encoded>
			<wfw:commentRss>http://skanev.com/2011/01/17/what-i-like-about-pair-programming/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Нагласа</title>
		<link>http://skanev.com/2011/01/09/attitude/</link>
		<comments>http://skanev.com/2011/01/09/attitude/#comments</comments>
		<pubDate>Sun, 09 Jan 2011 21:59:57 +0000</pubDate>
		<dc:creator>Стефан Кънев</dc:creator>
				<category><![CDATA[Размисли]]></category>

		<guid isPermaLink="false">http://skanev.com/?p=461</guid>
		<description><![CDATA[Спомням си програмистски разговор отпреди осем години. Още бях в училище. Ползвах Windows, знаех (почти) всички особености на C++ и можех с лекота да разплитам спагети код. Или да го пиша.

Разговарях с един приятел. Бях прекарал последните няколко години в усилено писане на C и C++ (в училище). Занимавах се с OpenGL и линейна алгебра. [...]]]></description>
			<content:encoded><![CDATA[<p>Спомням си програмистски разговор отпреди осем години. Още бях в училище. Ползвах Windows, знаех (почти) всички особености на C++ и можех с лекота да разплитам спагети код. Или да го пиша.</p>

<p>Разговарях с един приятел. Бях прекарал последните няколко години в усилено писане на C и C++ (в училище). Занимавах се с OpenGL и линейна алгебра. Той пък бе открил Java. Водехме дълъг разговор кое е по-добро &#8212; C++ или Java. Спомням си как ми каза &#8222;Java има много добър garbage collector&#8220;, на което отговорих с &#8222;Е какво, не можеш ли да си управляваш паметта сам?&#8220;. Той отвърна &#8222;Мога, ама защо да се занимавам?&#8220;. Бях изненадан. Защо не разбираше, че garbage collector-а е излишен? Всеки адекватен програмист може да си управлява паметта. Пък и несъмнено е по-бързо. Не успя да ме убеди.</p>

<p><span id="more-461"></span>
Осем години по-късно съзнавам наивността си. Разбирам предимствата. Още повече, разбирам нуждата от контекст &#8212; защо в едни приложения ръчното управление на памет води до загубено време и бъгове, докато в други е необходимост. Просто трябваше да поработя с първия тип.</p>

<p>Чудя се &#8212; за какво друго реагирам предубедено? Колко идеи изхвърлям, защото са неприложими в текущия контекст? Колко, защото <strong>си мисля</strong>, че са неприложими? Към колко съм предубеден, защото съм ги чул от лоши програмисти? И колко игнорирам по навик?</p>

<p>Твърде често го виждам в колеги. Няма значение дали става въпрос за библиотека, метод на работа или език за програмиране. Няма значение дали говорите за Java, Ruby или PHP. Реакцията към новото и непознато е скептицизъм.</p>

<p>Не знам какво го поражда. Твърде много неща за учене? Обемът на информацията е страшен? Чувстваш се глупав, ако не успееш да научиш нещо? Изглежда непрактично да се опитваш да разбере всичко? Хората, които учат много неща не вършат никаква работа?</p>

<p>Знам друго &#8212; този начин на мислене е вреден. Като програмист не мога да си позволя да спра да уча. Започна ли да отхвърлям новото, след пет години ще съм безполезен. Още повече &#8212; ако съм негативен, изпускам ред възможности да подобря уменията си.</p>

<p>Затова се опитвам да поддържам позитивна нагласа към новите неща. Усетя ли, че съм скептичен към нещо непознато, спирам и се замислям. Казвам си, че все още нямам право на мнение. След това вниквам в него. Не е достатъчно да прочета блог пост или книга &#8212; трябва да си поиграя, да го видя в различни контексти и да съм преспал над него. И чак тогава решавам какво да мисля.</p>

<p>В крайна сметка, нещата не са абсолютни &#8212; едно нещо не е изцяло добро или изцяло лошо. Обикновено една технология има предимства и недостатъци. Работи добре в един контекст и лошо в друг. Части от нея са изработени добре, а от други има какво да се иска. Картинката не е черно-бяла. И ако се вгледам в нея внимателно, имам възможност да науча нещо ново. Или да окача нов инструмент на колана си.</p>

<p>А понякога технологията/идеята е загуба на време. Не може всяка прочетена книга да си заслужава. И това е ОК.</p>
]]></content:encoded>
			<wfw:commentRss>http://skanev.com/2011/01/09/attitude/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dijkstra &amp; Design Patterns</title>
		<link>http://skanev.com/2010/12/12/dijkstra-and-design-patterns/</link>
		<comments>http://skanev.com/2010/12/12/dijkstra-and-design-patterns/#comments</comments>
		<pubDate>Sun, 12 Dec 2010 20:07:08 +0000</pubDate>
		<dc:creator>Стефан Кънев</dc:creator>
				<category><![CDATA[Програмиране]]></category>

		<guid isPermaLink="false">http://skanev.com/?p=449</guid>
		<description><![CDATA[Дейкстра има много известни размисли. В On the cruelty of really teaching computer science той твърди, че студенти по компютърни науки трябва да прекарат първите си няколко години далеч от компютри и да се занимават единствено с формална манипулация на символи.

Доналд Кнут е несъгласен (из Coders at Work):



  But that&#8217;s not the way he [...]]]></description>
			<content:encoded><![CDATA[<p>Дейкстра има много известни размисли. В <a href="http://www.smaldone.com.ar/documentos/ewd/EWD1036_pretty.html">On the cruelty of really teaching computer science</a> той твърди, че студенти по компютърни науки трябва да прекарат първите си няколко години далеч от компютри и да се занимават единствено с формална манипулация на символи.</p>

<p>Доналд Кнут е несъгласен (из <a href="http://www.codersatwork.com/">Coders at Work</a>):
<span id="more-449"></span></p>

<blockquote>
  <p>But that&#8217;s not the way he [Dijkstra] learned either. He said a lot of really great things and inspirational things, but he&#8217;s not always right. Neither am I, but my take on it is this: Take a scientist in any field. The scientist gets older and says, &#8222;Oh, yes, some of the things that I&#8217;ve been doing have a really great payoff and other things, I&#8217;m not using anymore. I&#8217;m not going to have my students waste time on the stuff that doesn&#8217;t make giant steps. I&#8217;m not going to talk about low-level stuff at all. These theoretical concepts are really so powerful &#8212; that&#8217;s the whole story. Forget about how I got to this point.&#8220;</p>
  
  <p>I think that&#8217;s a fundamental error made by scientists in every field. They don&#8217;t realize that when you&#8217;re learning something you&#8217;ve got to see something at all levels. You&#8217;ve got to see the floor before you build the ceiling. That all goes into the brain and gets shoved down to the point where the older people forget that they needed it.</p>
</blockquote>

<p>Това е често срещана история. Протича така:</p>

<p>Човек хваща нещо ново, непознато и нетривиално (например програмиране). Няма опит, не познава скритите мотики и прави тон грешки, очевидни за експерта (например спагети с goto). Още по-лошо, дори не ги осъзнава. Опитният наблюдател (например Дейкстра) се хваща за главата и отсича, че начинащите трябва да се пазят от &#8222;опасните&#8220; инструменти (например goto). Впрочем, направо да се забранят. И разбира се, стабилна теоритична подготовка.</p>

<p>Но това не е начина, по който ескперта (например Дейкстра) се е научил.</p>

<p>Което ме навежда на размисли за Design Pattern-и. Няколко познати са ми казвали, че те са опасни, &#8222;защото n00b-овете могат лесно да се застрелят с тях&#8220; или &#8222;защото им дава нещо, зад което да се крият&#8220;. Трудни са, overengineering се прави твърде лесно и ако човек стане pattern happy прави проекта неспасяем.</p>

<p>Хубаво, ама не съм съгласен. По две причини.</p>

<p>Първо, глупакът ще намери начин да се нарани с всякакъв инстумент. Тези доводи могат да се приложат върху всичко. Например <em>автоматизирания refactoring е опасен, понеже прави писането на смотан код лесно</em>. Или тестването е лошо, <em>понеже прави промяната на код времеемка</em> (трябва да променяш <em>и</em> теста). Дори <em>copy/paste е зло, понеже позволява на хората да дублират код по елементарен начин</em>. Виждал съм достатъчно хора, които казват, че <code>/XP|agile|Scrum|TDD|pair programming|collective ownership|refactoring/</code> е тъпо, понеже са ги виждали приложени тъпо.</p>

<p>А това е жалко. По този начин изхвърляме бебето с мръсната вода. В първата си работа заварих странна форма на XP. Бе неефективна, неразбрана и правеше нещата по глупав начин. Всички я мразеха. Ако се бях повлиял от това, сега щях да твърдя, че XP е тъпо. Но вместо това прочетох книгата и започнах да я прилагам адекватно. И това ме направи порядък по-добър програмист.</p>

<p>&#8222;Пазете хората от мощните инструменти, защото могат да си отрежат нещо&#8220; е лоша философия. Това е един от големите проблеми на Java. Езикът е правен така, че абсолютен идиот да не може да се простреля в крака. Предполагам, че това е хубаво за образователни цели. Но за по-сложни проблеми е ограничаващо. Липсата на ред неща (например closures или предефиниране на оператори) предпазва лошите програмисти от глупави грешки, но вързва ръцете на добрите. Не съм съгласен да плащам тази цена.</p>

<p>Второ, аз разбрах ООП-то с Design Patterns. Преди това, за мен то се изчерпваше със C++ и наследяване. От тази книга научих много. Разглеждах pattern-ите внимателно. Търсех принципите, от които авторите са се ръководили. Размишлявах подробно на всяка непозната концепция, като &#8222;композиция&#8220;, &#8222;индиректност&#8220; или &#8222;интерфейс&#8220;. Четох <strong>внимателно</strong>. Не ме научи на 27 шаблона, които да прилагам. Научи ме на ценностна система и начин на мислене, с които Ерих Гама и компания са стигнали до тях. Бе безценно.</p>

<p>Учудващо, въпреки рисковата ми група (C++ бе единственият ми ОО език), не изцвъках 17 pattern-а за две седмици. Вместо това започнах да правя по-добър дизайн, защото вече имах ценности и рамки, в които да мисля. Започнаха да ми идват по-добри идеи и да правя по-малко грешки. Цялостно, станах по-добър.</p>

<p>Не мисля, че съм изключението. Сигурно ще кажете &#8222;да, но ти си адекватен програмист и затова не си се окепазил&#8220;. Хубаво, съгласен съм. Но ако не бях адекватен програмист, можеше да се омажа с всичко. Можех да прочета Кнут и да напълня кода си с AVL дървета, двоични търсения и алгоритми за сортиране. Или, не дай си боже, можеше да прочета Applying UML and Patterns и да почна да строя системи с 90 слоя, задвижвани от XML. Ако човек е неадекватен, ще се омаже и с най-простия инструмент. Или ще го издигне в религия.</p>

<p>И да, направих грешки. Несъмнено съм overdesign-вал. Не съм стигал до крайности, но е имало случаи, в които съм могъл да мина по-просто. Месец по-късно се е налагало да поддържам и съм си вземал поуката. Човек се учи от грешките си. И ако грешките са малки и могат да се допускат контролирано, това е безценен опит.</p>

<p>Така че, моят съвет е: прочетете Design Patterns внимателно. Вникнете в нея. Дръжте я близо до леглото си. Прилагайте идеите в нея. Може да научите много и да станете по-добри. Ще ви даде полезни инструменти.</p>

<p>А ако изпаднете в неизлечима архитектурна астронавтика и Hello world-а ви изглежда <a href="http://mortendahl.dk/thoughts/blog/view.aspx?id=122">така</a>, може би трябва преквалифицирате. Старата мъдрост гласи, че ако имате единствено чук, всичко изглежда като пирон. Това е лоша нагласа за един програмист. Също като тази, в която изхвърляте идеи само защото са опасни в чуждите ръце.</p>
]]></content:encoded>
			<wfw:commentRss>http://skanev.com/2010/12/12/dijkstra-and-design-patterns/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OpenFest 2010</title>
		<link>http://skanev.com/2010/11/25/openfest-2010/</link>
		<comments>http://skanev.com/2010/11/25/openfest-2010/#comments</comments>
		<pubDate>Thu, 25 Nov 2010 19:48:07 +0000</pubDate>
		<dc:creator>Стефан Кънев</dc:creator>
				<category><![CDATA[Разни]]></category>

		<guid isPermaLink="false">http://skanev.com/?p=444</guid>
		<description><![CDATA[Беше минала седмица. Видях се с ред приятели, слушах интересни презентации и се порадвах на хубавото българско време. Хареса ми. Чакам с нетърпение следващия.

Както писах по-рано, говорих за MongoDB. Качил съм слайдове в SlideShare. Дори не се опитах да правя снимки тази година &#8212; Ники и без това се е справил в порядък по-добре, отколкото [...]]]></description>
			<content:encoded><![CDATA[<p>Беше минала седмица. Видях се с ред приятели, слушах интересни презентации и се порадвах на хубавото българско време. Хареса ми. Чакам с нетърпение следващия.</p>

<p>Както писах по-рано, говорих за MongoDB. Качил съм <a href="http://www.slideshare.net/skanev/why-mongo-db">слайдове в SlideShare</a>. Дори не се опитах да правя снимки тази година &#8212; Ники и без това се е <a href="http://www.flickr.com/photos/nbachiyski/sets/72157625455515960/">справил</a> в порядък по-добре, отколкото аз бих могъл.</p>

<p>Ето какво ми направи впечатление:
<span id="more-444"></span></p>

<p><a href="http://rstankov.com">Радо</a> направи супер интересна презентация за jQuery. Започна с един доволно намазан widget и постепенно го рефакторира до нещо модулно и приятно. Научих полезни неща. Горещо препоръчвам да разгледате <a href="http://www.slideshare.net/rstankov/javascript-eventdriven-architecture">презентацията му</a> и <a href="https://github.com/RStankov/OpenFest-2010/commits/master/">кодът към нея</a>.</p>

<p><a href="http://blog.doncho.net/">Дончо</a> направи презентация за open source и Microsoft. Разбира се, част от публиката му се нахвърли. Две неща ми направиха впечатление. Първо, справи се блестящо с хейта. Второ, някои коментари на хора от публиката бяха абсурдни. Чудя се, нужно ли бе да бъдем толкова дребнави и заядливи? Не може ли да се държим като зрели хора с някакви ценности (отворен код), а не като банда хейтъри, които да скачат на всичко, що не е GNU/Linux/BSD?</p>

<p>Петьо и Христо говориха интересни неща, както винаги. Основната мисъл, която измъкнах от тях бе: <strong>кодът ви трябва да се чете от другите във вашата организация</strong>. Не мога да съм по-съгласен. Учудих се колко много хора не знаят какво е <a href="http://github.com">GitHub</a>. Ако нямате акаунт, спрете веднага да четете и се регистрирайте. Блогът ми ще почака.</p>

<p><a href="http://dzver.com">Веселин</a> говори интересни неща за NoSQL . Беше ми забавно да науча нещо за тези, с които не съм си играл. Получи се хубаво, понеже говорих след него и презентациите ни не се пресичаха особено. От друга страна, изказахме една-две противоположни тези, но това са дребни кахъри.</p>

<p><a href="http://www.batsov.com/">Божидар</a> направо ме разби. Презентация му ми бе по-смешна от моята. За нещастие, нямаше достатъчно време да каже всичко, което искаше. Нещата не бяха нови за мен &#8212; В Scala и Clojure съм убеден отдавна, докато в Groovy &#8212; разубеден отдавна. Въпреки това се размазах.</p>

<p>И си купих 18 книги от O&#8217;Reilly.</p>
]]></content:encoded>
			<wfw:commentRss>http://skanev.com/2010/11/25/openfest-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

