<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5092972944722879737</id><updated>2012-01-21T16:50:24.985+04:00</updated><category term='Microsoft'/><category term='Software Engineering'/><category term='Architecture'/><category term='WCF'/><category term='Статьи'/><category term='Web Services'/><category term='Links'/><category term='DOTNET'/><category term='Опросы'/><category term='Security'/><category term='Just fun'/><category term='News'/><category term='Programming'/><category term='Entity Framework'/><title type='text'>Stump's Workshop</title><subtitle type='html'>&lt;p align="right"&gt;
Понедельник начинается в субботу
&lt;/p&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default?start-index=101&amp;max-results=100'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>255</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-8175708858254234193</id><published>2011-12-18T11:26:00.000+04:00</published><updated>2011-12-18T20:25:14.760+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Продолжим?</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Ох, давненько я сюда не заглядывал...&lt;br /&gt;Но теперь, я надеюсь, у меня появятся новые темы для этого блога. Подобно многим, я покинул большую компанию для того, чтобы поучаствовать в стартапе. Моя новая область деятельности мобильные технологии, вернее софт для мобильных платформ. Должность - СТО, а круг обязанностей просто необъятен. Буду стараться выкраивать время для того, чтобы писать сюда.&lt;br /&gt;До встречи. &amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-8175708858254234193?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/8175708858254234193/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=8175708858254234193' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8175708858254234193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8175708858254234193'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2011/12/blog-post.html' title='Продолжим?'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4287967450669931976</id><published>2011-10-06T16:52:00.003+04:00</published><updated>2011-10-06T17:05:25.803+04:00</updated><title type='text'>Мечта одного человека может изменить целый мир</title><content type='html'>Сегодня ушел Стив Джобс.&lt;br /&gt;Я всегда черпал вдохновение в этом выдающемся человеке. И сегодня, я думаю, такой момент, чтобы еще раз перечитать его замечательную речь перед выпускниками Стэнфорда 2005 года. Сегодня она звучит как напутствие, нам оставшимся, от человека, который сумел изменить мир.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" &gt;Речь Стива Джобса перед выпускниками Cтэнфорда&lt;/span&gt; &lt;/div&gt;&lt;span class="Apple-style-span" &gt;Перевод (C) Дмитрий Честных.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;“Для меня большая честь быть с вами сегодня на вручении дипломов одного из самых лучших университетов мира. Я не оканчивал институтов. Сегодня я хочу рассказать вам три истории из моей жизни. И всё. Ничего грандиозного. Просто три истории.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;Первая история – о соединении точек.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Я бросил Reed College после первых 6 месяцев обучения, но оставался там в качестве “гостя” ещё около 18 месяцев, пока наконец не ушёл. Почему же я бросил учёбу?&lt;br /&gt;&lt;br /&gt;Всё началось ещё до моего рождения. Моя биологическая мать была молодой, незамужней аспиранткой и решила отдать меня на усыновление. Она настаивала на том, чтобы меня усыновили люди с высшем образованием, поэтому мне было суждено быть усыновлённым юристом и его женой. Правда, за минуту до того, как я вылез на свет, они решили, что хотят девочку. Поэтому им позвонили ночью и спросили: “Неожиданно родился мальчик. Вы хотите его?”. Они сказали: “Конечно”. Потом моя биологическая мать узнала, что моя приёмная мать – не выпускница колледжа, а мой отец никогда не был выпускником школы. Она отказалась подписать бумаги об усыновлении. И только несколько месяцев спустя всё же уступила, когда мои родители пообещали ей, что я обязательно пойду в колледж.&lt;br /&gt;&lt;br /&gt;И 17 лет спустя я пошёл. Но я наивно выбрал колледж, который был почти таким же дорогим, как и Стэнфорд, и все накопления моих родителей были потрачены на подготовку к нему. Через шесть месяцев, я не видел смысла моего обучения. Я не знал, что я хочу делать в своей жизни, и не понимал, как колледж поможет мне это осознать. И вот, я просто тратил деньги родителей, которые они копили всю жизнь. Поэтому я решил бросить колледж и поверить, что всё будет хорошо. Я был поначалу напуган, но, оглядываясь сейчас назад, понимаю, что это было моим лучшим решением за всю жизнь. В ту минуту, когда я бросил колледж, я мог перестать говорить о том, что требуемые уроки мне не интересны и посещать те, которые казались интересными.&lt;br /&gt;&lt;br /&gt;Не всё было так романтично. У меня не было комнаты в общаге, поэтому я спал на полу в комнатах друзей, я сдавал бутылки Колы по 5 центов, чтобы купить еду и ходил за 7 миль через весь город каждый воскресный вечер, чтобы раз в неделю нормально поесть в храме кришнаитов. Мне он нравился. И много из того, с чем я сталкивался, следуя своему любопытству и интуиции, оказалось позже бесценным.&lt;br /&gt;&lt;br /&gt;Вот вам пример:&lt;br /&gt;Reed College всегда предлагал лучшие уроки по каллиграфии. По всему кампусу каждый постер, каждая метка были написаны каллиграфическим почерком от руки. Так как я отчислился и не брал обычных уроков, я записался на уроки по каллиграфии. Я узнал о serif и sans serif, о разных отступах между комбинациями букв, о том, что делает прекрасную типографику прекрасной. Она была красивой, историчной, мастерски утонченной до такой степени, что наука этого не смогла бы понять.&lt;br /&gt;&lt;br /&gt;Ничто из этого не казалось полезным для моей жизни. Но десять лет спустя, когда мы разрабатывали первый Макинтош, всё это пригодилось. И Мак стал первым компьютером с красивой типографикой. Если бы я не записался на тот курс в колледже, у Мака никогда бы не было несколько гарнитур и пропорциональных шрифтов. Ну а так как Windows просто сдули это с Мака, скорее всего, у персональных компьютеров вообще бы их не было. Если бы я не отчислился, я бы никогда не записался на тот курс каллиграфии и у компьютеров не было бы такой изумительной типографики, как сейчас.&lt;br /&gt;&lt;br /&gt;Конечно, нельзя было соединить все точки воедино тогда, когда я был в колледже. Но через десять лет всё стало очень, очень ясно.&lt;br /&gt;&lt;br /&gt;Ещё раз: вы не можете соединить точки, смотря вперёд; вы можете соединить их только оглядываясь в прошлое. Поэтому вам придётся довериться тем точкам, которые вы как-нибудь свяжете в будущем. Вам придётся на что-то положиться: на свой характер, судьбу, жизнь, карму – что угодно. Такой подход никогда не подводил меня и он изменил мою жизнь.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;Моя вторая история – о любви и потере.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Мне повезло – я нашёл то, что я люблю по жизни делать довольно рано. Woz и я основали Apple в гараже моих родителей, когда мне было 20. Мы усиленно трудились, и через десять лет Apple выросла из двух человек в гараже до $2–миллиардной компании с 4000 работников. Мы выпустили наше самое лучшее создание – Макинтош – годом раньше и мне только-только исполнилось 30. И потом меня уволили. Как вас могут уволить из компании, которую вы основали? Ну, по мере роста Apple мы нанимали талантливых людей, чтобы помогать мне управлять компанией и в первые пять лет всё шло хорошо. Но потом наше видение будущего стало расходиться и мы в конечном счёте поссорились. Совет директоров перешёл на его сторону. Поэтому в 30 лет я был уволен. Причём публично. То, что было смыслом всей моей взрослой жизни, пропало.&lt;br /&gt;&lt;br /&gt;Я не знал, чего делать несколько месяцев. Я чувствовал, что я подвёл прошлое поколение предпринимателей – что я уронил эстафетную палочку, когда мне её передавали. Я встречался с David Packard и Bob Noyce и пытался извиниться за то, что натворил. Это было публичным провалом и я даже думал о том, чтобы убежать куда подальше. Но что-то медленно стало проясняться во мне – я всё ещё любил то, что делал. Ход событий в Apple лишь слегка всё изменил. Я был отвергнут, но я любил. И, в конце концов, я решил начать всё сначала.&lt;br /&gt;&lt;br /&gt;Тогда я этого не понимал, но оказалось, что увольнение с Apple было лучшим, что могло было произойти со мной. Бремя успешного человека сменилось легкомыслием начинающего, менее уверенного в чём-либо. Я освободился и вошёл в один из самых креативных периодов своей жизни.&lt;br /&gt;&lt;br /&gt;В течении следующих пяти лет я основал компанию NeXT, другую компанию, названную, Pixar и влюбился в удивительную женщину, которая стала моей женой. Pixar создал самый первый компьютерный анимационный фильм, Toy Story, и является теперь самой успешной анимационной студией в мире. В ходе поразительных событий, Apple купила NeXT, я вернулся в Apple, и технология, разработанная в NeXT стала сердцем нынешнего возрождения Apple. А Laurene и я стали замечательной семьёй.&lt;br /&gt;&lt;br /&gt;Я уверен, что ничего из этого не случилось бы, если бы меня не уволили из Apple. Лекарство было горьким, но пациенту оно помогло. Иногда жизнь бьёт вас по башке кирпичом. Не теряйте веры. Я убеждён, что единственная вещь, которая помогла мне продолжать дело была то, что я любил своё дело. Вам надо найти то, что вы любите. И это так же верно для работы, как и для отношений. Ваша работа заполнит большую часть жизни и единственный способ быть полностью довольным – делать то, что по-вашему является великим делом. И единственный способ делать великие дела – любить то, что вы делаете. Если вы ещё не нашли своего дела, ищите. Не останавливайтесь. Как это бывает со всеми сердечными делами, вы узнаете, когда найдёте. И, как любые хорошие отношения, они становятся лучше и лучше с годами. Поэтому ищите, пока не найдёте. Не останавливайтесь.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" &gt;Моя третья история – про смерть.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Когда мне было 17, я прочитал цитату – что-то вроде этого: “Если вы живёте каждый день так, как будто он последний, когда-нибудь вы окажетесь правы.” Цитата произвела на меня впечатление и с тех пор, уже 33 года, я смотрю в зеркало каждый день и спрашиваю себя: “Если бы сегодняшний день был последним в моей жизни, захотел ли бы я делать то, что собираюсь сделать сегодня?”. И как только ответом было “Нет” на протяжении нескольких дней подряд, я понимал, что надо что-то менять.&lt;br /&gt;&lt;br /&gt;Память о том, что я скоро умру – самый важный инструмент, который помогает мне принимать сложные решения в моей жизни. Потому что всё остальное – чужое мнение, вся эта гордость, вся эта боязнь смущения или провала – все эти вещи падают пред лицом смерти, оставляя лишь то, что действительно важно. Память о смерти – лучший способ избежать мыслей о том, что у вам есть что терять. Вы уже голый. У вас больше нет причин не идти на зов своего сердца.&lt;br /&gt;&lt;br /&gt;Около года назад мне поставили диагноз: рак. Мне пришёл скан в 7:30 утра и он ясно показывал опухоль в поджелудочной железе. Я даже не знал, что такое поджелудочная железа. Врачи сказали мне, что этот тип рака не излечим и что мне осталось жить не больше трёх-шести месяцев. Мой доктор посоветовал пойти домой и привести дела в порядок (что у врачей означает приготовиться к смерти). Это значит попытаться сказать своим детям то, что бы ты сказал за следующие 10 лет. Это значит убедиться в том, что всё благополучно устроено, так, чтобы твоей семье было насколько можно легко. Это значит попрощаться.&lt;br /&gt;&lt;br /&gt;Я жил с этим диагнозом весь день. Позже вечером мне сделали биопсию – засунули в горло эндоскоп, пролезли через желудок и кишки, воткнули иголку в поджелудочную железу и взяли несколько клеток из опухоли. Я был в отключке, но моя жена, которая там была, сказала, что когда врачи посмотрели клетки под микроскопом, они стали кричать, потому что у меня оказалась очень редкая форма рака поджелудочной железы, которую можно вылечить операцией. Мне сделали операцию и теперь со мной всё в порядке.&lt;br /&gt;&lt;br /&gt;Смерть тогда подошла ко мне ближе всего, и надеюсь, ближе всего за несколько следующих десятков лет. Пережив это, я теперь могу сказать следующее с большей уверенностью, чем тогда, когда смерть была полезной, но чисто выдуманной концепцией:&lt;br /&gt;Никто не хочет умирать. Даже люди, которые хотят попасть на небеса не хотят умирать. И всё равно, смерть – пункт назначения для всех нас. Никто никогда не смог избежать её. Так и должно быть, потому что Смерть, наверное, самое лучше изобретение Жизни. Она –причина перемен. Она очищает старое, чтобы открыть дорогу новому. Сейчас новое – это вы, но когда-то (не очень-то и долго осталось) – вы станете старым и вас очистят. Простите за такой драматизм, но это правда.&lt;br /&gt;&lt;br /&gt;Ваше время ограничено, поэтому не тратьте его на жизнь чей-то чужой жизнью. Не попадайте в ловушку догмы, которая говорит жить мыслями других людей. Не позволяйте шуму чужих мнений перебить ваш внутренний голос. И самое важное, имейте храбрость следовать своему сердцу и интуиции. Они каким-то образом уже знают то, кем вы хотите стать на самом деле. Всё остальное вторично.&lt;br /&gt;&lt;br /&gt;Когда я был молод, я прочитал удивительную публикацию The Whole Earth Catalog (“Каталог всей Земли”), которая была одной из библий моего поколения. Её написал парень по имени Stewart Brand, живущий тут недалеко в Menlo Park. Это было в конце шестидесятых, до персональных компьютеров и настольных издательств, поэтому она была сделана с помощью пишущих машинок, ножниц и полароидов. Что-то вроде Google в бумажной форме, 35 лет до Google. Публикация была идеалистической и переполненной большими идеями.&lt;br /&gt;&lt;br /&gt;Steward и его команда сделали несколько выпусков The Whole Earth Catalog и, в конце концов, издали финальный номер. Это было в середине 70–х и я был вашего возраста. На последней странице обложки была фотография дороги ранним утром, типа той, на которой вы, может быть, ловили машины, если любили приключения. Под ней были такие слова: “Оставайтесь голодными. Оставайтесь безрассудными”. Это было их прощальное послание. Оставайтесь голодными. Оставайтесь безрассудными. И я всегда желал себе этого. И теперь, когда вы заканчиваете институт и начинаете заново, я желаю этого вам.&lt;br /&gt;&lt;br /&gt;Оставайтесь голодными. Оставайтесь безрассудными.&lt;br /&gt;&lt;br /&gt;Всем большое спасибо.”&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4287967450669931976?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4287967450669931976/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4287967450669931976' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4287967450669931976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4287967450669931976'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2011/10/blog-post.html' title='Мечта одного человека может изменить целый мир'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-5728761345193645869</id><published>2010-04-08T10:38:00.003+04:00</published><updated>2010-05-27T14:13:21.387+04:00</updated><title type='text'>WANTED! Требуются крутые специалисты в Дубну</title><content type='html'>Upd. 27.05.2010. Вакансии закрыты. Спасибо всем откликнувшимся. &lt;br /&gt;&lt;br /&gt;В офисе Luxoft в Дубне открыты две интересные вакансии: разработчика и инженера по тестированию. Требования весьма высокие, но и проект интересный - разработка &lt;a href="http://www.coverity.com/products/static-analysis.html"&gt;средств статического анализа кода для Visual Studio&lt;/a&gt;.  &lt;br /&gt;Если вы крепкий специалист, имеете опыт в описанных ниже областях, и чувствуете в себе силы поучаствовать в таком проекте, то поверьте, вы можете очень много почерпнуть для себя в профессиональном плане здесь, у нас. &lt;br /&gt;Ну, и помимо всего прочего, у нас отличный офис, и прекрасные условия для жизни и отдыха. Летом в обеденный перерыв можно куаться в Волге, это не шутка. Водные лыжи, острова, велосипеды, джазовые фестивали, все это Дубна lifestyle :)  &lt;br /&gt;Иногородним - помощь в перезде и подборе жилья.   &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Требования к кандидату на позицию Visual Studio Integration Package developer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Глубокие знания .NET Framework 3.5 (многопоточность, асинхронные вызовы)&lt;br /&gt;Глубокие знания ООП/ООА. Шаблоны проектирования.&lt;br /&gt;Знания алгоритмов работы со структурами данных (списки, деревья)&lt;br /&gt;Обязательный опыт разработки WinForms приложений на основе MVC/MVP.&lt;br /&gt;Обязательные знания WCF, WS-*&lt;br /&gt;Опыт разработки юнит тестов.&lt;br /&gt;Понимание COM модели программирования.&lt;br /&gt;&lt;br /&gt;Английский язык – Upper-Intermediate&lt;br /&gt;Огромный плюс – знакомство с Visual Studio SDK. Опыт разработки VSIP.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Требования к кандидату на позицию Desktop Plugin Functional Tester&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;MUST HAVE Strong English skills (reading/writing)&lt;br /&gt;MUST HAVE Demonstrable knowledge in SQE practices, principles, strategies and techniques. Understanding of defect life cycle&lt;br /&gt;MUST HAVE Knowledge and understanding of any object-oriented language code for testing purposes (Preferably Java or C++, C#), including ability to write simple programs, and reading code.&lt;br /&gt;MUST HAVE Experience in  Windows, Linux, Mac OSX&lt;br /&gt;MUST HAVE Experience in writing test cases&lt;br /&gt;MUST HAVE Experience with Integrated Development Environments: Eclipse/Visual Studio&lt;br /&gt;&lt;br /&gt;NICE TO HAVE Experience with any testing automation tool, such as SilkTest, Rational Functional Tester, Load Runner, etc.&lt;br /&gt;NICE TO HAVE Comfortable with at least one scripting language, e.g.. perl, python &lt;br /&gt;NICE TO HAVE Some basic Java knowledge. Experience in Squish automation tool.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Обратите внимание что на обе вакансии требуется strong English. Вы должны быть готовы к телефонному интервью с парнями из San Francisco, CA&lt;br /&gt;&lt;br /&gt;Присылайте резюме на мой адрес srozovik[at]gmail.com &lt;br /&gt;&lt;br /&gt;P.S. Это не мой проект. Я просто передам ваши резюме всоему коллеге, менеджеру проекта.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-5728761345193645869?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/5728761345193645869/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=5728761345193645869' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5728761345193645869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5728761345193645869'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2010/04/wanted.html' title='WANTED! Требуются крутые специалисты в Дубну'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-2573106304314595919</id><published>2010-03-30T16:16:00.000+04:00</published><updated>2010-03-30T16:16:06.065+04:00</updated><title type='text'>Эх, браузеры...</title><content type='html'>Нет счастья в этой жизни. Замучили браузеры. Мозила слишком долго грузится. IE постоянно сваливается, и все больше сайтов, которые в IE отображаются криво. &lt;br /&gt;Пересел на Google Chrome, так этот со вчерашнего дня перестал отображать чекбоксы и радиобатоны на всех формах. &lt;br /&gt;Может кто знает, как лечится?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-2573106304314595919?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/2573106304314595919/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=2573106304314595919' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2573106304314595919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2573106304314595919'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2010/03/blog-post.html' title='Эх, браузеры...'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4033846899862492143</id><published>2010-01-28T21:17:00.002+03:00</published><updated>2010-01-28T21:21:47.519+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Кампус</title><content type='html'>Многие знают какие замечательные кампусы у Google, Microsoft или Sun. А у нас в Дубне не хуже. &lt;br /&gt;Вот шел с работы и обратил внимание, что включена вся иллюминация, и рука сама потянулась в рюкзак за фотоаппаратом. &lt;br /&gt;&lt;br /&gt;Смотрите - это Дубна, улица Программистов. Здесь куют Русский силикон :))&lt;br /&gt; &lt;br /&gt;&lt;div style='text-align:center;margin:0px auto 10px;'&gt;&lt;a href='http://3.bp.blogspot.com/_pgw_S4UsSeM/S2HUVtplsMI/AAAAAAAACVk/RlybPquJ5BQ/s1600-h/P1060316.JPG'&gt;&lt;img src='http://3.bp.blogspot.com/_pgw_S4UsSeM/S2HUVtplsMI/AAAAAAAACVk/RlybPquJ5BQ/s400/P1060316.JPG' border='0' alt='Силиконовая долина в Дубне' /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;Остается добавить, что за бортом было, что-то около -25...&lt;br /&gt;&lt;br /&gt;Это кросс-пост с &lt;a href="http://mydubna.blogspot.com/2010/01/blog-post_28.html"&gt;персонального блога&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4033846899862492143?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4033846899862492143/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4033846899862492143' title='Комментарии: 13'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4033846899862492143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4033846899862492143'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2010/01/blog-post_28.html' title='Кампус'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pgw_S4UsSeM/S2HUVtplsMI/AAAAAAAACVk/RlybPquJ5BQ/s72-c/P1060316.JPG' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-1819993051179425791</id><published>2010-01-27T22:45:00.004+03:00</published><updated>2010-01-27T23:50:39.673+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>iPhone переросток, или Стив Джобс вам покажет, как надо продавать таблетки</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_pgw_S4UsSeM/S2CgZZN8tEI/AAAAAAAACU8/VsLNETgZ-9s/s1600-h/ipad.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 291px; height: 320px;" src="http://4.bp.blogspot.com/_pgw_S4UsSeM/S2CgZZN8tEI/AAAAAAAACU8/VsLNETgZ-9s/s320/ipad.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5431517508735382594" /&gt;&lt;/a&gt;&lt;br /&gt;Ажиотаж вокруг гипотетического планшета от Apple умело подогревался все последнее время. И вот наконец сегодня &lt;a href="http://lenta.ru/news/2010/01/27/creation/"&gt;Стив Джобс, наконец, представил&lt;/a&gt;, как он сам его охарактеризовал, ни много ни мало, дело всей своей жизни  - планшет &lt;a href="http://www.apple.com/ipad/"&gt;iPad&lt;/a&gt;. Я думаю стив не шутил, потому что сегодня на главной странице &lt;a href="http://www.apple.com/"&gt;www.apple.com&lt;/a&gt; один большой iPad и ничего более. &lt;br /&gt;В среде аналитиков заметно некоторое недоумение, вызванное тем, с каким пафосом презентован iPhone переросток. Планшеты или таблетки (по-моему термин Microsoft) известны давно, но большого успеха никогда не имели. Весь рынок этих устройств оценивается что то около 700 млн $. Кое-кто говорил, что планшеты  - это вообще бесперспективно, и нетбуки вытеснят планшеты в нишу простых читалок, вроде &lt;a href="http://ru.wikipedia.org/wiki/Amazon_Kindle"&gt;Amazon Knidle&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Смею предположить, что скоро всем скептикам станет очевидна огромная перспективность рынка планшетов :) Что планшет  - это именно то, чего всем нам не хватало. Далее последует череда убийц iPad-а, ну и т.д. как обычно :) А Apple в очередной раз продемонстрирует, как надо продавать. Только вот повторить урок, что-то ни у кого не получается.&lt;br /&gt;На сей раз рецепт успеха выглядит следующим образом.&lt;br /&gt;9,7 дюймововый мультитач дисплей 12,5 мм толщиной и 680 граммов весом. 10 часов работы. Камера, Wi-Fi, 3G, 16 - 64 Гб флэш памяти. Гламурный чехол и 140 тысяч приложений для iPhone, которые без проблем запускаются на и на старшем брате.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-1819993051179425791?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/1819993051179425791/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=1819993051179425791' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1819993051179425791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1819993051179425791'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2010/01/iphone.html' title='iPhone переросток, или Стив Джобс вам покажет, как надо продавать таблетки'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_pgw_S4UsSeM/S2CgZZN8tEI/AAAAAAAACU8/VsLNETgZ-9s/s72-c/ipad.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-1956739159558133139</id><published>2010-01-27T20:46:00.005+03:00</published><updated>2010-01-27T22:15:11.999+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>Программная инженерия от Сергея Орлика</title><content type='html'>Хорошая новость. &lt;a href="http://sorlik.blogspot.com/"&gt;Сергей Орлик&lt;/a&gt; опубликовал сайт &lt;a href="http://swebok.sorlik.ru/"&gt;"Основы Программной Инженерии(по SWEBOK)"&lt;/a&gt;&lt;br /&gt;По сути, это перевод &lt;a href="http://www.swebok.org/"&gt;SWEBOK&lt;/a&gt; с коментариями и замечаниями авторов перевода. &lt;br /&gt;SWEBOK - это свод знаний по программной инженерии. Отношение к разработке софта, как к инженерному процессу - это, на мой взгляд, именно то, чего весьма не хватает русскоговорящему программному сообществу. За последние 5-7 лет мы хорошо продвинулись в плане освоения новых технологий. Сегодня не проблема найти программиста с глубокими знаниями Spring, Hibernate, Pyton или Ruby. Выросла целая армия .Net программистов и почти никого не вводят в ступор Mock objects или Dependency Injection.&lt;br /&gt;Однако в плане организации процесса в большинстве компаний разработка ведется практически на голой коленке. А ведь успех разработки зависит от правильного использования технологий хорошо, если процентов на пять. Остальное - terra incognita, с раскиданными повсюду граблями, на которые не устают наступать все новые поколения разработчиков. Практически все, что знает о разработке софта средне-статистический программист умещается в главе 3 &lt;a href="http://swebok.sorlik.ru/3_software_construction.html"&gt;"Конструирование"&lt;/a&gt;. А глав там - одиннадцать. Делайте выводы. &lt;br /&gt;Сергей Орлик, один из тех, кто протаптывает для нас тропинки на этой неведомой территории, расставляет флажки и помечает грабли. &lt;br /&gt;За это ему наш глубокий респект.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-1956739159558133139?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/1956739159558133139/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=1956739159558133139' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1956739159558133139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1956739159558133139'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2010/01/blog-post_27.html' title='Программная инженерия от Сергея Орлика'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4467012545440202615</id><published>2010-01-27T16:07:00.004+03:00</published><updated>2010-01-27T22:13:08.559+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Нестыковочка</title><content type='html'>Продолжаем тему "государство и информационные технологии".&lt;br /&gt;Теперь Федеральная налоговая служба отличилась. ФНС создала не что ни будь а web сервис(!), под названием &lt;a href="https://service.nalog.ru/debt/"&gt;"Личный кабинет налогоплательщика"&lt;/a&gt;. Специально для физических лиц. &lt;br /&gt;А мне в конце прошлого года письмецо было из налоговой, что мол пора бы заплатить налог на недвижимость. Заплатил. И вот теперь, думаю, гляну ка я как там мой налог на недвижимость поживает. Захожу я в свой личный кабинет налогоплательщика, ввожу ИНН, фамилию, имя, жму на кнопку и получаю: &lt;br /&gt;&lt;br /&gt;"Ошибка ввода. Некорректный ИНН". &lt;br /&gt;&lt;br /&gt;Причем ошибка выскакивает сразу, без запроса к серверу. ИНН вбивал из налогового документа, поэтому ошибка исключена. &lt;br /&gt;Попробовал написать письмо в техподдержку и тут же получил:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Delivery to the following recipient failed permanently:&lt;br /&gt;&lt;br /&gt;    lkp@gnivc.ru&lt;br /&gt;&lt;br /&gt;Technical details of permanent failure:&lt;br /&gt;Google tried to deliver your message, but it was rejected by the recipient domain. We recommend contacting the other email provider for further information about the cause of this error. The error that the other server returned was: 554 554 5.1.0 Sender denied (state 13).  &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Хороший сервис, наверное.  Жаль не работает. Хотя может кому-то удалось этим сервисом воспользоваться?&lt;br /&gt;&lt;br /&gt;P.S. Оказалось что ИНН был действительно с ошибкой, хотя взял я его из своего заявления на вычет, и вычет я, кстати, получил :)&lt;br /&gt;Дома нашел свидетельство о выдаче ИНН и все заработало. А вот мыло мое почему зарежектил их сервер - не понятно. Я вроде не спамер. &lt;br /&gt;А вообще, сервис полезный. &lt;br /&gt;Да, у меня тоже пеня :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4467012545440202615?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4467012545440202615/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4467012545440202615' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4467012545440202615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4467012545440202615'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2010/01/blog-post.html' title='Нестыковочка'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-8008214607300569491</id><published>2009-09-25T08:44:00.004+04:00</published><updated>2009-09-25T12:42:25.623+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Великий Русский Файервол</title><content type='html'>&lt;div align="right"&gt;&lt;em&gt;– Вылупился, – спокойно сказал Роман, глядя в потолок.&lt;br /&gt;– Кто? – Мне было не по себе: крик был женский.&lt;br /&gt;– Выбегаллов упырь, – сказал Роман. – Точнее, кадавр.&lt;br /&gt;– А почему женщина кричала?&lt;br /&gt;– А вот увидишь, – сказал Роман.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;"Понедельник начинается в субботу" А. и Б. Стругацкие.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Читаю сегодня с CNews &lt;a href="http://internet.cnews.ru/news/top/index.shtml?2009/09/24/363181"&gt;"ФСБ и Минсвязи защитят чиновников от Google"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;На заседании правительственной комиссии по федеральной связи и ИТ Александр Гридин, генеральный директор ФГУП «НТЦ Атлас», предложил создать программно-аппаратный комплекс для обеспечения сетевой анонимности госслужащих. По его мнению, необходимо разработать отечественный прокси-сервер, блокирующий возможность анализа их сетевой активности зарубежными службами.&lt;br /&gt;Кроме того, сервер, по задумке Гридина, будет генерировать необходимое количество маскирующих запросов к интернет-ресурсам, чтобы дополнительно затруднить анализ.&lt;br /&gt;«Нужно создать платформу на базе как Windows, так и Linux, с сертифицированными криптосредствами, браузер под обе эти ОС и доработать типовые серверные приложения - поддержал идею «Атласа» Анатолий Лакаев, директор НИИ «Интеграл» - Мы готовы взяться за эту работу и совместно с ФСБ и «Атласом» выполнить ее в течение года».&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Если кто не в курсе, ФГУП «НТЦ Атлас», это контора которая создала скандально известную систему контроля за оборотом алкоголя ЕГАИС, из-за внедрения которой, как вы помните, летом 2006 года с прилавков исчезла вся водка и вино.&lt;br /&gt;Не приходится сомневаться в том, что эти ребята способны родить файервол, который наглухо перекроет чиновникам доступ в интеренет, просто из-за того, что будет как обычно неработоспособен.&lt;br /&gt;Вопрос в другом. А нафига собственно чиновников защищать от Гугла и Яндекса с Бегуном? Чтоб никто не узнал, что основной трафик в МВД идет с порносайтов? Для чего еще надо скрывать сетевую активность чиновников?&lt;br /&gt;Иное дело Агенты Национальной Безопасности. Эти, да, должны быть инкогнито по определению. Однако вряд ли они захотят пользоваться продуктом «НТЦ Атлас».&lt;br /&gt;&lt;br /&gt;Если серьезно, то поставленная задача на раз решается при помощи существующих программных средств, коих просто море платных и бесплатных, и правильно настроенных политик сетевой безопасности.&lt;br /&gt;&lt;br /&gt;Остается только констатировать беспредельно возросшую степень наглости любителей распила бюджетов. Ведь оскандалились уже раз на всю страну. Теперь сидели бы тихонько, пилили внутренние бюджетики в своей Минкомсвязи. Так, нет, хочется большего.&lt;br /&gt;Поэтому закончу цитатой проф. Выбегалло из "Понедельника" Стругацких:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Мы имеем перед собою конкретную модель непрерывно возрастающих материальных потребностей. И только поверхностному наблюдателю может казаться, что пароксизмы довольства якобы прекратились. На самом деле они диалектически перешли в новое качество. Они, товарищи, распространились на сам процесс удовлетворения потребностей. Теперь ему мало быть сытым. Теперь потребности возросли, теперь ему надо все время кушать, теперь он самообучился и знает, что жевать – это тоже прекрасно."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Таких вот "желудочно неудовлетворенных" кадавров становится все больше вокруг нашего, во всех отношениях распрекрасного чиновничества. И кормить их всех будут на наш с вами счет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-8008214607300569491?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/8008214607300569491/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=8008214607300569491' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8008214607300569491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8008214607300569491'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/09/blog-post.html' title='Великий Русский Файервол'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-8950684399562133604</id><published>2009-08-28T09:21:00.004+04:00</published><updated>2009-08-28T09:41:59.771+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>WTF</title><content type='html'>Скажите, что должен чувствовать программист, когда вот для примерно такого кода:&lt;br /&gt;&lt;DIV class="code"&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;float speed = Float.NaN;&lt;br /&gt;if (speed == Float.NaN)&lt;br /&gt;   Dialog.alert("Not a number");&lt;br /&gt;else&lt;br /&gt;   Dialog.alert("Shit happens...");&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;br /&gt;он видит на экране "Shit happens..."?&lt;br /&gt;Ага, такое дерьмо приключилось вчера со мной, когда я ковырялся в реализации J2ME от одного вполне уважаемого вендора. Убив на проблему около часа, я совсем было отчаялся, решил что я уже слишком стар для таких приколов, и пора мне завязывать с программированием. Однако, неожиданно, замена &lt;em&gt;(speed == Float.NaN)&lt;/em&gt; на &lt;em&gt;(Float.isNaN(speed))&lt;/em&gt; решила проблему. Дерьмо исчезло. &lt;br /&gt;Но запах остался... &lt;br /&gt;Продолжаю программировать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-8950684399562133604?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/8950684399562133604/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=8950684399562133604' title='Комментарии: 14'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8950684399562133604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8950684399562133604'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/08/wtf.html' title='WTF'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-8002287838524720529</id><published>2009-07-23T09:21:00.003+04:00</published><updated>2009-07-23T09:44:23.482+04:00</updated><title type='text'>Google меня уважает.</title><content type='html'>Я вчера &lt;a href="http://stump-workshop.blogspot.com/2009/07/google.html"&gt;тут пожаловался&lt;/a&gt;, на то что Google без предупреждения сменил дизайн моей домашней страницы в iGoogle, и даже с горя горзился уйти с этого сервиса.&lt;br /&gt;Ну народ в коментах поглумился, дескать "напугал козла капустой"... Тем не менее, сегодня утром моя домашняя страница вернулась к прежнему виду. Возможно причиной тому было наличие реальных багов в новом дизайне iGoogle, но мне все же хочется верить что это и мой глас вопиющего был услышан. Если это так, то Google  - человечище. Как разработчик знаю, как не легко порой любить пользователей своих прдуктов, в то время когда хочется просто их прибить всех. Ты им новые фичи, а они на тебя с кулаками :)&lt;br /&gt;&lt;br /&gt;Ну, в  общем я доволен. Google, слышишь? Я тобой доволен!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-8002287838524720529?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/8002287838524720529/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=8002287838524720529' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8002287838524720529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8002287838524720529'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/07/google_23.html' title='Google меня уважает.'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-2897318896284198326</id><published>2009-07-22T16:29:00.002+04:00</published><updated>2009-07-22T16:36:40.410+04:00</updated><title type='text'>Firefox занят, Firefox-у некогда.</title><content type='html'>Сегодня просто день обломов какой-то. &lt;br /&gt;У нас на проекте сборка крутится на &lt;a href="http://hudson.dev.java.net/"&gt;Хадсоне&lt;/a&gt;. Удобная штука, но с моим браузером IE не дружит в последнее время. Поэтому хожу на сборочный сервер я при помощи Firefox.&lt;br /&gt;И вот запускаю я Firefox, чтоб пойти на сервер сборки и собрать новый билд, а Firefox мне и говорит: &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Firefox загружает обновление. Подождите несколько минут."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Вот так. Firefox важным делом занят, а тут я со своей дурацкой сборкой....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-2897318896284198326?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/2897318896284198326/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=2897318896284198326' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2897318896284198326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2897318896284198326'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/07/firefox-firefox.html' title='Firefox занят, Firefox-у некогда.'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-2284084148064125525</id><published>2009-07-22T10:43:00.002+04:00</published><updated>2009-07-22T11:25:28.658+04:00</updated><title type='text'>Google - ты меня уважаешь?</title><content type='html'>Если кто не в курсе, у Goole есть такой сервис iGoogle  - сервис персонализированных страниц. Я использую iGoogle в качестве домашней страницы, все что мне надо для повседневного серфинга разложено по шести вкладкам на моей странице iGoogle.&lt;br /&gt; &lt;br /&gt;И вот сегодня утром я обнаружил свою домашнюю страницу в совершенно непотребном состоянии. Ярлыки вкладок уехали на левую сторону страницы и ведут себя неадекватно, лэйаут поломан, внизу появился какой то Google chat...&lt;br /&gt;Первое впечатление  - просто шок. Ощущение как будто кто-то покопался ночью в ящиках моего рабочего стола и оставил все там в верх тормашками. Кто-то хакнул мою домашнюю страницу! Почти полчаса я потратил на бесплодные попытки вернуть все как было, пришлось даже лезть и RTFM. Все тщетно. Мануалы усиленно делали вид, что так было всегда. Великий Google решил, что &lt;strong&gt;моя персональная домашняя страница&lt;/strong&gt; отныне должна выглядеть именно так. Отката не предусмотрено. &lt;br /&gt;&lt;br /&gt;Я подозреваю, что настоящая причина, ради которой так бесцеремонно была поломана моя домашняя страница - это засунуть ко мне на страницу этот самый Google чат. Ребята, мне не нужен Google чат здесь! Вы меня спросили? Сначала впендюрили его в web интерфейс Gmail, теперь вот прямо ко мне домой затащили его. Ночью. Без спроса. Выключить нельзя. &lt;br /&gt;&lt;br /&gt;Великий Google, пожалуйста, не лазь больше по ночам через форточку на мою домашнюю страницу, верни все как было, и забери, пожалуйста, свой чат. Иначе я уйду.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-2284084148064125525?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/2284084148064125525/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=2284084148064125525' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2284084148064125525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2284084148064125525'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/07/google.html' title='Google - ты меня уважаешь?'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-3656668890696727946</id><published>2009-03-21T20:02:00.003+03:00</published><updated>2009-03-21T20:13:30.812+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>IE8 - первые впечатления</title><content type='html'>Установил &lt;a href="http://www.microsoft.com/rus/windows/internet-explorer/"&gt;IE8&lt;/a&gt;. Работает действительно быстро, примерно как Chrome. Особенно это заметно после IE7, даже мерять не надо, на глаз видно.  &lt;br /&gt;Плюс - все привычные примочки остались на своих местах, обобенно мой любимый Google Toolbar. Понравились акселераторы.&lt;br /&gt;Минус - пока один. В IE8 Не работает Puntoswitcher. Может потом еще что нибудь вылезет. &lt;br /&gt;Совершенная загадка - цвет ярлыков вкладок. Они то голубые, то зеленые, то малиновые, то желтые. Никак не пойму, от чего зависит их цвет. Причем он постоянно меняется.&lt;br /&gt;Но, блин, быстро работает. Даже не похоже на IE...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-3656668890696727946?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/3656668890696727946/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=3656668890696727946' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3656668890696727946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3656668890696727946'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/03/ie8.html' title='IE8 - первые впечатления'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-610888184438732243</id><published>2009-03-17T22:41:00.001+03:00</published><updated>2009-03-17T22:45:22.475+03:00</updated><title type='text'>Похоже, не ждали...</title><content type='html'>Свершилось, наш офис переехал на левый берег, в комплекс офисов Особой экономической зоны. Теперь наш адрес Дубна, ул. Программистов 4 корпус 3. Вот этот самый:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_pgw_S4UsSeM/SRiHEnngI4I/AAAAAAAAA8g/3a6dbK4aOCk/s1600-h/P1030897.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5267108277633688450" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 240px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_pgw_S4UsSeM/SRiHEnngI4I/AAAAAAAAA8g/3a6dbK4aOCk/s320/P1030897.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Справа на третьем этаже наши окна.&lt;br /&gt; &lt;br /&gt;Как-то так вышло, что в этот корпус мы въехали первыми. И несмотря на то, что о его готовности &lt;a href="http://dubna.rosoez.ru/news/official/179244/"&gt;рапортавали еще с декабря&lt;/a&gt;, похоже, что нас здесь не ждали...&lt;br /&gt;&lt;br /&gt;Пробираться в офис пришлось через черный ход. На месте парадного - груды строительного мусора, его вывозят второй день и конца нет. Коридоры встретили нас бодрым стрекотом перфораторов и толстым слоем строительной пыли. В потолке третьего этажа зияют выдолбленные аккуратные дыры, как от гранатомета с видом на хмурое мартовское небо - строители забыли заложить какие-то коммуникации и теперь правят свои "баги". Видимо дом для программистов решили строить так же, как программисты делают свои программы :). &lt;br /&gt;Лифты очень красивые, блестят хромом, но не работают. Даже кнопок нет. Замысловатые зигзаги коридоров с первого раза осиливал не каждый, и то и дело из-за очередного поворота доносились бессмертные цитаты персонажа Семена Фарады из "Чародеев"  - "Люююди!!!" и "Ну кто так строит?!".&lt;br /&gt; &lt;br /&gt;Но самой большой неожиданностью в первый день стало полное отсутствие в здании уборных. Ну вернее сортир где-то существовал, но скрывался он за какой-то из сотен совершенно одинаковых запертых дверей без всяких опознавательных знаков. Ближе к обеду наши южные братья-строители все же сжалились над уныло бродящими по коридорам программистами, совершенно потерявшими способность программировать по причине вполне естественной нужды, и открыли один из нужников. &lt;br /&gt;Но жизнь постепенно налаживается. Ведь сегодня с утра отважный рабочий уже крушил перфоратором писсуар в неожиданно обнаружившемся отхожем месте буквально за стеной нашей комнаты. Говорят, что также есть надежда на скорое появление уборщицы. В конце концов, надо кому-то было въехать сюда первым, иначе они строили бы его вечно.&lt;br /&gt; &lt;br /&gt;А в общем, не все так плохо. Уйдя в пятницу вечером из одного офиса, в понедельник утром в 10 часов мы уже запустили все свои проектные сервера, а в 11 - уже собрали новый билд - 255-ый по счету (единички не хватило до круглого числа). Отличный показатель для офиса который кишмя кишит программистами, на каждого из которых приходится по паре серверов не считая рабочих станций. За это нашим админам Мише и Марине - респект и уважуха.&lt;br /&gt;&lt;br /&gt;Это &lt;a href="http://mydubna.blogspot.com/2009/03/blog-post_17.html"&gt;кросс-пост из личного блога&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-610888184438732243?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/610888184438732243/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=610888184438732243' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/610888184438732243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/610888184438732243'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/03/blog-post.html' title='Похоже, не ждали...'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_pgw_S4UsSeM/SRiHEnngI4I/AAAAAAAAA8g/3a6dbK4aOCk/s72-c/P1030897.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-3953242378884145377</id><published>2009-02-28T00:47:00.003+03:00</published><updated>2009-02-28T00:54:32.729+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Статьи'/><title type='text'>Что общего между Android и .Net?</title><content type='html'>Думаете ничего? Забавные и неожиданные параллели обнаруживаются порой в развитии информационных систем. &lt;br /&gt;Все знают о том, что в прошлом году Google запустил &lt;a href="http://code.google.com/intl/ru/android/"&gt;Android&lt;/a&gt; - свою мобильную платформу. Android построен на ядре Linux, а прикладные приложения выполняются в виртуальных машинах (sandbox) и для их разработки используется Java. Или, вернее, язык с синтаксисом Java и библиотеки анлогичные Java SE. А в качестве среды исполнения вместо JVM используется виртуальная машина &lt;a href="http://ru.wikipedia.org/wiki/Dalvik_virtual_machine"&gt;Dalvik&lt;/a&gt;. Сразу возникает резонный вопрос, а зачем вообще Google понадобилось изобретать велосипед, почему не использовать стандартную для мобильных устройств Java ME? Вроде бы Google не намерен зарабатывать непосредственно на софте для Android. Кроме того, использование Java ME обеспечило бы переносимость огромного количества мобильных приложений на новую платформу. &lt;br /&gt;Однако тут все не так просто, и как уже &lt;a href="http://www.betaversion.org/~stefano/linotype/news/110/"&gt;заметили&lt;/a&gt; &lt;a href="http://ivbeg.livejournal.com/81935.html"&gt;многие&lt;/a&gt; все дело в лицензионной политике. В случае с Java ME, Sun продемонстрировала просто чудеса &lt;strike&gt;иезуитства&lt;/strike&gt; изобретательности, выпустив ее сразу под двумя лицензиями: GPLv2 и коммерческой. А это вынуждает производителей, использующих Java ME либо открывать весь свой код, либо... платить Sun :)&lt;br /&gt;&lt;br /&gt;Естественно, все это не укладывалось в рамки политики, которую &lt;a href="http://source.android.com/license"&gt;избрал&lt;/a&gt; Google для продвижения Android. В отличие от Sun, у которой хорошие юристы, Google решил положиться на своих инженеров и... создал свою реализацию виртуальной машины. Причем, Dalvik - это не просто новая реализация JVM (которую все едино пришлось бы лицензировать в Sun), Dalvik вообще не использует Java байт-код (вернее байт-код, полученный в результате компиляции в design-time преобразуется в dex формат, который и используется в run-time). В общем, инженеры Google обставили лоеров Sun. Неудивительно, что мы не видим Sun в &lt;a href="http://www.openhandsetalliance.com/oha_members.html"&gt;списке участников Open Handset Alliance&lt;/a&gt;. Тем не менее в Google предпочитают не заострять внимание на этом вопросе, и когда речь заходит о Dalvik они предпочитают говорить об оптимизации своей виртуальной машины под специфику мобильной платформы, позволяющей запускать множество экземпляров, и т.д. и т.п.&lt;br /&gt;&lt;br /&gt;Интересно, что девять лет назад подобная история имела место в отношении Sun и Microsoft. И в результате на свет появился еще один "язык, похожий на Java" и "еще одна реализация виртуальной машины" - .Net. Практически все увидели в этом ответ Microsoft SUN и его платформе Java. Новый язык был очень похож на Java по синтаксису, а платформа весьма напоминала JRE. Тогда еще у всех на памяти было противостояние MS и Sun на почве Java, которое закончилось грандиозным скандалом, судебным иском Sun против Microsoft и последующим мировым соглашением. Суть претензий Sun заключалась в том, что Microsoft внесла изменения в свою реализацию JVM, которые делали ее несовместимой со спецификациями Sun и давали преимущества Java программам, исполняемым под Windows. В результате судебных тяжб Microsoft потеряла возможность развивать свою версию JVM. Это, собственно, и стало основным политическим мотивом для создания .Net Framework.&lt;br /&gt;Тогда Microsoft также предпочитала говорить не о борьбе с Sun, а о необходимости более тесной интеграции с WinAPI и COM. &lt;br /&gt;&lt;br /&gt;История повторяется. Но .Net - это закрытая проприетарная платформа, ориентированная на Windows, которая за 9 лет так и не смогла существенно постенить Sun и Java с занимаемых ими позиций. А вот с Android все выглядит более серьезно, и более угрожающе. Сегодня у Sun есть реальные шансы потерять платформенное лидерство. Как бы им не повторить судьбу &lt;a href="http://ru.wikipedia.org/wiki/Digital_Equipment_Corporation"&gt;DEC&lt;/a&gt; и Compaq.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-3953242378884145377?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/3953242378884145377/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=3953242378884145377' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3953242378884145377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3953242378884145377'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/02/android-net.html' title='Что общего между Android и .Net?'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-5361983954009745020</id><published>2009-02-25T13:47:00.002+03:00</published><updated>2009-02-25T13:59:58.652+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><category scheme='http://www.blogger.com/atom/ns#' term='DOTNET'/><title type='text'>Модульные тесты для SilverLight</title><content type='html'>&lt;a href="http://www.codeplex.com/CThru"&gt;SilverUnit&lt;/a&gt; (другое название CThru) - движок для модульного тестирования SilverLight.&lt;br /&gt;Интересно, что&lt;br /&gt; - тесты могут исполняться в обычном NUnit или MS Test tools без специальной Silverlight-компиляции&lt;br /&gt; - тесты исполняются в обычном CLR runtime, не в silverlight.&lt;br /&gt;&lt;br /&gt;В общем полная изоляция. А все потому, что SilverUnit построен на базе &lt;a href="http://www.codeplex.com/CThru/Wiki/View.aspx?title=Typemock%20Open-AOP%20API&amp;referringTitle=Home"&gt;Typemock Open-AOP API&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-5361983954009745020?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/5361983954009745020/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=5361983954009745020' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5361983954009745020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5361983954009745020'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/02/silverlight.html' title='Модульные тесты для SilverLight'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-88506334304442140</id><published>2009-02-22T13:54:00.004+03:00</published><updated>2009-02-22T14:00:29.776+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Статьи'/><title type='text'>Как проводить телефонное интервью</title><content type='html'>В блогах полно статей для кандидатов о том, как проходить интервью. Этот пост наоборот, для тех кто проводит интервью.&lt;br /&gt;&lt;br /&gt;Есть мнение, что на телефонном интервью нельзя выявить уровень знаний кандидата, что человек на другом конце провода может обложиться учебниками и электронными справочниками, и будет водить интервьюера за нос. Тем не менее, телефонное интервью, да еще тестовое задание – это часто единственные способы оценить знания и опыт удаленного кандидата. &lt;br /&gt;&lt;br /&gt;Я в свое время провел десятки телефонных интервью, и могу сказать, что по телефону не так уж и сложно составить полное и четкое представление об уровне знаний и навыков человека. Надо просто знать некоторые приемы. Вот шесть советов по ведению телефонного интервью которые помогут вам составить объективное представление о опыте человека с которым вы впервые говорите по телефону. &lt;br /&gt;&lt;br /&gt;1. Имейте в запасе побольше вопросов. Составьте вопросник по тому языку, платформе, framework, знания которых требуются от кандидата. В моем вопроснике по .Net более сотни вопросов, плюс около полусотни вопросов по RDBMS. Избегайте прямых вопросов о конкретных классах, ответы на которые легко читаются из документации. Например, вместо вопроса о классе XmlDocument спрашивайте о том, как работать с Xml DOM.&lt;br /&gt;&lt;br /&gt;2. Начинайте с простых вопросов. С самых элементарных. Например таких &lt;a href="http://stump-workshop.blogspot.com/2007/05/blog-post.html"&gt;"Собеседование. Вопросы на засыпку"&lt;/a&gt;). Если человек начинает плавать на простых вопросах вы можете быстро свернуть интервью, сэкономить  свое и чужое время. От простых вопросов переходите к более сложным. Если кандидат знает, что такое XmlDocument, попросите его рассказать о том, как в XmlDocument добавить новый элемент.&lt;br /&gt;&lt;br /&gt;3. Свободные вопросы  - наиболее мощный инструмент при проведении телефонного интервью. Свободный вопрос - это когда вы просите кандидата рассказать все, что он знает по какой-то теме. Например, «Расскажите, что вы знаете о многопоточном программировании на .Net», или «Расскажите, что вы знаете об использовании триггеров в SQL». Старайтесь не перебивать человека, когда он отвечает на такой вопрос, он сам покажет ширину и глубину своих познаний. Можете попросить его уточнить какие либо детали, или направить его рассказ в нужное русло, подсказками. &lt;br /&gt;&lt;br /&gt;4. Свободные вопросы по ситуациям. Сформулируйте проблему, и попросите кандидата порассуждать в слух над ее решением. Хороший признак если, кандидат начинает задавать уточняющие вопросы. Еще более хороший признак, если он рассматривает несколько вариантов решения, и дает критерии их применимости. Это говорит об опыте человека. Если кандидат сразу выдает готовое решение и начинает его отстаивать во что-бы то ни стало, либо не может выдать ни одного решения из-за недостатка информации ( и не задает никаких вопросов) – это говорит о проблемах с опытом, скованности или отсутствии аналитических навыков. &lt;br /&gt;&lt;br /&gt;5. Вопросы по прошлым проектам. Это тоже кладезь информации. Попросите рассказать о роли в проекте, об организации работы, проектном окружении и инструментарии. Поинтересуйтесь о деталях реализации, попутно задайте несколько технических вопросов в тему. Если человек действительно делал это на прошлом проекте, он с легкостью ответит на эти вопросы. Наконец, поинтересуйтесь, почему они выбрали именно такой дизайн для своего проекта, можно ли было сделать это иначе, почему? &lt;br /&gt;&lt;br /&gt;6. Ну и наконец, то о чем не надо забывать всем интервьюерам. Будьте благожелательны, постарайтесь расположить к себе собеседника. Помните, что ваша задача не доказать, что вы знаете больше вашего собеседника, а объективно оценить уровень его знаний. Не начинайте сразу с вопросов, сначала расскажите о своей компании, своем продукте (проекте), о вакансии. Затем попросите собеседника рассказать о своем опыте. Задавайте наводящие вопросы, и постепенно переходите к собственно технической части. Не давайте собеседнику уклониться от темы, ведите и направляйте разговор. Никогда не вступайте в дискуссию, если, по вашему мнению, собеседник дает неправильные ответы. Выслушивайте с одинаковым вниманием и правильные ответы и неправильные. Оценку лучше давать в самом конце интервью.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-88506334304442140?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/88506334304442140/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=88506334304442140' title='Комментарии: 16'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/88506334304442140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/88506334304442140'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/02/blog-post_22.html' title='Как проводить телефонное интервью'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-8418932365171094791</id><published>2009-02-19T00:10:00.002+03:00</published><updated>2009-02-19T00:15:45.644+03:00</updated><title type='text'>Несовместимость</title><content type='html'>2 учетки на Gmail + IMAP + Outlook2003 = это просто разрыв мозга. Помучавшись два дня прибил эту химеру.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-8418932365171094791?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/8418932365171094791/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=8418932365171094791' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8418932365171094791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8418932365171094791'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/02/blog-post_19.html' title='Несовместимость'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-800337955613291201</id><published>2009-02-13T10:14:00.002+03:00</published><updated>2009-02-13T10:33:18.083+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Мы строили, строили...</title><content type='html'>Оказывается, у нас в стране есть "Совет по развитию информационного общества при президенте России". Вчера этот ареопаг заседал в Кремле. Президент удивлен: &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"По индексу развития электронного правительства мы были в 2005 г. на 56-м месте, а в 2007 г. достигли 92-го" &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Вот тебе и "Электронная Россия". Если бы президентом у нас был товарищ Сталин, то он бы решил что все это диверсия. Но президентом у нас товарищ Медведев, человек культурный. Он все понимает:&lt;br /&gt; &lt;br /&gt;&lt;blockquote&gt;"О чем это говорит? Это говорит о том, что у нас никакого электронного правительства нет, все это — химера."&lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;Понятно, что специально никто не вредительствовал по заданию буржуазных разведок. Просто, пока в остальном мире IT потихоньку входили в различные сферы жизни, у нас "ответственные товарищи" усиленно имитировали кипучую деятельность под шумок распила бабла. &lt;br /&gt;&lt;br /&gt;Какие выводы сделаны ареопагом? Известно какие. Назначить дополнительных чиновников, ответственных за информатизацию. Выделить дополнительно бабла для распила. &lt;br /&gt;&lt;br /&gt;Я думаю года через два, мы достигнем таки дна того рейтинга, про который говорил президент.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-800337955613291201?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/800337955613291201/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=800337955613291201' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/800337955613291201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/800337955613291201'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/02/blog-post.html' title='Мы строили, строили...'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-3609991605159623101</id><published>2009-02-09T19:41:00.004+03:00</published><updated>2009-02-09T20:42:57.753+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Microsoft Tag</title><content type='html'>Microsoft анонсировала новую технологию для мобильных устройств - &lt;a href="http://www.microsoft.com/tag/"&gt;"Tag"&lt;/a&gt; &lt;br /&gt;Все до безобразия просто. Если вы видите вот такую картинку:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pgw_S4UsSeM/SZBepH_HztI/AAAAAAAABOI/0fINNs5gNMY/s1600-h/tag.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 247px; height: 170px;" src="http://2.bp.blogspot.com/_pgw_S4UsSeM/SZBepH_HztI/AAAAAAAABOI/0fINNs5gNMY/s320/tag.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5300840822026522322" /&gt;&lt;/a&gt;&lt;br /&gt;вы наводите на нее камеру своего мобильника и тут же попадаете на URL который зашифрован в ней. Потому что картинка эта - баркод. Конечно для таких чудес надо установить Microsoft Tag Reader. Что интересно, есть версии не только для WinMobile, но и для iPhone, Symbian S60, BlackBerry, и наконец J2ME. Скоро обещают версии для PalmOS и Android.&lt;br /&gt;Формат кодирования картинки не раскрывается. Судя по всему в картинке зашифрован не сам URL, а некий хэш код, который отправляется на сайт Microsoft Tag, а уж оттуда броузер редиректится на нужный URL. Для чего такие сложности? В самой картинке зашифровано довольно мало информации, что-то в районе 8-10 байт. Т.е. URL там попросту не помещается.  &lt;br /&gt;Для того чтобы создавать свои tag-и надо иметь эккаунт. Пока все бесплатно, но Microsoft оставляет за собой право сделать технологию платной для паблишеров после окончания периода бета тестирования.&lt;br /&gt;Попробовал я как это все работает на мобильнике с WM 6.0. Бывает сканер схватывает картинку в доли секунды, а иной раз приходится дерижировать камерой над картинкой несколько секунд. &lt;br /&gt;В-общем идея очень свежая и интересная.&lt;br /&gt;Скачать TagReader на телефон можно &lt;a href="http://gettag.mobi/"&gt;здесь&lt;/a&gt; &lt;br /&gt;А на картинке, кстати, ссылка на RSDN.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-3609991605159623101?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/3609991605159623101/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=3609991605159623101' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3609991605159623101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3609991605159623101'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/02/microsoft-tag.html' title='Microsoft Tag'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_pgw_S4UsSeM/SZBepH_HztI/AAAAAAAABOI/0fINNs5gNMY/s72-c/tag.JPG' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-2060999824727858687</id><published>2009-01-23T12:05:00.002+03:00</published><updated>2009-01-23T12:31:44.922+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Шпоры от J.D. Meier по архитектуре приложений</title><content type='html'>Очень хорошие выжимки в стиле шпаргалок по архитектуре различных типов бизнес приложений готовит &lt;a href="http://blogs.msdn.com/jmeier"&gt;J.D. Meier&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/AppArch/Wiki/View.aspx?title=App%20Pattern%20-%20Two-Tier%20Rich%20Client%20Application%20Scenario&amp;referringTitle=Application%20Patterns"&gt;Клиент сервер (толстый клиент)&lt;/a&gt; (не модный нынче и не гламурный)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/AppArch/Wiki/View.aspx?title=App%20Pattern%20-%20Three-Tier%20RIA%20Application%20Scenario&amp;referringTitle=Application%20Patterns"&gt;Трехуровневый Rich Internet Application&lt;/a&gt; (модный и гламурный)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/AppArch/Wiki/View.aspx?title=App%20Pattern%20-%20Four-Tier%20Web%20Application%20Scenario%20(Table%20Module&amp;referringTitle=Application%20Patterns"&gt;Четырехуровневый Web Application с выделенным слоем сервисов и Table Module внутри&lt;/a&gt; (для корпоративных чуваков, реально озабоченных вопросами безопасности, которые все делают "по Фаулеру")&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/AppArch/Wiki/View.aspx?title=App%20Pattern%20-%20Three-Tier%20Web%20Application%20Scenario%20%28Domain%20Entity%29&amp;referringTitle=Application%20Patterns"&gt;Обычный трехуровневый Web Application с ORM внутри&lt;/a&gt; (самый популярный, пожалуй)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/AppArch/Wiki/View.aspx?title=App%20Pattern%20-%20Two-Tier%20Service%20Application%20Scenario%20%28REST%29&amp;referringTitle=Application%20Patterns"&gt;REST web сервис&lt;/a&gt; (да - да, REST на платформе Microsoft, кто бы мог подумать...)&lt;br /&gt;&lt;br /&gt;Один недостаток у этих шпоргалок. Чтобы получить от них пользу, надо знать что такое "Dependency Inversion", "Entity Translator", "Table Data Gateway", "Page Controller" и еще кучу всяких вещей. Но если ты все это знаешь, то и шпоргалки тебе видимо уже не нужны :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-2060999824727858687?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/2060999824727858687/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=2060999824727858687' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2060999824727858687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2060999824727858687'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/01/jd-meier.html' title='Шпоры от J.D. Meier по архитектуре приложений'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-3396824379123912571</id><published>2009-01-05T14:19:00.003+03:00</published><updated>2009-01-05T22:36:10.610+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><category scheme='http://www.blogger.com/atom/ns#' term='DOTNET'/><title type='text'>Listma  - .Net Workflow framework</title><content type='html'>Что вы делаете, когда вся логика разрабатываемого класса крутится вокруг его состояния? К примеру, разрабатываем мы  web магазин. Есть у нас сущность Order (заказ), ее создает «покупатель», затем он ставится в очередь на обработку, затем «оператор» формирует заказ и передает его «курьеру» для доставки,  «курьер» доставляет заказ и делает отметку о доставке. Покупатель может редактировать все поля заказа, пока не передаст его на исполнение. После этого покупатель не может редактировать заказ, но может отозвать его, но только если заказ еще не передан для доставки. Оператор не может редактировать заказ, но может оповестить покупателя о задержке в связи с отсутствием товара на складе. Курьер может только проставлять отметку о доставке и только на тех заказах, что переданы для доставки ему. Ну и т.д. (много деталей опущено).   &lt;br /&gt;&lt;br /&gt;Довольно типичная картина, не правда ли? Действия доступные пользователям зависят от их роли и текущего состояния сущности, причем все эти особенности и детали способны утомить еще при чтении требований, не говоря уж о реализации. И в тоже время они являются весьма важными с точки зрения заказчика. А при реализации они размазываются тонким ровным слоем по всей бизнес логике и по UI в придачу. Ситуацию усугубляет то что, все эти требования очень волатильны, то есть склонны к частым и непредсказуемым изменениям. И вот он – живой кошмар любого разработчика перед нами во всей красе. &lt;br /&gt;Однако с подобными задачами довольно просто можно справиться на основе workflow подходов, и в частности, с помошью конечного автомата или Finite State Machine.   &lt;br /&gt;Основная идея состоит в том, чтобы описать диаграмму состояний сущности (в нашем случае заказа), и допустимых переходов, при этом связав их с ролями пользователей. &lt;br /&gt;Обычно, говоря о методе конечных автоматов, подразумевают создание класса, реализующего конкретную диаграмму. Но в нашем случае интереснее использовать иной подход, который менее распространен. Нам интереснее создать класс, способный исполнять любую диаграмму состояний, по воздействию внешних событий. При этом список переходов, доступных в данном состоянии для данного пользователя, на уровне UI представляется в виде набора доступных действий. А выбор любого из этих действий, вызывает выполнение соответствующего перехода в диаграмме состояний, и выполнение связанной с ним бизнес логики. &lt;br /&gt;&lt;br /&gt;Эту общую идею я реализовывал с различными вариациями во множестве проектов, пока не пришел к осознанию того, что можно построить обобщенный framework для этих целей. &lt;br /&gt;&lt;br /&gt;Что должен уметь делать этот framework?  Он должен:&lt;br /&gt;- описывать диаграммы состояний объектов, включающие перечень возможных состояний объекта, и возможные переходы между состояниями&lt;br /&gt; - определять бизнес логику, выполняющуюся при изменении состояния объектов&lt;br /&gt; - определять доступность переходов на основе ролей пользователей&lt;br /&gt; - определять шаблоны оповещения при изменении состояния объекта и правила адресации на основе ролей пользователей&lt;br /&gt; - переводить объекты из одного состояния в другое на основе описанных правил&lt;br /&gt; - определять права доступа к атрибутам объекта в зависимости от состояния и роли пользователя&lt;br /&gt;&lt;br /&gt;И в тоже время он не должен:&lt;br /&gt; - зависеть от способов хранения бизнес-сущностей&lt;br /&gt; - предъявлять какие либо требования к реализации классов бизнес-сущностей     &lt;br /&gt; - зависеть от UI библиотек (ASP.NET, WinForms)&lt;br /&gt; - зависеть от провайдеров role-based security&lt;br /&gt; - требовать наличия собственной БД для хранения своих настроек и состояния &lt;br /&gt;&lt;br /&gt;Ничего готового на платформе .Net не обнаружилось. Windows Workflow не подошел на эту роль по причине своей монструозности (посмотрите список чего «не должен» делать движок и вам все станет понятно). Поэтому появилась мысль сделать свой движок, обобщив в нем свой многолетний опыт в данной области. &lt;br /&gt;И вот в первом приближении такой движок готов. Называется он Listma, что значит Linking State Machine, или Подключаемая машина состояний, что вполне отражает его суть. &lt;br /&gt;Listma - это проект с открытым исходным кодом. Хостится он будет на  Google Code.&lt;br /&gt;&lt;br /&gt;Сайт проекта &lt;a href="http://code.google.com/p/listma/"&gt;http://code.google.com/p/listma/&lt;/a&gt;&lt;br /&gt;Последнюю версию можно взять здесь &lt;a href="http://code.google.com/p/listma/downloads/list"&gt;http://code.google.com/p/listma/downloads/list&lt;/a&gt; &lt;br /&gt;Бактрэкер проекта здесь &lt;a href="http://code.google.com/p/listma/issues/list"&gt;http://code.google.com/p/listma/issues/list&lt;/a&gt; &lt;br /&gt;Исходники с примерами здесь (SVN) &lt;a href="http://code.google.com/p/listma/source/browse"&gt;http://code.google.com/p/listma/source/browse&lt;/a&gt;&lt;br /&gt;Блог проекта здесь &lt;a href="http://listma-rus.blogspot.com/"&gt;http://listma-rus.blogspot.com/&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;В дальнейшем об устройстве Listma, о способах его использования, планах развития и прочих вопросах я буду писать именно в блоге проекта.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-3396824379123912571?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/3396824379123912571/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=3396824379123912571' title='Комментарии: 15'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3396824379123912571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3396824379123912571'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2009/01/listma-net-workflow-framework.html' title='Listma  - .Net Workflow framework'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-5419195763170638813</id><published>2008-12-07T19:18:00.005+03:00</published><updated>2008-12-09T09:23:07.590+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Опять про тестирование приватных функций.</title><content type='html'>На RSDN-е опять обсуждают &lt;a href="http://www.rsdn.ru/forum/message/3203144.aspx"&gt;"Как тестировать приватные функции класса?"&lt;/a&gt;, предлагают разные решения и спорят какое из них лучше. &lt;br /&gt;Подобные споры меня всегда очень удручают. Почему? Потому что проблемы на самом деле нет. А попытки решать проблему которой нет порождают чудовищно уродливые решения.&lt;br /&gt; &lt;br /&gt;На вопрос "Как тестировать приватные функции класса?" есть только один ответ: - "&lt;strong&gt;Только через публичный контракт этого класса&lt;/strong&gt;." Если в голову лезут еще какие либо "решения", значит смысл модульного тестирования, а тем более TDD, до вас еще не дошел.&lt;br /&gt;&lt;br /&gt;Что есть модульный тест? Это пример того, как внешний код будет использовать ваш класс. Зачем может понадобиться модульный тест для приватных методов класса, неужели вы рассчитываете на то, что внешний код будет вызывать приватные методы вашего класса? Так почему не сделать эти методы публичными? &lt;br /&gt;Вопрос о тестировании приватных членов  - это вопрос новичков. Вот у меня есть куча приватных методов и мне надо покрыть их тестами, как же мне это сделать? Это делается всегда одним и только одним способом - тестированием публичного контракта класса. Если у вас есть приватный метод, который вы не можете протестировать через публичный контракт, значит у вас что то не так с дизайном класса. &lt;br /&gt;&lt;br /&gt;Если вы пользуетесь методикой TDD то вопрос о тестировании приватных членов у вас никогда не возникнет. Сначала вы пишете тест, в котором отрабатываете какой либо из сценариев использования вашего класса (которого еще нет). В результате, после написания теста, вы имеете публичный контракт (или часть контракта) своего будущего класса, который складывается из методов, использованных в тесте. Далее, вы начинаете писать реализацию класса, и совершенно ясно, что все мясо в виде приватных членов, которое вы теперь накодите, уже тестируется через вызовы публичных членов. &lt;br /&gt;    &lt;br /&gt;Я вот недавно писал библиотеку, в которой доля публичных методов менее 20%, остальные private и protected. Модульные тесты покрывают 95% кода библиотеки, причем тестируются только публичные члены. Я легко достиг бы и 100% покрытия, дописав guard-тесты, поскольку непокрытый код, это по большей части, валидация входных параметров и строки, выкидывающие исключения, но мне просто лень. В этой библиотеке есть полностью приватные классы, которых не видно снаружи, и они покрыты тестами на 100%.&lt;br /&gt;&lt;br /&gt;Скажу более, в паре приватных методов я нашел большие куски по 6 -10 строк кода, не покрытые тестами. При внимательном рассмотрении, оказалось что этот код просто лишний :). Он никогда не вызывался ни при каких тестовых сценариях, и я его просто выкинул. Это, кстати, хорошая иллюстрация того, что понимается под последней буквой D (design) в TDD.          &lt;br /&gt;&lt;br /&gt;Так что никогда не ломайте голову над тем "как тестировать приватные функции класса". Тестируйте сам класс, а не его методы. Сосредоточьтесь на вариантах использования класса, на том, как его будет использовать внешний код. И если после этого у вас остались приватные члены, непокрытые тестами, во-первых, проверьте свои модульные тесты, возможно они не охватывают какой-то из вариантов использования вашего класса. Во-вторых, если с тестами все в порядке, проверьте дизайн тестируемого класса, непокрытый тестами код говорит о том, что он никогда не используется, и его можно выкинуть.&lt;br /&gt;&lt;br /&gt;Небольшое дополнение, по прошествии одного дня. &lt;br /&gt;Очень редко бывают случаи когда, действительно надо тестировать приватные члены. Предположим, у нас есть класс хранящий множество объектов и выполняющий с ними какие-то действия. Внутри этого класса, объекты хранятся в массиве, или в линейном списке. И вот по каким либо причинам, например для достижения большей скорости работы, нам необходимо реорганизовать внутренний механизм хранения объектов, вместо списка нам нужно сбалансированное двоичное дерево. Заметьте, что при этом публичный контракт класса не меняется. Но нам надо проверить, что внутренний механизм хранения в классе работает соответствующим образом. Тут без тестирования приватных членов, вероятно, не обойтись. Повторю, что такие случаи возникают крайне редко.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-5419195763170638813?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/5419195763170638813/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=5419195763170638813' title='Комментарии: 19'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5419195763170638813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5419195763170638813'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/12/blog-post.html' title='Опять про тестирование приватных функций.'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-2779044485130895993</id><published>2008-11-26T09:22:00.003+03:00</published><updated>2008-11-26T09:50:25.242+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><title type='text'>Как разделить EDM на несколько частей?</title><content type='html'>Похоже, народ начинает пробовать заюзать Entity Framework в реальных проектах. И начинает задавать неудобные вопросы.&lt;br /&gt;Один из самых "горячих" вопросов: как разделить большую модель данных (EDM) на несколько частей. Я уже затрачивал этот вопрос в обсуждениях вот &lt;a href="http://stump-workshop.blogspot.com/2008/07/ef-aspnet.html"&gt;этого поста&lt;/a&gt;.&lt;br /&gt;Суть моих рассуждений была такова: делите модель только если ее действительно можно разделить на несколько &lt;strong&gt;независимых&lt;/strong&gt; частей. Иначе делайте большую общую модель и шарьте ее между всеми модулями системы.&lt;br /&gt;Однако, большая модель это не только &lt;strike&gt;ценный мех&lt;/strike&gt; не очень удобно, но это еще и проблемы с производительностью. И вот от разработчиков EF пришла благая весть: EDM все же можно делить на части так, что одна часть будет ссылаться и использовать классы другой части. Для этого есть чудесный аттрибут "using":&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Schema Namespace="NorthwindModel" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm"&amp;gt;&lt;br /&gt;&amp;lt;&lt;span style="color:#ff0000;"&gt;Using&lt;/span&gt; Namespace="NorthwindModelBase"  Alias="BaseModel" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Подробно о том, как разделить модель на несколько частей, с пошаговыми инструкциями написано в блоге разработчиков ADO.NET &lt;a href="http://blogs.msdn.com/adonet/archive/2008/11/25/working-with-large-models-in-entity-framework-part-2.aspx"&gt;"Working With Large Models In Entity Framework – Part 2"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Есть однако одна неприятная деталь. Точнее две.&lt;br /&gt;Первая, подключаемые модели &lt;strike&gt;традиционно&lt;/strike&gt; не поддерживает дизайнер EDM. Но это можно пережить.&lt;br /&gt;Вторая, модели могут ссылаться друг на друга только в одном направлении, а это автоматически означает, что navigation property, а иными словами, ссылочные свойства на объекты в другой модели запрещены. И это уже плохо. Вернемся к началу моего поста, где я говорил о том, что делить модель на части можно только если эти части не зависимы. Выходит, к сожалению, я был все же прав.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-2779044485130895993?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/2779044485130895993/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=2779044485130895993' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2779044485130895993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2779044485130895993'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/11/edm.html' title='Как разделить EDM на несколько частей?'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-6003403323860332076</id><published>2008-10-30T22:53:00.001+03:00</published><updated>2008-10-30T23:00:07.319+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>Не стреляйте в тапера...</title><content type='html'>Знаете, какая самая большая проблема тимлидов и менеджеров, вышедших из программеров? Перестать управлять написанием кода, и начать управлять достижением целей.&lt;br /&gt;Казалось бы, чего проще? Однако, как тяжело дается людям эта простая истина. Всем, кто хочет стать хорошим тимлидом читать нетленку: Толик Тенцер &lt;a href="http://itblogs.ru/blogs/cio_anatomy/archive/2006/12/29/11180.aspx"&gt;«Урри, где у него кнопка?»&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-6003403323860332076?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/6003403323860332076/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=6003403323860332076' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6003403323860332076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6003403323860332076'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/10/blog-post_30.html' title='Не стреляйте в тапера...'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-5334213018460263737</id><published>2008-10-30T21:54:00.005+03:00</published><updated>2008-10-30T22:33:16.787+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Visual Studio для русских гоблинов</title><content type='html'>Все уже наверное слышали о выпуске полностью локализованной русской версии Visual Studio. Рекламируется это событие широко с размахом и креативом. Иногда, правда, креатив плещет через край. Как вам вот &lt;a href="http://msdn.microsoft.com/ru-ru/vstudio/bb332392.aspx"&gt;это&lt;/a&gt;? &lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_pgw_S4UsSeM/SQoL3bAV0tI/AAAAAAAAA8A/IizYZ4lxbIE/s1600-h/vs_rus.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 231px;" src="http://3.bp.blogspot.com/_pgw_S4UsSeM/SQoL3bAV0tI/AAAAAAAAA8A/IizYZ4lxbIE/s320/vs_rus.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5263032161305744082" /&gt;&lt;/a&gt;Забавная троица. Надо полагать, именно у этих ребят были постоянные проблемы с английской версией Visual Studio. А вот с русской, они наконец-то развернутся.&lt;br /&gt;Налицо эволюция образа русского программиста в глазах западного заказчика.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-5334213018460263737?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/5334213018460263737/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=5334213018460263737' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5334213018460263737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5334213018460263737'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/10/visual-studio.html' title='Visual Studio для русских гоблинов'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pgw_S4UsSeM/SQoL3bAV0tI/AAAAAAAAA8A/IizYZ4lxbIE/s72-c/vs_rus.JPG' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-1385351659844285382</id><published>2008-10-28T20:13:00.002+03:00</published><updated>2008-10-28T20:38:40.180+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Application Architecture Guide - v2.0</title><content type='html'>&lt;a href="http://blogs.msdn.com/blogfiles/jmeier/WindowsLiveWriter/NewReleasepatternspracticesAppArc.0Beta1_D893/AppArchGuidev2_thumb.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 132px; height: 172px;" src="http://blogs.msdn.com/blogfiles/jmeier/WindowsLiveWriter/NewReleasepatternspracticesAppArc.0Beta1_D893/AppArchGuidev2_thumb.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;А вот это уже интереснее. Сегодня J.D. Meier &lt;a href="http://blogs.msdn.com/jmeier/archive/2008/10/27/new-release-patterns-practices-app-arch-guide-2-0-beta-1.aspx"&gt;анонсировал&lt;/a&gt; выпуск  &lt;a href="http://www.codeplex.com/AppArchGuide/Release/ProjectReleases.aspx?ReleaseId=18834"&gt;"Application Architecture Guide - v2.0"&lt;/a&gt; (beta 1).&lt;br /&gt;Это, конечно, не исчерпывающее руководство к действию, но на роль весьма полного справочника этот гайд вплне подойдет. &lt;br /&gt;Если вас интересуют вопросы:&lt;br /&gt; - когда клиент-серверная архитектура предпочтительнее 3-х уровневой?&lt;br /&gt; - какими принципами следует руководствоваться при разработке role based authorization?&lt;br /&gt; - как варианты развертывания влияют на архитектуру приложения?&lt;br /&gt; - что надо учитывать при разработке слоя сервисов?&lt;br /&gt; - чем отличается Direct Authentication от Brokered Authentication?&lt;br /&gt; - что такое архитектурный стиль?&lt;br /&gt; - и многое другое....&lt;br /&gt;тогда однозначно это будет ваш настольный гайд. &lt;br /&gt;Также рекомендуется в качестве эффективного средства от велосипедостроения.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-1385351659844285382?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/1385351659844285382/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=1385351659844285382' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1385351659844285382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1385351659844285382'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/10/application-architecture-guide-v20.html' title='Application Architecture Guide - v2.0'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-6422636961513224285</id><published>2008-10-28T20:00:00.002+03:00</published><updated>2008-10-28T20:07:38.424+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Кто хочет попробовать .Net 4.0 и VS2010?</title><content type='html'>Кому интересно, уже доступен для скачивания первый CTP, пока только в виде Virtual PC 2007 image (7.5 Gb). Вот &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&amp;displaylang=en"&gt;ссылочка&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-6422636961513224285?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/6422636961513224285/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=6422636961513224285' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6422636961513224285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6422636961513224285'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/10/net-40-vs2010.html' title='Кто хочет попробовать .Net 4.0 и VS2010?'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-5909881968848125088</id><published>2008-10-24T10:56:00.004+04:00</published><updated>2008-10-24T11:12:24.156+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Статьи'/><title type='text'>IT в России убьет не кризис а правительство</title><content type='html'>Не хотел писать про кризис, но видно придется.&lt;br /&gt;Интересная статья &lt;a href="http://www.computerra.ru/vision/376345/"&gt;Нужно немножко доплатить...&lt;/a&gt;&lt;br /&gt;В дополнение к кризису правительство решило поднять Единый социальный налог. Софтостроители поняли, что им грозит пи#%@&amp;ц.&lt;br /&gt;Вот несколько цитат из статьи:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;em&gt;Дмитрий Лощинин, Люксофт&lt;/em&gt;:&lt;br /&gt;"Нам нравится работать в России, но если здесь будут созданы неприемлемые условия для бизнеса, то &lt;strong&gt;нам придется отсюда уйти, переведя бизнес в другие страны&lt;/strong&gt;"&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Сергей Андреев, ABBYY Software&lt;/em&gt;: &lt;br /&gt;"Фактически, любой зарплатный налог превращается в налог с оборота. Поэтому ИТ-компаниям необходимо добиваться специального налогового режима для своей отрасли"&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Николай Пунтиков, Exigen Software&lt;/em&gt;:&lt;br /&gt;"Люди, которые определяют государственную политику в области информационных технологий, страшно далеки от народа, во время президентства Владимира Путина был принят ряд полезных инициатив в области развития ИТ и инновационного сектора экономики, но с приходом Дмитрия Медведева ситуация изменилась. Исчезло упоминание ИТ в названии Минсвязи, затем мы получили мощный удар со стороны финансового кризиса, а теперь правительство усугубляет последствия, собираясь увеличить налоговые отчисления. Мы, конечно, не пропадем, но ситуация может привести к тому, что &lt;strong&gt;бизнес в России придется прекратить&lt;/strong&gt;"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Т.е. производители коробочного ПО хотят идти бить челом государю-батюшке, чтоб пощадил, а аутсорсеры говорят, что просто уйдут из России. &lt;br /&gt;В общем картина не веселая. С нового года нас ждет сокращение числа заказов на разработку из-за кризиса (волна как раз подойдет), плюс повыщение налогов на фонд оплаты труда.&lt;br /&gt; &lt;br /&gt;Результат не трудно предсказать: массовые увольнения всех, кого можно уволить (джуниоры разработчики, конфликтные разработчики  - "примадонны",  "лишние" тестировщики, а то и целые команды). Но и оставшимся не позавидуешь. Оставлять будут самых лучших и самых смирных. Потому что на оставшихся повесят работу уволенных. У тех, кто останется зарплату вероятно не порежут, но если у кого была белая зарплата -станет опять серая. А вот на немогочисленные новые позиции будут набирать уже на значительно более низкие ставки, потому как ситуация на рынке труда резко изменится, вакансий станет меньше а безработных программистов больше. Соцпакеты будут резать нещадно и в самую первую очередь. Про дополнительную мед. страховку, оплаченный фитнес и мобильный телефон можно сразу забыть. Если у вас в офисе есть кухня, следите, когда на ней исчезнет бесплатные кофе и печение, значит вот оно  - началось :)&lt;br /&gt;Ну как? Страшно?&lt;br /&gt;Впрочем все может быть и по другому. Сокращение заказов на разработку продлится, я думаю, не больше года. Если правительство поддержит разработчиков, даст налоговую передышку, то большинство сможет спокойно пересидеть недолгий спад.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-5909881968848125088?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/5909881968848125088/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=5909881968848125088' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5909881968848125088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5909881968848125088'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/10/it.html' title='IT в России убьет не кризис а правительство'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4143655006957683083</id><published>2008-10-20T19:47:00.002+04:00</published><updated>2008-10-20T19:53:00.367+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='DOTNET'/><title type='text'>Вышел ASP.NET MVC framework beta</title><content type='html'>&lt;a href="http://weblogs.asp.net/scottgu/default.aspx"&gt;Scott Gu в своем блоге&lt;/a&gt; &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/10/16/asp-net-mvc-beta-released.aspx"&gt;сообщает о выходе  бета версии ASP.NET MVC framework&lt;/a&gt;. Там же есть ссылка для скачивания. Кроме того, Скот как всегда тщательно и подробно описывает все изменения которые появились в новой версии по сравнению с предыдущей. &lt;br /&gt;&lt;br /&gt;Не новость конечно, но так, на память ссылка пусть будет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4143655006957683083?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4143655006957683083/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4143655006957683083' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4143655006957683083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4143655006957683083'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/10/aspnet-mvc-framework-beta.html' title='Вышел ASP.NET MVC framework beta'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-6605263390492516718</id><published>2008-10-19T19:30:00.004+04:00</published><updated>2008-10-19T23:44:42.768+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='Статьи'/><title type='text'>Идеальный программист</title><content type='html'>&lt;div align="right"&gt;«Каждый охотник желает знать, где сидят фазаны»&lt;br /&gt;Считалочка (физика, оптика).&lt;br /&gt;&lt;br /&gt;"Программист который познакомился с новой технологией похож на маниака получившего в подарок новенькую бензопилу. Ему не терпится ее опробовать"&lt;br /&gt;(с) утерян.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Каждый менеджер хочет иметь в своей команде хороших программистов. Каждый программист хочет, чтобы его ценили, регулярно прибавляли ему зарплату и не заставляли работать в выходные.&lt;br /&gt;Среди самих программистов есть мнение, что хороший программист – это продвинутый программист, тот который изучает последние технологии, методы и веяния. Сегодня актуально TDD, FDD, AOP, IoC/DI, и принципы ALT.NET. Что бы быть в струе, надо все это знать, все это юзать, и даже, если не лень, писать об этом в своем блоге. Это круто и необходимо для хорошей карьеры и зарплаты. Я должен вас разочаровать - но все это &lt;em&gt;гламур&lt;/em&gt;, в самом уничижительном значении этого слова. Все это необходимый фундамент для хорошего программиста, но не более того.&lt;br /&gt;&lt;br /&gt;Больше всего на рынке нынче ценится не "&lt;em&gt;умный программист&lt;/em&gt;", и не "&lt;em&gt;продвинутый программист&lt;/em&gt;", и даже не "&lt;em&gt;опытный программист&lt;/em&gt;". Больше всего ценится "&lt;em&gt;эффективный программист&lt;/em&gt;". Тем более это актуально для тим-лида. Любой менеджер проекта, отдаст пол своей проектной команды за одного такого. А уж найти «эффективного архитектора» который был бы и технически грамотным и не зацикленном на каком нибуть IoC-е, и вовсе проблема.&lt;br /&gt;&lt;br /&gt;А кто такой «эффективный программист»? Почему недостаточно быть «умным» и «продвинутым»? Многие получают кайф от программирования как такового, с энтузиазмом изучают все новое, и вообще, считают это способом самовыражения. Спору нет, программирование процесс творческий, но не стоит забывать, что цель его достаточно прозаическая, а именно производство программного продукта и получение прибыли. И вот такие программисты "самовыраженцы", это просто головная боль для тех людей, которые занимаются организацией разработки. Умные, слов нет, все делают правильно и по понятиям, но проект завалят практически гарантировано. Просто будут сидеть и спорить, какой фрэймворк лучше прикрутить, и не заметят как дэдлайн прошел.&lt;br /&gt;&lt;br /&gt;Вот недавно была история на одном проекте. Выпустили ребята первую версию продукта, были там недостатки определенные, но решили продукт развивать, набрали новых людей. Пришли ребята продвинутые, посмотрели на код первой версии (а надо сказать, что код там был дрянной) и решили, что нужен рефакторинг, компоненты выделить, архитектуру улучшить и все такое… Ну и занялись, заодно фрэймворк модный прикрутили, модульные тесты писать начали, для тестов весь дизайн пришлось переделывать. Оглянуться не успели - через два дня дэдлайн, надо показывать большому босу работающий прототип. Ну что делать, все в разобранном виде, к дэдлайну не успели. Устроили им разнос, прописали жесткие сроки, мэйлстуны. К новому сроку ребята поняли, что не успевают опять, сделали прототип на соплях с подпорками. Ну и дальше вся работа шла в жесточайшем таймауте и под прессингом руководства. Проект они закончили с задержкой на три месяца, качество было не очень, все были разочарованы, и измучены. Большая часть команды потом уволилась.&lt;br /&gt;&lt;br /&gt;Вот такая печальная присказка. И ведь цели благие были: улучшить дизайн и код, чтобы сделать хороший продукт. Все верно. Только формулу надо было развернуть наоборот: сделать продукт с заданным качеством и функционалом и в срок, а для этого улучшить дизайн и код (среди прочего). Если бы разработчики думали именно так, то и проблем с проектом у них бы не было, ведь квалификации у них было достаточно.&lt;br /&gt;Однако, вернемся к нашему «эффективному программисту». Нам понятно, знания и стремление к техническому совершенству это важно, но недостаточно для успеха. Не менее важна &lt;strong&gt;ориентация на результат, инициатива и надежность&lt;/strong&gt; человека. Эти три качества превращают «умного» и «продвинутого» программиста в «программиста эффективного».&lt;br /&gt;&lt;br /&gt;Эффективный программист понимает, что код, дизайн и архитектура это не цель его работы, а лишь средство достижения цели.&lt;br /&gt;Эффективный программист движется к цели, минимизируя затраты усилий и риски неудач.&lt;br /&gt;Эффективный программист умеет правильно оценить сложность задачи и выполнить ее в срок.&lt;br /&gt;Эффективный программист, это ремесленник в лучшем смысле этого слова, который в совершенстве овладел своими инструментами и методами их использования. Продукты его ремесла, это настоящая «ручная работа», качественные, красивые, удобные.&lt;br /&gt;Эффективный программист любим менеджерами и при желании быстро продвигается по карьерной лестнице.&lt;br /&gt;&lt;br /&gt;В общем, ребята, налегайте на soft skills, если хотите карьерного роста.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-6605263390492516718?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/6605263390492516718/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=6605263390492516718' title='Комментарии: 22'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6605263390492516718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6605263390492516718'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/10/blog-post_19.html' title='Идеальный программист'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-2005710594642986270</id><published>2008-10-11T16:52:00.004+04:00</published><updated>2008-10-13T16:39:42.665+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Статьи'/><title type='text'>Как составить резюме</title><content type='html'>Ну что, коллеги? Не пора ли обновить свои резюме? Кризис на дворе. Вполне возможно, что недостаток программистов скоро сменится недостатком рабочих мест для них. Шутка ;)&lt;br /&gt;&lt;br /&gt;Мне довелось писать много резюме, а читать еще большее их количество. В ходе этого чтения, я достаточно скоро убедился, что грамотно составленных резюме просто единицы. Поэтому я давно собирался написать, что-то такое дидактическое на эту тему, пользуясь своим опытом нахождения, так сказать «по обе стороны баррикад». Ну, вот и собрался. &lt;br /&gt;&lt;br /&gt;Конечно, сразу про самые характерные ошибки при составлении резюме:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. Cлишком много скилов&lt;/strong&gt;. Часто программисты стараются запихать в свое резюме упоминания всех языков/библиотек/продуктов о которых они хот что ни будь слышали или знают. Есть две веские причины так не делать. Первая, - работодатель практически всегда ищет специалиста для решения &lt;em&gt;конкретных&lt;/em&gt; задач, а не мастера на все руки. Не относящиеся к делу скилы могут заставить его думать, что вы специализировались не в той области, что нужна ему. Вторая причина, - множество технологий в резюме заставляют думать работодателя о том, что у вас нет глубоких знаний ни в одной из них. Помните что &lt;em&gt;работодателю нужен специалист, а не дилетант&lt;/em&gt;.       &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. В резюме нет ключевых слов&lt;/strong&gt;. Надо понимать, что через руки человека, занимающегося подбором персонала проходят сотни резюме, и ищет он человека удовлетворяющего определенным, &lt;em&gt;совершенно конкретным&lt;/em&gt; требованиям, на конкретную позицию. И ищет он по &lt;em&gt;ключевым словам&lt;/em&gt;, например, «C/C++, ASM, WDK, Windbg», или «.Net, C#, WinForms, NHibernate». Если этих слов нет на первой странице вашего резюме, то оно моментально летит в trash. Особенно это актуально, когда отбором занимаются HR специалисты, они ориентируются только на ключевые слова в описании вакансии.     &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3. Заявленные навыки не подтверждаются в описании опыта работы&lt;/strong&gt;. Если ваше резюме сразу не отправили в trash из-за отсутствия ключевых слов, с ним начинаются знакомиться подробно. Здесь важно, что бы все указанные вами навыки, нашли подтверждение в описании профессионального опыта (списке работ или проектов). Если вы упомянули о ASP.NET, работодатель обязательно поищет, в каком проекте и как вы использовали эту технологию. Если он не найдет этой информации в вашем резюме, он заподозрит вас во лжи, что очень неприятно. Я завернул огромное число резюме с формулировкой «указанные навыки не подтверждаются опытом работы». Что же делать, если вы технологию или язык знаете, но практического опыта его использования не имеете?  Не стоит придумывать для  этого несуществующий «опыт», поверьте мне. Это, конечно,  поможет вашему резюме пробиться на следующую стадию отбора, но сразу всплывет на собеседовании. Различие в теоретическом знании, и знании подкрепленным опытом выявляются очень легко. Поэтому вы можете указать, что ваши знания носят теоретический характер, либо указать в разделе опыта учебный проект, на котором вы изучали данную технологию (если он, конечно, был на самом деле). Это особенно актуально для студентов, не стоит стесняться, в отсутствии опыта учебный проект тоже опыт.        &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4. Слишком много технических деталей&lt;/strong&gt;. Часто программисты забывают, что их профессиональный опыт, это не только перечень освоенных  языков программирования, библиотек и платформ, но те прикладные области, для которых разработан софт, и те роли, которые вы выполняли в процессе разработки. Если ваше резюме представляет собой только перечень языков, библиотек платформ и инструментов, сгруппированных по проектам в хронологическом порядке, &lt;em&gt;у вас очень мало шансов найти позицию выше рядового программиста&lt;/em&gt;. При поиске кандидатов на позиции ведущих программистов, тимлидов, архитекторов работодателя больше, чем знание конкретной технологии,  интересуют &lt;em&gt;опыт проектной работы, выполняемые роли, знание предметных областей&lt;/em&gt;. Чем выше должность, тем большее значение имеют эти аспекты. И чем более грамотно они будут отражены в резюме, тем больше у вас шансов.         &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;5. Напишите, чего вы хотите&lt;/strong&gt;. Часто забывают, что помимо перечня ваших знаний и умений, в резюме неплохо бы указать, на какую позицию вы собственно претендуете. Без этого все резюме можно выразить одной сакраментальной фразой «Кодирую на Java (C#, C++…) за еду (деньги, большие деньги…)». Кроме того, это поможет избежать недоразумений при дальнейшем общении, и вам не будут предлагать позицию саппортера или консультанта, когда вы ищите работу тимлида. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;6. Не пишите много&lt;/strong&gt;. Никто не будет читать до конца  резюме на 5 страницах. Не забывайте, что резюме программиста, это довольно формальный документ. Не стоит засорять его художественным текстом наподобие: «Обладая осознанием высокой ответственности, которая присуща роли разработчика, я целенаправленно развивал навыки…». Возможно, такой стиль уместен в резюме рекламного агента, или PR менеджера, но у IT-шников так писать не принято.   &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;7. Не пишите мало&lt;/strong&gt;. В резюме должно быть достаточно информации для принятия решения. Как минимум там должны быть ваши контактные данные (некоторые забывают даже об этом), описание желаемой позиции, перечень навыков, описание опыта работы и образования. Описание опыта начинайте с последнего места работы (проекта), более ранний опыт описывайте более кратко.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;8. Никогда не описывайте в своем резюме опыт не связанный с IT&lt;/strong&gt;. Нет ничего нелепей «программиста C++ с богатым опытом растаможки коммерческих грузов». Я даже не знаю почему, но это очень негативно оценивается теми, кто читает ваше резюме. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;9. Заинтересуйте работодателя, продайте себя подороже&lt;/strong&gt;. Помните, что у работодателя есть задачи, которые нужно решить, и он ищет в вашем лице профессионала, потому что не может решить эти задачи без вас. Поэтому обязательно укажите в резюме, какое значение для бизнеса имели прежние ваши работы и проекты. Насколько они были успешны. Какую роль лично вы сыграли в этих проектах. Однако не переусердствуйте, описывая проект, который просто перевернул и спас весь бизнес на вашей последней работе, и который вы выполнили в одиночку за неделю. Все хотят работать с адекватными людьми.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;10. Будьте честными&lt;/strong&gt; - это как обобщение, потому что уже проскакивало во всех пунктах. Не пишите технологий, которые не знаете или знаете плохо, не придумывайте проектов которых не существовало, не прибавляйте лет опыта которых не было. Ни к чему хорошему это вас не приведет.      &lt;br /&gt;&lt;br /&gt;Теперь о форме резюме. &lt;br /&gt;Во-первых, резюме должно содержать максимум необходимой информации для принятия решения работодателем. Во-вторых, оно должно быть достаточно кратким. В-третьих, оно должно быть нацелено на удовлетворения требований конкретной вакансии, на которую вы претендуете. Под такие противоречивые требования наиболее удачной, на мой взгляд, является следующая классическая структура резюме:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- Контактные данные&lt;/strong&gt;. Тут как обычно: фамилия, возраст, место жительства, контакты. Запомните, что никто не может требовать от вас писать в резюме свой домашний адрес и паспортные данные.  &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- Желаемая позиция&lt;/strong&gt;. Пишите кратко «Разработчик Java начального уровня», или «Архитектор приложений, системный архитектор, руководитель группы». &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- Перечень навыков, инструментов и платформ&lt;/strong&gt;. Здесь должны быть те самые ключевые слова, что упоминаются в описании вакансии. Хорошо, если в перечне языков и инструментов указана продолжительность работы с каждым. Это важно для программистов. Для более продвинутых позиций важнее не перечень языков, а перечень навыков и предметных областей. Все перечисленные здесь пункты должны упоминаться в следующем разделе «Опыт работы».   &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- Опыт работы&lt;/strong&gt;. Здесь перечисляем места работы и проекты в обратном хронологическом порядке (сначала последние). Для каждого проекта сформулируйте его описание в одном предложении (максимум в двух). Укажите, какие конкретно части вы разработали, какие роли выполняли (например, если вы наладили систему ежедневных сборок проекта, обязательно напишите об этом). Укажите продолжительность проекта и размер команды. Укажите используемые платформы, инструменты, и технологии. Если проект был чем-то важен, или имеет какие либо отличия, обязательно укажите об этом (например, «в ходе создания системы, мною был реализован первый соответствующий стандарту сервер OpenID на .Net»).  Последние проекты описывайте подробно, более старые - кратко. Те, которые не коррелируют с описанием вакансии, можете вообще выкинуть (если проектов много). Данный раздел не должен быть более двух страниц.         &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- Образование, повышение квалификации, владение иностранными языками&lt;/strong&gt;. Тут все понятно: ВУЗ, специальность, год окончания. Сюда же пишите курсы и сертификаты и год их получения.  &lt;br /&gt;&lt;br /&gt;Наилучший формат для резюме  - plain text. В случае необходимости вы сможете быстро перевести в тот формат, который требует конкретный работодатель. &lt;br /&gt;Полезно также иметь большое, или полное резюме, в котором перечислены все скилы и все проекты. При необходимости из него быстро создается резюме, заточенное под конкретную вакансию, путем выбрасывания всего лишнего и аккуратной расстановки акцентов на требуемых навыках и технологиях. &lt;br /&gt;&lt;br /&gt;Вот, пожалуй, и все. Но страждущие меня не поймут, если я вот так вот закончу, и не приведу образец резюме.&lt;br /&gt;Поэтому, вот вам образец &lt;a href="http://docs.google.com/Doc?id=dhksthk6_6fg3gq4"&gt;http://docs.google.com/Doc?id=dhksthk6_6fg3gq4&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.S. Я пока работу не ищу.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-2005710594642986270?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/2005710594642986270/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=2005710594642986270' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2005710594642986270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2005710594642986270'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/10/blog-post.html' title='Как составить резюме'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-6456503643582854785</id><published>2008-09-30T14:16:00.005+04:00</published><updated>2008-09-30T14:50:33.890+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>VS2010 "Rosario" - Гонка программных вооружений.</title><content type='html'>Microsoft анонсировала следующую версию студии и .Net: &lt;a href="http://www.microsoft.com/presspass/press/2008/sep08/09-29VS10PR.mspx?rss_fdn=Press%20Releases"&gt;Visual Studio 2010 и .Net Framework 4.0&lt;/a&gt;. &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/vstudio/products/cc948977.aspx"&gt;Здесь&lt;/a&gt; есть более подробная информация о нововведениях в VS 2010 (code-name "Rosario"), а о .Net 4.0 информации практически никакой нет. Если между выпусками VS 2005 и VS 2008 прошло три года, то следующая версия выйдет через два. Гонка программных вооружений продолжается и набирает обороты.  &lt;br /&gt;Основные нововведения должны коснуться расширения поддержки различных аспектов Application life-cycle management (ALM).&lt;br /&gt;Вероятно с одной стороны у создателей VS крепнет понимание того, что software development process состоит не только из кодирования и модульных тестов. Есть еще куча всяких активностей и неплохо бы их поддержать в интегрированном инструментарии. &lt;br /&gt;С другой стороны, менеджмент Microsoft не может не замечать огромного количества open source и third party  инструментов разработки активно развивающихся сейчас на широком поле разработки на платформе .Net. Оставлять без внимания такой рынок было бы очень опрометчиво в рамках существующей бизнес стратегии Microsoft, которая состоит в том, что захватив плацдарм, необходимо заполнить собой все рыночные ниши на нем. Хотя на рынке средств разработки, на мой взгляд такая стратегия заведомо проигрышна. Тут деньги не на продуктах зарабатывать надо, а на максимальном расширении базы разработчиков, использующих платформу (как это к примеру делает Sun).&lt;br /&gt;Посмотрим, что будет в 2010 году. Пока же я в 2008-ой студии для модульных тестов использую TestDriven.Net. Просто удобнее.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-6456503643582854785?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/6456503643582854785/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=6456503643582854785' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6456503643582854785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6456503643582854785'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/09/vs2010-rosario.html' title='VS2010 &quot;Rosario&quot; - Гонка программных вооружений.'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-5704890175880689113</id><published>2008-09-23T20:46:00.003+04:00</published><updated>2008-09-23T21:45:49.373+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Комментарии и код</title><content type='html'>В одном из предыдущих постов &lt;a href="http://www.blogger.com/profile/06759238026958804653"&gt;vinler&lt;/a&gt; задал вопрос о комментариях в коде. Я начал отвечать и понял, что тема интересная, и тянет на отдельный пост.&lt;br /&gt;Итак вопрос:&lt;br /&gt;&lt;blockquote&gt;Не мог бы ты высказаться по поводу вида комментариев в коде? Я так думаю, это не маловажная часть правил кодирования.&lt;br /&gt;В частности очень интересует твое мнение, нужно ли вести прямо в коде историю изменений и сохранять имена авторов, если файл с момента создания находится под системой контроля версий.&lt;br /&gt;Еще народ очень любит оставлять куски закомментированного кода. С поясненем, что так уже пробовали и это не сработало.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Есть распространенное мнение о том, что хорошему коду комментарии не нужны. И это действительно так. Другое дело, что хорошего кода не так уж много. Поэтому моя точка зрения: &lt;strong&gt;не можешь писать хороший код - пиши комментарии&lt;/strong&gt;.&lt;br /&gt;Не всегда удается написать хороший код. Иногда просто не хватает времени на проработку дизайна, кажется "потом переделаю", но "потом" обычно не наступает никогда. Иногда программисту просто не хватает опыта, чтобы разработать хороший дизайн. В этом случае очень полезно попытаться написать стандартные (для компилятора C#) комментарии к своим классам. После попытки сформулировать короткое описание класса часто наступает "просветление", после которого удается взглянуть на свой код по новому и подправить дизайн. Сам не раз ловил себя на таком.&lt;br /&gt;Другая хорошая привычка, если уж ты чувствуешь в своем коде какой-то smell, но в силу каких-то причин ты не можешь им заняться прямо сейчас, напиши прямо в коде что-то вроде "&lt;span style="color:#11aa00;"&gt;//здесь воняет&lt;/span&gt;". Возможно потом это станет той последней каплей, которая перевесит чашу весов и ты почининишь этот код.&lt;br /&gt;Одни из главных врагов читаемости кода, это невнятное именование и нарушение SRP (Single Responsibility Principle). Основные порождаемые ими проблемы, это невозможность понять по имени класса или метода что они делают, и невозможность отыскать нужный класс или метод. Есть такой парадокс: почти всегда мы считаем свой код хорошим и читаемым, а чужой плохим и невнятным. Происходит это от того, что о своем коде мы всегда знаем больше, чем о чужом. Поэтому никогда не повредит снабдить комментариями свои классы и ключевые методы. &lt;br /&gt;Ну и на конец, если ты пишешь библиотеку для повторного использования, будь добр, прокоментируй публичные контракты всех своих классов. по моему это признак зрелости программиста и проявление уважения к своим коллегам. &lt;br /&gt;&lt;br /&gt;Теперь по поводу ведения истории кода прямо в коде. Никогда не удалять старый код, а окружать его комментариями, вести многоэтажные заголовки файлов исходников с копирайтами и персональными списками изменений - все это полный маразм. Проверено, это не работает, и со временем просто превращает код в помойку. По моему это делают те, кто не умеет пользоваться системами контроля версий. Любая СКВ позволяет все это делать намного лучше и удобнее. Единственная полезная практика, сопровождать короткими коментами с номером бага или тикета свои изменения в старом коде (и то это ИМХО - мне так удобно).&lt;br /&gt;&lt;br /&gt;Итак, что у нас в сухом остатке? &lt;br /&gt;Комментарии, это самый дешевый способ улучшить поддерживаемость кода, поэтому не стоит пренебрегать ими. Однако никакие комментарии не заставят ваш код работать лучше, не улучшат никакие его характеристики (кроме читаемости) и не заменят хороший дизайн. Поэтому не стоит на них уповать и ими злоупотреблять.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-5704890175880689113?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/5704890175880689113/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=5704890175880689113' title='Комментарии: 14'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5704890175880689113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5704890175880689113'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/09/blog-post_23.html' title='Комментарии и код'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4293221939420029898</id><published>2008-09-18T11:31:00.003+04:00</published><updated>2008-09-18T11:41:37.185+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Почтенный юбилей :-)</title><content type='html'>Двадцать шесть лет назад был придуман смайлик. Вот как это было:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;19-Sep-82 11:44 Scott E Fahlman :-) From: Scott E Fahlman I propose that the following character sequence for joke markers: :-) Read it sideways.&lt;br /&gt;&lt;br /&gt;Actually, it is probably more economical to mark things that are NOT jokes, given current trends. For this, use :-(&lt;/blockquote&gt;&lt;br /&gt;Источник: &lt;a href="http://www.calend.ru/holidays/0/0/2225/"&gt;calend.ru&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Я и не думал, что смайл такой старый. Он старше Интернета (в его современном виде www/http/html). И старше большинства из тех, кто им пользуется :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4293221939420029898?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4293221939420029898/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4293221939420029898' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4293221939420029898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4293221939420029898'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/09/blog-post_18.html' title='Почтенный юбилей :-)'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4687369763182977028</id><published>2008-09-15T22:51:00.002+04:00</published><updated>2008-09-15T23:04:45.375+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Правила хорошего кода</title><content type='html'>&lt;div align="right"&gt;«Компетентный программист полностью осознает строго ограниченные возможности своего черепа, поэтому подходит к задачам программирования со всей возможной скромностью»&lt;br /&gt;Dijkstra.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;В последнее время смотрел много чужого кода, оттого, наверное, и настроение полхое. В ходе просмотров, неоднократно ловил себя на мысли, что код характеризует программиста, как костюм портного. Добротный крой, качественная строчка, аккуратно обработанные детали – все это вещи, за которые мы ценим хороший костюм. В коде все точно так-же, качествнный дизайн классов, ясный код в методах, аккуратность во множестве мелких деталей выдают опытного программиста.&lt;br /&gt;&lt;br /&gt;Есть масса рекомендаций по созданию хорошего кода. Большинство из них касается паттернов программирования. Другие относятся к дизайну классов, третьи – к оформлению кода. Но для качественного кода важны все они. Здесь я попытюсь собрать некоторые наиболее общие, не зависящие от конкретного языка (но лежащие в пределах объектной парадигмы). Паттерны оставим за бортом. Начнем с простейших правил оформления, и будем продвигаться к правилам дизайна.&lt;br /&gt;&lt;br /&gt;Итак, правила хорошего кода:&lt;br /&gt;&lt;OL&gt;&lt;br /&gt;&lt;LI&gt;Придерживайтесь конвенций именования. Неважно, какой конкретно конвенции именования вы придерживаетесь, главное чтобы имена классов, функций, констант и переменных были осмысленными и правила именования были единообразны. То, как программист именует локальные переменные в своих функциях, очень много говорит о зрелости этого программиста.                    &lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Повсеместно избегайте литералов. Заменяйте их константами. Числовые литералы (известные, как магические числа) затрудняют понимание кода. Строковые литералы создают проблемы при локализации / глобализации. Любые повторяющиеся значения литералов создают проблемы при изменении кода. Избегайте констант там, где можно использовать перечислимые типы.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Пишите короткие методы (функции).  Есть различные мнения по поводу оптимального размера процедур и функций. Я использую следующий критерий: если весь метод нельзя увидеть целиком на экране или странице – это слишком большой метод. С увеличением размера функции комбинаторная сложность управляющих структур (условий циклов и т.д.) и переменных возрастает нелинейно, и очень быстро начинает создавать проблемы не только в обеспечении надежности кода, но и в его понимании. Зачем вам лишние проблемы? Разделяйте большие функции на более мелкие. Первые кандидаты на  выделение в отдельные функции, это сложные условия в предложениях if и тела циклов. Выделяйте в функции отдельные функциональные блоки. Если функция вычисляет и сохраняет, то выделите функцию, которая вычисляет, и функцию, которая сохраняет.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Избегайте любого дублирования кода (правило трех О «Once and Only Once»). Существует масса приемов рефакторинга, которые помогают выполнять это правило. Используйте константы вместо литералов, выделяйте повторяющийся код в отдельные методы. &lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Избегайте глобальных переменных (переменных с глобальной областью видимости). Глобальные константы  - это хорошо, глобальные функции  - это нормально, глобальные переменные – это зло. А как же быть с настройками приложения, спросите вы? Большинство платформ предлагают для этого специальные средства. Если же таких средств нет, используйте глобальные функции вместо глобальных переменных. Вместо Boolean MyGlobalFlag используйте функцию Boolean GetMyGlobalFlag(), которая будет возвращать копию текущего значения вашего глобального флага, а само его значение спрячьте за функциями доступа.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Контролируйте доступ. Модификатор public должны иметь только те члены класса, которые составляют публичный контракт этого класса и которые действительно используются другими классами. Все остальные члены должны быть скрыты для внешнего доступа (инкапсулированы). Следите за публичным контрактом своих классов и не допускайте появления в них ничего лишнего. Например:&lt;br /&gt;&lt;DIV class="code"&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;class&lt;/SPAN&gt; Action&lt;br /&gt;{&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; DoAction(Context context)&lt;br /&gt; {&lt;br /&gt;  &lt;SPAN class="KEYWORD"&gt;string&lt;/SPAN&gt; message = &lt;SPAN class="KEYWORD"&gt;string&lt;/SPAN&gt;.Empty;&lt;br /&gt;  If(IsInternal(context))&lt;br /&gt;   message += PrepareInternalMessage(context);&lt;br /&gt;  &lt;SPAN class="KEYWORD"&gt;else&lt;/SPAN&gt;&lt;br /&gt;   message += PrepareExternalMessage(context);&lt;br /&gt;  SendMessage(message);&lt;br /&gt; } &lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;private&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;string&lt;/SPAN&gt; PrepareInternalMessage(Context context){…}&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;private&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;string&lt;/SPAN&gt; PrepareExternalMessage(Context context){…}&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;private&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;bool&lt;/SPAN&gt; IsInternal(Context context) {…} &lt;br /&gt; &lt;SPAN class="COMMENT"&gt;// этот метод тоже должен быть private&lt;/SPAN&gt;&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; SendMessage(&lt;SPAN class="KEYWORD"&gt;string&lt;/SPAN&gt; message){…}&lt;br /&gt;} &lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;Класс Action предназначен для выполнения некоторого действия (DoAction), это собственно и есть его контракт. Метод SendMessage() представляет собой часть реализации этого действия. При этом формат сообщения поступающего в параметр SendMessage также определяется внутренней логикой класса Action. Все эти соображения говорят в пользу того, чтобы скрыть метод SendMessage. Наличие в публичном контракте подобных методов приводит к неправильному использованию класса.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Не совмещайте в одном классе разные обязанности (принцип Single Responsibility Principle). Вот, пример базового класса для реализации действий:&lt;br /&gt;&lt;DIV class="code"&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;class&lt;/SPAN&gt; ActionBase&lt;br /&gt;{&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;abstract&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; DoAction(Context context);&lt;br /&gt; &lt;SPAN class="COMMENT"&gt;// полезная фича  - запись в лог&lt;/SPAN&gt;&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; WriteLog(&lt;SPAN class="KEYWORD"&gt;string&lt;/SPAN&gt; message){…}&lt;br /&gt;}  &lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;Здесь программист решил, что функция записи в лог потребуется во всех реализациях классов – действий и поэтому полезно будет ее вынести в базовый класс. Но основное назначение наследников ActionBase это выполнение действий (DoAction), а запись в лог это совсем другая обязанность. Ну и что с того? Вероятно, что запись в лог потребуется не только для классов-действий, но и для многих других классов. И нам придется либо создавать экземпляр класса-действия для записи в лог (т.е. использовать класс не по назначению), либо продублировать метод WriteLog в других классах. Оба варианта неприемлемы. Поэтому метод WriteLog следует вынести в отдельный класс, который будет заниматься исключительно записью в лог.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Не разговаривай с незнакомцами (правило Деметры). Внутри метода следует обращаться только:&lt;br /&gt;&lt;UL style="LIST-STYLE:square"&gt;&lt;LI&gt;К параметрам, переданным в метод (к свойствам и методам этих параметров, если это объекты)&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;К членам объекта, которому принадлежит метод (this.xxx)&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;К объектам, созданным в данном методе.&lt;/LI&gt;&lt;br /&gt;&lt;/UL&gt;&lt;br /&gt;Цель  - избежать связывания с  непрямыми объектами.&lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;При построении иерархий наследования старайтесь не изменять и не расширять публичный контракт базового класса в наследниках. Данное правило напрямую вытекает из известного принципа подстановки Лискоу (LSP - Liskov Substitution Principle). Вот пример иерархии, который надо избегать:&lt;br /&gt;&lt;DIV class="code"&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;class&lt;/SPAN&gt; Shape&lt;br /&gt;{&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt; public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; X;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt; public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; Y;&lt;br /&gt;}&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;class&lt;/SPAN&gt; Rectangle : Shape&lt;br /&gt;{&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt; public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; Width;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt; public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; Height;&lt;br /&gt;}&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;class&lt;/SPAN&gt; Circle : Shape&lt;br /&gt;{&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt; public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; Radius;&lt;br /&gt;}&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;Придерживаясь данного правила, вы защищаете уже написанный код от изменений в классах наследниках. Крайне неприятна ситуация, когда в различные места существующего кода приходится вносить многочисленные изменения при появлении нового класса наследника. Обычно такой код насыщен операторами if и case, выполняющими обращения к специфичным членам классов наследников.&lt;br /&gt;И все же. Наследники часто расширяют контракт базовых классов, достаточно взглянуть на классы .Net Framework. Почему? Такой подход часто оправдан при проектировании библиотек и фрэймворков. В этом случае базовый класс служит не столько для определения базового интерфейса, сколько для размещения логики взаимодействия с механизмами фрэймворка. Пример такой иерархии, компоненты .Net WinForms.&lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Разделяйте команды и запросы (принцип QCS - Query Command Separation).  Каждый метод должен представлять собой либо команду либо запрос. Метод-команда выполняет какие либо действия, и, возможно, изменяет состояние объекта. Метод-запрос возвращает данные объекта, но не меняет его состояние.  Следование данному принципу вы всегда можете быть уверены, что состояние объекта остается неизменным, когда вы используете его данные, и всегда изменяется явно, при вызове методов-команд (к сожалению, возможности большинства языков не позволяет явно указать компилятору, что в методе не допустимо изменение состояния объекта). &lt;br /&gt;Правильно:&lt;br /&gt;&lt;DIV class="code"&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;class&lt;/SPAN&gt; Counter&lt;br /&gt;{&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;private&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt;  _value;&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; GetCurrentValue(){ &lt;SPAN class="KEYWORD"&gt;return&lt;/SPAN&gt; _value}&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; Increment(&lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; delta) { _value += delta;}&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; Decrement(&lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; delta) { _value -= delta;}&lt;br /&gt;}&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;Неправильно:&lt;br /&gt;&lt;DIV class="code"&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;class&lt;/SPAN&gt; Counter&lt;br /&gt;{&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;private&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt;  _value;&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; GetCurrentValue(){ &lt;SPAN class="KEYWORD"&gt;return&lt;/SPAN&gt; _value}&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; Increment(&lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; delta) { _value += delta; &lt;SPAN class="KEYWORD"&gt;return&lt;/SPAN&gt; _value;}&lt;br /&gt; &lt;SPAN class="KEYWORD"&gt;public&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; Decrement(&lt;SPAN class="KEYWORD"&gt;int&lt;/SPAN&gt; delta) { _value -= delta; &lt;SPAN class="KEYWORD"&gt;return&lt;/SPAN&gt;  _value;}&lt;br /&gt;}&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4687369763182977028?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4687369763182977028/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4687369763182977028' title='Комментарии: 25'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4687369763182977028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4687369763182977028'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/09/blog-post.html' title='Правила хорошего кода'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>25</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-2005567540333625365</id><published>2008-09-15T11:43:00.003+04:00</published><updated>2008-09-15T12:00:24.233+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Театр абсурда: iPhone 3G в России</title><content type='html'>&lt;a href="http://www.mobile-review.com/articles/2008/apple-official.shtml"&gt;Все бросились&lt;/a&gt; продавать и покупать iPhone 3G. И никого не смущает тот факт, что сетей 3G у нас практически нигде нет, а без 3G толку от нового девайса - чуть.&lt;br /&gt;Впрочем, все это уже становится традиционной национальной забавой. Мы закупаем из года в год миллионы новых автомобилей, но нам недосуг построить нормальные дороги для этих автомобилей. Именно недосуг, потому что только на одних автомобильных импортных пошлинах можно было бы пол России в асфальт закатать. &lt;br /&gt;Такие инфраструктурные перекосы всегда были уделом отсталых, колониальных по своей сути экономик, и они очень четко характеризуют сегодняшнее положение России, сколько бы не надувало щеки наше уважаемое правительство.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-2005567540333625365?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/2005567540333625365/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=2005567540333625365' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2005567540333625365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2005567540333625365'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/09/iphone-3g.html' title='Театр абсурда: iPhone 3G в России'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-6931255624101037276</id><published>2008-09-12T10:18:00.003+04:00</published><updated>2008-09-12T10:32:58.820+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Programmer's Day!</title><content type='html'>В этом году 256 (0x100) день выпадает на 12 сентября. &lt;br /&gt;А посему, поздравляю всех коллег с профессиональным праздником, Днем программиста.&lt;br /&gt;Желаю вам чистого и красивого кода, легкой и приятной отладки, и зеленой полосы в юнит-тестах. Горячего, ароматного кофе по утрам и холодного свежего пива по вечерам. Больших и светлых новых проектов и поменьше макарон легаси кода в поддержке.  Маленького бэклога и большого бонуса. В общем, всего хорошего, чем богата наша с вами профессия!&lt;br /&gt;С праздником, друзья!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-6931255624101037276?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/6931255624101037276/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=6931255624101037276' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6931255624101037276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6931255624101037276'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/09/programmers-day.html' title='Programmer&apos;s Day!'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-1153422478763022029</id><published>2008-08-22T11:20:00.002+04:00</published><updated>2008-08-22T11:29:36.784+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Универсальная метрика качества кода</title><content type='html'>Замечательную метрику определения качества кода предложил Bob C. Martin на конференции Agile2008. &lt;br /&gt;&lt;br /&gt;Она называется &lt;strong&gt;"ЧЗХ в минуту"&lt;/strong&gt; (в оригинале WTFs per minute).&lt;br /&gt;&lt;br /&gt;Измеряется очень просто в ходе code review. Вам нужен только счетчик и секундомер. Вы запускаете секундомер и начинаете смотреть код. Всякий раз когда вам хочется сказать или подумать "Что за х....!" - вы щелкаете свой счетчик :). В конце делим показания счетчика на время. Все.&lt;br /&gt;Взято &lt;a href="http://www.agileadvice.com/2008/08/21/theoryofagile/finally-a-solid-metric-for-code-quality/"&gt;здесь&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-1153422478763022029?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/1153422478763022029/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=1153422478763022029' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1153422478763022029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1153422478763022029'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/08/blog-post_22.html' title='Универсальная метрика качества кода'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-1856971776112277746</id><published>2008-08-14T12:15:00.003+04:00</published><updated>2008-08-14T12:24:00.591+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DOTNET'/><title type='text'>И они говорят, что это просто сервис-пак...</title><content type='html'>&lt;a href="http://codebetter.com/blogs/patricksmacchia/"&gt;Patrick Smacchia&lt;/a&gt; в своем блоге &lt;a href="http://codebetter.com/blogs/patricksmacchia/archive/2008/08/13/net-3-5-sp1-changes-overview.aspx"&gt;взял и подсчитал&lt;/a&gt; с помощью &lt;a href="http://www.ndepend.com/"&gt;NDepend&lt;/a&gt; изменения в .Net FW3.5 SP1:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Summary:&lt;br /&gt;&lt;br /&gt;# Assemblies    112&lt;br /&gt;# Namespaces    919 to 935      (+16   +1.7%)&lt;br /&gt;# Types    39 988 to 40 513      (+525   +1.3%)&lt;br /&gt;# Methods    387 421 to 386 790      (-631   -0.2%)&lt;br /&gt;# Fields    241 567 to 246 795      (+5 228   +2.2%)&lt;br /&gt;# IL instructions    8 598 933 to 8 620 940      (+22 007   +0.3%) &lt;br /&gt;&lt;br /&gt;1.393 new public methods   &lt;br /&gt;79 new public types   &lt;br /&gt;No public types removed (hopefully!) &lt;br /&gt;14 non-public methods became public&lt;br /&gt;6.384 methods where code was changed&lt;br /&gt;2.485 types where code was changed&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-1856971776112277746?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/1856971776112277746/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=1856971776112277746' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1856971776112277746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1856971776112277746'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/08/blog-post_14.html' title='И они говорят, что это просто сервис-пак...'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-7556434284889636988</id><published>2008-08-11T22:06:00.003+04:00</published><updated>2008-08-12T00:26:57.373+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Вышел .Net Framework 3.5 SP1</title><content type='html'>Сегодня стали доступны для скачивания &lt;a href="http://msdn.microsoft.com/en-us/vstudio/products/cc533448.aspx"&gt;Visual Studio 2008 Service Pack 1 (SP1) and .NET Framework 3.5 SP1&lt;/a&gt;&lt;br /&gt;Среди всех фич, включенных в SP1, отмечу прежде всего поддержку SQL Server 2008 и релиз ADO.NET Entity Framework. Полный список фич &lt;a href="http://msdn.microsoft.com/ru-ru/vstudio/products/cc533447(en-us).aspx"&gt;здесь&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-7556434284889636988?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/7556434284889636988/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=7556434284889636988' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7556434284889636988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7556434284889636988'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/08/net-framework-35-sp1.html' title='Вышел .Net Framework 3.5 SP1'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-348750774838810485</id><published>2008-08-07T11:49:00.002+04:00</published><updated>2008-08-07T12:02:01.763+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Вышел Microsoft SQL Server 2008 RTM</title><content type='html'>Вчера (6.08.2008) Microsoft &lt;a href="http://www.microsoft.com/presspass/press/2008/aug08/08-06SQLServer2008PR.mspx"&gt;объявила&lt;/a&gt; о выпуске Microsoft SQL Server 2008. Честно говоря, после всех этих поисков героев и грандиозных запусков, которые идут с самого начала года, эта новость как-то не выстрелила. У публики уже сложилось мнение что SQL-2008, это свершившийся факт. &lt;br /&gt;Ну а нам то что с того? Нам теперь придется поддерживать в старых и новых проектах не две, а три версии MS SQL и надо не запутаться в том, какие фичи где работают, а где нет. А то порой так и тянет написать что-то вроде:&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;select [Id] from [MyTable] where @@ROWCOUNT &gt; 0 and [Id] = scope_identity()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;ан нет, нельзя...&lt;br /&gt;А еще у SQL-2008 новый логотип&lt;br /&gt;&lt;a href="http://img.microsoft.com/presspass/images/thumbnails/SqlServer_thumb.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://img.microsoft.com/presspass/images/thumbnails/SqlServer_thumb.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-348750774838810485?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/348750774838810485/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=348750774838810485' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/348750774838810485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/348750774838810485'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/08/microsoft-sql-server-2008-rtm.html' title='Вышел Microsoft SQL Server 2008 RTM'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-1603069108327701430</id><published>2008-08-01T09:32:00.002+04:00</published><updated>2008-08-01T09:41:54.952+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Они нас слышат!</title><content type='html'>В мае, сменился дизайн сайта MSDN Magazine, а вместе с ним и формат URL ссылок. В результате мои заботливо составленные тематические подборочки ссылок на самые интересные статьи перестали работать. Я был ужасно зол, &lt;a href="http://stump-workshop.blogspot.com/2008/05/blog-post_2928.html"&gt;написал&lt;/a&gt; об этом в блоге и многие коментаторы разделяли мое негодование. &lt;br /&gt;&lt;br /&gt;Так вот, они все починили! Они сделали url маппинг, и все мои старые ссылки сейчас работают. Все таки они нас слышат, и это хорошо. А не ошибается лишь тот, кто ничего не делает.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-1603069108327701430?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/1603069108327701430/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=1603069108327701430' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1603069108327701430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1603069108327701430'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/08/blog-post.html' title='Они нас слышат!'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4020808575750217868</id><published>2008-07-30T09:18:00.001+04:00</published><updated>2008-07-30T11:23:45.293+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><title type='text'>Как EF влияет на дизайн ASP.NET приложений</title><content type='html'>Если создавая ASP.Net приложение, вы сумели оторваться от дизайнера ASP.NET страниц, и уже не складываете на странице датасеты, и объекты соединения с БД, значит вы пошли по пути структуризации дизайна вашего web приложения. Наверняка вы выделили классы или модули (сборки) для чтения записи данных в БД, и отдельные классы для представления этих данных и размещения бизнес логики. Возможно вы пошли дальше, и в слое представления выделили логические классы контроллеры, в которые поместили логику организации последовательности действий (workflow), создания представления и валидации пользовательского ввода, оставив в aspx ascx файлах только разметку. А может вы не стали этого делать и функции контроллера оставили в aspx формах. &lt;br /&gt;&lt;br /&gt;Как повлияет на сложившуюся архитектуру ваших ASP.NET приложений использование Entity Framework? Хорошая новость состоит в том, что EF наверняка легко впишется в ваше приложение при использовании любого дизайна (даже если вы дружите с дизайнером ASP.NET страниц :).   &lt;br /&gt;&lt;br /&gt;Однако EF незатейливо подталкивает нас к использованию "анемичной модели", когда классы домена (данные) отдельно, а бизнес-операции (сервисы) отдельно. И это достаточно удобная организация кода. &lt;br /&gt;&lt;br /&gt;В качестве классов домена используем сущности EF. Запихивать бизнес логику в partial классы EF я бы не советовал. На этот счет есть много резонов, главные из них:&lt;br /&gt; - вы увеличиваете зависимости между сущностями. &lt;br /&gt; - часто это нарушает принцип single responsibility&lt;br /&gt; -  структуры данных меняются чаще чем бизнес правила и объединив то и другое в одном классе вы получите проблемы при внесении изменений. &lt;br /&gt;В partial классы для сущностей EF полезно помещать всякие хитрые свойства (вычисляемые, виртуальные и т.д.), а также логику пре- и пост-валидации значений персистентных свойств (это делается при помощи partial methods, генеримых дизайнером EF).&lt;br /&gt;&lt;br /&gt;Бизнес логику лучше помещать в &lt;strong&gt;классы сервисы&lt;/strong&gt;, группируя их по функциональному признаку. Методы бизнес логики строятся по шаблону &lt;em&gt;transaction script&lt;/em&gt;. При этом ObjectContext создается либо в для каждой бизнес-операции (внутри метода сервисного класса), либо на уровне контроллера в слое представления, и тогда он предается в методы бизнес логики в качестве параметра.&lt;br /&gt;&lt;br /&gt;Какой вариант выбрать  - вам решать. Однако,если вы создаете полноценный Service layer - то ObjectConext не должен болтаться в параметрах бизнес-методов. Использование ObjectConext на уровне контроллера в слое представления позволяет более тонко гранулировать бизнес логику и получить за счет этого более эффективное решение (т.е. вместо "больших" бизнес-методов, которые сосредоточенно что-то там делают внутри, вы имеете много "маленьких" бизнес методов, которые получают на вход контекст и вы можете комбинировать их, выстраивая нужную логику). Эффективность может увеличиться в числе прочего, за счет того, что время жизни ObjectConext будет больше, и следовательно, больше возможностей воспользоваться преимуществами кэширования объектов. Важно понимать, что в этом случае &lt;strong&gt;вы платите за повышение эффективности большей связностью между уровнями бизнес логики и представления&lt;/strong&gt;, и вам, в первую очередь, будет сложнее вносить изменения в существующее решение. &lt;br /&gt;&lt;br /&gt;Не следует опасаться создавать экземпляры ObjectConext, не следует пытаться создать для хранения контекста каки либо потоковые переменные и, тем более, синглтоны. Дело в том что EF достаточно эффективно кэширует на уровне домена приложения (Application Domain) внутри себя всю метаинформацию, и после создания первого экземпляра ObjectConext, последующие создаются достаточно быстро. Кроме того, ObjectConext не является потокобезопасным, поэтому не следует пытаться использовать глобальный ObjectConext на уровне приложения или сессии. &lt;br /&gt;&lt;br /&gt;Следует избегать ситуаций, когда у вас создаются параллельно несколько ObjectConext в одном потоке, а также создания вложенных ObjectConext. Это может приводить к коллизиям при обновлении и сохранении данных.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4020808575750217868?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4020808575750217868/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4020808575750217868' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4020808575750217868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4020808575750217868'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/07/ef-aspnet.html' title='Как EF влияет на дизайн ASP.NET приложений'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-6677275536648745515</id><published>2008-07-18T09:42:00.002+04:00</published><updated>2008-07-18T09:49:54.762+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>А если бы у него был компьютер...</title><content type='html'>IT-шникам свойственно преувеличивать значение своих технологий в бизнесе и в жизни. Вот хороший анекдот в тему:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;em&gt;Мужик приходит устраиваться дворником в компанию Microsoft.&lt;br /&gt;&lt;br /&gt;Менеджер отдела кадров сначала, задает ему несколько вопросов, потом проводит небольшой тест (предлагает подмести часть территории) и наконец обявляет решение:&lt;br /&gt;— Вы приняты, оставьте ваш электронный адрес, чтобы мы могли вам сообщить в какое место и в какой день вам нужно будет в первый раз прийти на работу.&lt;br /&gt;— Но у меня и компьютера-то нет, — растерянно отвечает мужик, — не то что электронного адреса.&lt;br /&gt;— В таком случае мы не можем взять вас на работу, поскольку виртуально вы не существуете.&lt;br /&gt;Мужик выходит грустный, не зная что делать, когда в кармане осталось всего 10 долларов. Однако тут ему в голову пришла мысль: он заходит на рынок и покупает 10 кг помидоров.&lt;br /&gt;&lt;br /&gt;Затем он начинает ходить по домам и предлагать товар, и меньше чем за 2 часа ему удается удвоить капитал. После того как он повторил то же самое еще 3 раза, у него в кармане было уже 160 баксов. И тут он понимает, что с такими доходами вполне можно жить и без работы! Каждое утро он выходит из дома все раньше и возвращается все позднее, каждый день удваивая, а то и утраивая капитал.&lt;br /&gt;&lt;br /&gt;Через какое-то время он покупает машину, затем грузовик, а еще через некоторое время открывает фирму по доставке товаров населению.&lt;br /&gt;&lt;br /&gt;Спустя 5 лет он уже является владельцем крупной сети супермаркетов.&lt;br /&gt;&lt;br /&gt;И тут, задумавшись о будущем, он вдруг решил застраховать свою жизнь и жизнь всей своей семьи.&lt;br /&gt;&lt;br /&gt;После переговоров со страховым агентом тот просит его оставить электронный адрес, на который можно было бы отправить наиболее выгодное предложение, на что коммерсант, как и несколько лет назад, отвечает, что у него нет ни электронного адреса, ни даже компьютера.&lt;br /&gt;— Это удивительно, — недоумевает страховой агент, — у вас такой крупный бизнес и нет электронного адреса! Вы только представьте себе, кем бы вы стали, если бы у вас был компьютер!&lt;br /&gt;Поразмыслив, коммерсант отвечает:&lt;br /&gt;— Я бы стал дворником компании Microsoft.&lt;/em&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-6677275536648745515?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/6677275536648745515/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=6677275536648745515' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6677275536648745515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6677275536648745515'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/07/blog-post.html' title='А если бы у него был компьютер...'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-801554694302348508</id><published>2008-07-17T11:28:00.004+04:00</published><updated>2008-07-17T11:55:14.996+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><category scheme='http://www.blogger.com/atom/ns#' term='DOTNET'/><title type='text'>Terrarium 2.0 теперь в исходных кодах!</title><content type='html'>Microsoft Windows SDK Blog сообщает что &lt;a href="http://blogs.msdn.com/windowssdk/archive/2008/07/16/net-terrarium-2-0-source-code-now-available.aspx"&gt;.NET Terrarium 2.0 source code now available!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Не многие наверное помнят, что такое Terrarium. Для тех, кто не в курсе  -  была такая сетевая игра для программистов. Microsoft запустила Terrarium вместе с выходом первой версии .Net Framework с целью популяризировать новую платформу и языки программирования (C# и VB.NET) среди программистов. Суть игры состояла в том, что надо было используя Terrarium SDK написать класс (унаследовавшись от базового и реализовав нужные интерфейсы), представляющий собой травоядное или хищное животное. Алгоритм поведения задавался кодом, а характеристики (быстрота, агрессивность, незаметность, скорость размножения и т.п.) задавались посредством нового тогда механизма атрибутов. Класс надо скомпилировать, а полученную сборку загрузить на сервер игры. После этого на сервере создавалось 10 экземпляров животных твоего класса (Reflection!) и они начинали "жить", ползая по игровому полю твоего клиента. Клиент игры представлял собой Windows Forms приложение и соединялся с сервером посредством Remoting. Фишка состояла в том, что при благоприятных условиях, твои животные начинали размножаться, а при неблагоприятных  - дохли :). Кроме того, по игровому полю медленно летал шар-телепорт. Попавшая в него зверюшка телепортировалась случайным образом на другого клиента (опять ремотинг!). Побеждал тот, чья популяция становилась максимальной. В общем, прекрасная штука для знакомства с .Net. Помнится тогда и в категории хищников и у категории травоядных среди победителей были ребята из Питера (они применили свои наработки в теории конечных автоматов).&lt;br /&gt; &lt;br /&gt;Мне же Terrarium, запомнилась тем, что с ее помощью я изучил .Net, фактически круто сменил свою специализацию и устроился на работу .Net разработчиком, имея за плечами в области .Net лишь опыт программирования в Terrarium :)&lt;br /&gt;Такая вот история.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-801554694302348508?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/801554694302348508/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=801554694302348508' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/801554694302348508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/801554694302348508'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/07/terrarium-20.html' title='Terrarium 2.0 теперь в исходных кодах!'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-117554729251642454</id><published>2008-07-15T21:40:00.000+04:00</published><updated>2008-07-16T21:40:46.920+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='DOTNET'/><title type='text'>Как работает ManualResetEvent</title><content type='html'>Ну вот я вернулся из отпуска и после долгого молчания решил разразиться техническим постом. &lt;br /&gt;Меня уже несколько раз приходилось объяснять принцип работы и использования ManualResetEvent. И вот я решил все это подробно разжевать с примерами кода. &lt;br /&gt;Продвинутых коллег сразу предупреждаю, ничего нового и эксклюзивного здесь не будет, если ManualResetEvent для вас не является белым пятном, то дальше можете не читать.&lt;br /&gt;     &lt;br /&gt;Итак, когда наш код выполняется в одном потоке, инструкции выполняются в определенном программой порядке. Но стоит нам запустить код в нескольких потоках у нас сразу возникает неопределенность в каком порядке выполняются инструкции нашего кода. Рассмотрим простейшим пример.  &lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;static&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; Main(&lt;SPAN class="KEYWORD"&gt;string&lt;/SPAN&gt;[] args)&lt;br /&gt;{&lt;br /&gt;    Thread thread = &lt;SPAN class="KEYWORD"&gt;new&lt;/SPAN&gt; Thread(&lt;SPAN class="KEYWORD"&gt;new&lt;/SPAN&gt; ThreadStart(ParallelWork));&lt;br /&gt;    thread.Start();&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Main:thread work finished"&lt;/SPAN&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;static&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; ParallelWork()&lt;br /&gt;{&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Thread:begin work"&lt;/SPAN&gt;);&lt;br /&gt;    Thread.SpinWait(1000);&lt;SPAN class="COMMENT"&gt;// что то полезное делаем тут&lt;/SPAN&gt;&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Thread:end work"&lt;/SPAN&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;В методе Main() мы создаем и запускаем поток, в котором будет выполнен код метода ParallelWork(). Запустив несколько раз этот код мы можем получить на выходе:&lt;br /&gt;&lt;em&gt;Thread:begin work&lt;br /&gt;Thread:end work&lt;br /&gt;Main:thread work finished&lt;/em&gt;&lt;br /&gt;или&lt;br /&gt;&lt;em&gt;Thread:begin work&lt;br /&gt;Main:thread work finished&lt;br /&gt;Thread:end work&lt;/em&gt;&lt;br /&gt;или&lt;br /&gt;&lt;em&gt;Main:thread work finished&lt;br /&gt;Thread:begin work&lt;br /&gt;Thread:end work&lt;/em&gt;&lt;br /&gt;Обычно ничего страшного в этом нет, ведь параллельное исполнение кода именно для этого и задумывалось. Но иногда у нас возникает необходимость синхронизировать исполнение отдельных участков кода в разных потоках. &lt;br /&gt;Если взять наш куцый примерчик, то предположим, мы хотим, чтобы метод Main дождался завершения метода ParallelWork, и только потом завершился сам. Достичь этого можно разными способами. Например, можно объявить булеву переменную флаг, в метод Main вставить цикл проверки этого флага, а в конце метода ParallelWork выставлять флаг в true. Вот так:   &lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;static&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;bool&lt;/SPAN&gt; flag = &lt;SPAN class="KEYWORD"&gt;false&lt;/SPAN&gt;;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;static&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; Main(&lt;SPAN class="KEYWORD"&gt;string&lt;/SPAN&gt;[] args)&lt;br /&gt;{&lt;br /&gt;    Thread thread = &lt;SPAN class="KEYWORD"&gt;new&lt;/SPAN&gt; Thread(&lt;SPAN class="KEYWORD"&gt;new&lt;/SPAN&gt; ThreadStart(ParallelWork));&lt;br /&gt;    thread.Start();&lt;br /&gt;    while (!flag) ;&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Main:thread work finished"&lt;/SPAN&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;static&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; ParallelWork()&lt;br /&gt;{&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Thread:begin work"&lt;/SPAN&gt;);&lt;br /&gt;    Thread.SpinWait(1000);&lt;SPAN class="COMMENT"&gt;// что то полезное делаем тут&lt;/SPAN&gt;&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Thread:end work"&lt;/SPAN&gt;);&lt;br /&gt;    flag = true;&lt;br /&gt;}&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;На выходе получим искомое:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Thread:begin work&lt;br /&gt;Thread:end work&lt;br /&gt;Main:thread work finished&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;за счет того что в методе Main будет молотить холостой цикл while(!flag) ; пока метод ParallelWork() не выставит flag = true. Основной недостаток такого способа синхронизации состоит в том, что холостой цикл очень хорошо грузит процессор. &lt;br /&gt;&lt;br /&gt;Ту же самую задачу можно решить при помощи ManualResetEvent. &lt;br /&gt;Вот так:   &lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;static&lt;/SPAN&gt; ManualResetEvent sync;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;static&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; Main(&lt;SPAN class="KEYWORD"&gt;string&lt;/SPAN&gt;[] args)&lt;br /&gt;{&lt;br /&gt;    sync = &lt;SPAN class="KEYWORD"&gt;new&lt;/SPAN&gt; ManualResetEvent(&lt;SPAN class="KEYWORD"&gt;false&lt;/SPAN&gt;); &lt;br /&gt;    Thread thread = &lt;SPAN class="KEYWORD"&gt;new&lt;/SPAN&gt; Thread(&lt;SPAN class="KEYWORD"&gt;new&lt;/SPAN&gt; ThreadStart(ParallelWork));&lt;br /&gt;    thread.Start();&lt;br /&gt;    sync.WaitOne();&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Main:thread work finished"&lt;/SPAN&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;static&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; ParallelWork()&lt;br /&gt;{&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Thread:begin work"&lt;/SPAN&gt;);&lt;br /&gt;    Thread.SpinWait(1000);&lt;SPAN class="COMMENT"&gt;// что то полезное делаем тут&lt;/SPAN&gt;&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Thread:end work"&lt;/SPAN&gt;);&lt;br /&gt;    sync.Set();&lt;br /&gt;}&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Как это работает? Очень просто.&lt;br /&gt;У ManualResetEvent есть внутреннее состояние: сигнальное и несигнальное. В сигнальное он переводится методом Set() в несигнальное  - методом Reset(). Также начальное состояние ManualResetEvent можно задать и в конструкторе. В нашем случае мы создаем экземпляр ManualResetEvent  в несигнельном состоянии.&lt;br /&gt;&lt;br /&gt;Самый главный его метод WaitOne(). Когда в коде встречается вызов WaitOne() &lt;strong&gt;исполнение приостанавливается, если  ManualResetEvent в несигнальном состоянии&lt;/strong&gt;. А если в &lt;strong&gt;сигнальном – WaitOne исполняется без задержки&lt;/strong&gt;. На этом и основано его использование. &lt;strong&gt;Мы заставляем код в главном потоке остановиться и ждать на вызове WaitOne(), пока где нибудь в другом потоке не вызовут Set()&lt;/strong&gt;. Вызов Set() как-бы подает сигнал другому потоку (или нескольким), который висит и ждет на вызове WaitOne(), после чего этот поток может продолжить свое исполнение. Т.е. WaitOne() по своему эффекту похож на Thread.Sleep(), но с возможностью разбудить поток в нужный момент из другого потока. &lt;br /&gt;&lt;br /&gt;Благодаря тому, что ManualResetEvent использует synchronization handle операционной системы, &lt;strong&gt;поток ожидающий на вызове WaitOne() действительно приостанавливается, ему не выделяются кванты процессорного времени и он не тормозит исполнение других потоков&lt;/strong&gt;. И это основное отличие от синхронизации с флагом и холостым циклом. Висеть на WaitOne() может не один а несколько потоков, и все они выдут из ожидания при вызове одного Set().  &lt;br /&gt;&lt;br /&gt;Напоследок, хочу упомянуть, что рассматриваемую в примере задачу синхронизации можно решить и без ManualResetEvent, при помощи Thread.Join(), однако стоить заметить, что Thread.Join() использует внутри те же механизмы, что и ManualResetEvent&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;static&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; Main(&lt;SPAN class="KEYWORD"&gt;string&lt;/SPAN&gt;[] args)&lt;br /&gt;{&lt;br /&gt;    sync = &lt;SPAN class="KEYWORD"&gt;new&lt;/SPAN&gt; ManualResetEvent(&lt;SPAN class="KEYWORD"&gt;false&lt;/SPAN&gt;); &lt;br /&gt;    Thread thread = &lt;SPAN class="KEYWORD"&gt;new&lt;/SPAN&gt; Thread(&lt;SPAN class="KEYWORD"&gt;new&lt;/SPAN&gt; ThreadStart(ParallelWork));&lt;br /&gt;    thread.Start();&lt;br /&gt;    thread.Join();&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Main:thread work finished"&lt;/SPAN&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;SPAN class="KEYWORD"&gt;static&lt;/SPAN&gt; &lt;SPAN class="KEYWORD"&gt;void&lt;/SPAN&gt; ParallelWork()&lt;br /&gt;{&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Thread:begin work"&lt;/SPAN&gt;);&lt;br /&gt;    Thread.SpinWait(1000);&lt;SPAN class="COMMENT"&gt;// что то полезное делаем тут&lt;/SPAN&gt;&lt;br /&gt;    Console.WriteLine(&lt;SPAN class="STRING"&gt;"Thread:end work"&lt;/SPAN&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-117554729251642454?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/117554729251642454/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=117554729251642454' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/117554729251642454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/117554729251642454'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/07/manualresetevent.html' title='Как работает ManualResetEvent'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-7500540074328939176</id><published>2008-06-19T11:40:00.002+04:00</published><updated>2008-06-19T11:50:41.975+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>В помощь разработчикам под MS CRM</title><content type='html'>Если вам пришлось разрабатывать решения на основе MS CRM рекомендую &lt;a href="http://ronaldlemmen.blogspot.com/"&gt;блог Ronald Lemmen&lt;/a&gt;. Рональд является MVP как раз в области MS CRM. Помимо того, что в его блоге  есть множество полезных ссылок на другие ресурсы, связанные с CRM, Рональд и сам пишет о многих тонкостях, которых вы не найдете ни в SDK ни в KB. &lt;br /&gt;Мне, к примеру, &lt;a href="http://ronaldlemmen.blogspot.com/2007/01/callout-not-working.html"&gt;он помог&lt;/a&gt; справиться с ошибкой при отладке Callout. Thanks a lot, Ronald!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-7500540074328939176?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/7500540074328939176/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=7500540074328939176' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7500540074328939176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7500540074328939176'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/06/ms-crm.html' title='В помощь разработчикам под MS CRM'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-2403642121680441278</id><published>2008-06-06T09:51:00.004+04:00</published><updated>2008-06-06T10:43:24.971+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='DOTNET'/><title type='text'>Surprise! Explicit Enum Cast in C#</title><content type='html'>&lt;div align="right"&gt;О сколько нам открытий чудных&lt;/div&gt;&lt;div align="right"&gt;Готовит просвещенья дух.&lt;/div&gt;&lt;div align="right"&gt;(с) А. С. Пушкин&lt;/div&gt;&lt;br /&gt;Как вы думаете, что выдаст на консоль приведенный ниже код?&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="KEYWORD"&gt;public&lt;/span&gt; &lt;span class="KEYWORD"&gt;enum&lt;/span&gt; Parts&lt;br /&gt;{&lt;br /&gt; Engine = 1,&lt;br /&gt; Wheels,&lt;br /&gt; Brakes&lt;br /&gt;}&lt;br /&gt;&lt;span class="KEYWORD"&gt;static&lt;/span&gt; &lt;span class="KEYWORD"&gt;void&lt;/span&gt; Main(&lt;span class="KEYWORD"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;{&lt;br /&gt; &lt;span class="KEYWORD"&gt;try&lt;/span&gt;&lt;br /&gt; {&lt;br /&gt;  Parts lineItem = (Parts)4;&lt;br /&gt;  Console.WriteLine(lineItem);&lt;br /&gt; }&lt;br /&gt; &lt;span class="KEYWORD"&gt;catch&lt;/span&gt;&lt;br /&gt; {&lt;br /&gt;  Console.WriteLine(&lt;span class="STRING"&gt;"Exception"&lt;/span&gt;);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Не знаю, как вы, а я был убежден, что это будет "Exception". Однако на выходе получаем "4". Кстати, если Console.WriteLine(lineItem) заменить на Console.WriteLine(Enum.GetName(typeof(Parts),lineItem)) получим пустую строку. Вот так засада! Явным приведением можно загнать в enum любое значение underlying типа. Судя по обсуждению на RSDN это стало сюрпризом для многих. &lt;br /&gt;&lt;br /&gt;Оказывается Anders Hejlsberg пишет в книге "The C# Programming Language":&lt;br /&gt;&lt;blockquote&gt;"Each enum type has a corresponding integral type called the underlying type of the enum type. An enum type that does not explicitly declare an underlying type has an underlying type of int. An enum type’s storage format and range of possible values are determined by its underlying type. The set of values that an enum type can take on &lt;strong&gt;is not limited by its enum members&lt;/strong&gt;. In particular, &lt;strong&gt;any value of the underlying type of an enum can be cast to the enum type&lt;/strong&gt; and is a distinct valid value of that enum type."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Указания на такое поведение есть и в стандарте C#, дык только кто-ж это все читает...&lt;br /&gt;Теперь, когда я думаю о том, сколько кода написано в твердой уверенности, что enum не может содержать никаких значений, кроме объявленных, мне становится как-то не по себе. &lt;br /&gt;Надо взять за правило в switch-ах по enum-мам всегда ставить метку default.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-2403642121680441278?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/2403642121680441278/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=2403642121680441278' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2403642121680441278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2403642121680441278'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/06/surprise-explicit-enum-cast-in-c.html' title='Surprise! Explicit Enum Cast in C#'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-8438427233719599096</id><published>2008-06-04T21:16:00.004+04:00</published><updated>2008-06-04T21:52:35.177+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>DDNA</title><content type='html'>Ну какая может быть Силиконовая долина в Дубне, если здесь нет ни одной user group разработчиков, подумал я. Подумал, и решил, настало время собрать группу разработчиков .Net. Поговорил с ребятами  - вроде интерес есть. Мощная аббревиатура в заголовке означает Dubna Dot Net Alliance. &lt;br /&gt;&lt;br /&gt;И вот 29 мая прошла первая встреча Сообщества .Net разработчиков Дубны, организации которой я посвятил практически весь предшествующий месяц. К сожалению из 18 зарегистрировавшихся пришло только 10 человек. Зато среди них были замечены преподаватели университета :). &lt;br /&gt;Конечно пришлось делать доклад, тема довольно размытая "Эволюция C#" была выбрана с явным расчетом завлечь в сети .Net еще не определившиеся юные души. Впрочем, расчет не оправдался, пришли только матерые .Net-чики :) Не все получилось. Хронометраж не выдержал, кое что из интересных фактов не рассказал, и т.д. Еще раз убедился, что для всякого дела недостаточно только знаний, но нужен навык. Презентационные навыки у меня развиты слабо, надо работать в этом направлении. &lt;br /&gt;Второй доклад делал Юра Михеев о новых возможностях SQL 2008. Тут действительно было интересно, Geo-spatial data, и наконец-то, нормальный тип данных для даты и времени - асана!  &lt;br /&gt;&lt;br /&gt;И вот парадокс. Сейчас у нас нет недостатка в людях готовых сделать доклады, но есть явный недостаток в людях, которые составили бы аудиторию.&lt;br /&gt;&lt;br /&gt;Материалы встречи можно найти на сайте &lt;a href="http://dubna.ineta.ru"&gt;dubna.ineta.ru&lt;/a&gt; (По правде, говоря портал ineta.ru настолько глючный, что даже ссылку давать стремно).&lt;br /&gt;  &lt;br /&gt;P.S. Предвижу злобные комментарии по поводу "силиконовой долины", однако упроно продолжаю использовать этот термин. Кре&lt;strong&gt;мниевая&lt;/strong&gt; - слово для русского языка трудновыговариваемое (о!).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-8438427233719599096?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/8438427233719599096/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=8438427233719599096' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8438427233719599096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8438427233719599096'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/06/ddna.html' title='DDNA'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-7922407151455833440</id><published>2008-06-04T15:00:00.004+04:00</published><updated>2008-06-04T15:48:43.602+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DOTNET'/><title type='text'>Набор .Net патологоанатома</title><content type='html'>UserDump, WinDbg и sos.dll  - это инструменты которыми .Net разработчики пользуются очень редко. Но если ваша программа замечательно работает у вас, но подло глючит у пользователя или заказчика, то без набора этих инструментов вам не обойтись. &lt;br /&gt;Как ими пользоваться &lt;a href="http://yuryskaletskiy.blogspot.com/2007/09/userdump-debugging-tools-for-windows.html"&gt;рассказывает в своем блоге&lt;/a&gt; Юрий Скалецкий.&lt;br /&gt;Как обнаруживать утечки памяти в .Net  при помощи sos.dll и windbg описано &lt;a href="http://msdn.microsoft.com/en-us/library/ms954591.aspx"&gt;здесь&lt;/a&gt; (во второй половине статьи). &lt;br /&gt;Как снять crash dump при помощи adplus можно прочитать &lt;a href="http://blogs.msdn.com/tom/archive/2008/05/15/asp-net-tips-what-to-gather-to-troubleshoot-part-3a-crash-revisited.aspx"&gt;здесь&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-7922407151455833440?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/7922407151455833440/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=7922407151455833440' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7922407151455833440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7922407151455833440'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/06/net.html' title='Набор .Net патологоанатома'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-6759148111429029209</id><published>2008-05-28T10:22:00.004+04:00</published><updated>2008-05-28T11:59:57.109+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Темная сторона силы</title><content type='html'>&lt;div align="right"&gt;«Как все плохо: кругом война, смерть, глупость… а мы тут пьём…»&lt;br /&gt;(с) Масяня&lt;/div&gt;&lt;br /&gt;С удовольствием читаю &lt;a href="http://blogs.sun.com/jonathan"&gt;блог Джонатана Шварца&lt;/a&gt; (CEO and President Sun Microsystems, Inc.). На этот раз &lt;a href="http://blogs.sun.com/jonathan_ru/entry/%D0%BF%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B8_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5_%D0%BC%D1%8B"&gt;он размышляет&lt;/a&gt; о той степени открытости и прозрачности информации, которую дает нам Интернет.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;... во всем мире сеть стала важным элементом в общественной жизни людей, и нарастающий вал блогов, электронной почты и данных с цифровых камер и мобильных телефонов обеспечивают все большую прозрачность мира. Мы живем в мире, в котором травмы и триумфы мгновенно становятся видными всем. Солнечный свет не только прекрасно дезинфицирует, но еще и обеспечивает безопасность; ведь невозможно устранить проблемы, о которых ничего не знаешь. Но если вы узнали о проблеме, то даже скромные попытки ее решения, помноженные на потенциал Интернета, могут всё изменить.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Я вот не разделяю оптимизма Джонатана по этому поводу. Посмотреть - да, желающих предостаточно, увидеть катастрофы и смерть в живую, в прямом эфире, пощекотать свои нервы, и ощутить выброс адреналина. А вот помочь решить чьи-то проблемы, да и просто посочувствовать, тут желающих очень не много.&lt;br /&gt;&lt;br /&gt;А с другой стороны, многие люди говорят "Как страшно стало жить, кругом катастрофы, убийства, смерть". Но ведь ничего не изменилось, все это было всегда. Просто раньше, все эти ужасы не доносились до нас в режиме online. &lt;strong&gt;И любой человек мог быть локально счастливым&lt;/strong&gt;, независимо от мировых катаклизмов и чьих-то проблем, а просто в силу того, что ему именно сейчас улыбнулась удача, просто потому что сегодня над твоей головой светит солнце, и цветет черемуха, и поют птицы. Но нет, Интернет, радио и ТВ ест твой мозг: в Китае землетрясение, в Бирме хунта, а в соседнем овраге вчера нашли труп. &lt;br /&gt;&lt;br /&gt;Я не хочу знать про труп. Я хочу сегодня быть счастлив. И глобальная сеть мне в этом не поможет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-6759148111429029209?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/6759148111429029209/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=6759148111429029209' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6759148111429029209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6759148111429029209'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/blog-post_28.html' title='Темная сторона силы'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-3812768907214405847</id><published>2008-05-26T13:07:00.002+04:00</published><updated>2008-05-26T13:11:56.104+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Ну, надо же!..</title><content type='html'>&lt;table style="text-align: justify; width: 510px; background:#FFE493 none repeat scroll 0%; font-size: 11pt;"&gt;&lt;tr&gt;&lt;td&gt;Я проверил свои знания русского языка и получил пятерку.&lt;br&gt;Правильных ответов у вас - 8 из 8. Получите заслуженную оценку и порадуйтесь, что не одиноки: столько же верных ответов дали 7% россиян с вашим уровнем образования*.&lt;br&gt;&lt;img align="center" width="500" height="164" src="http://www.rb.ru/poll/7/img/5.gif"&gt; &lt;br&gt;&lt;br&gt;&lt;b&gt;&lt;a href="http://www.rb.ru/poll/7/"&gt;Сходи, проверься?&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Тем не менее я делаю очень много ошибок при письме. Это еще раз доказывает, что умение сдавать экзамены, и умение применять знания на практике это две разные вещи. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-3812768907214405847?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/3812768907214405847/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=3812768907214405847' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3812768907214405847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3812768907214405847'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/blog-post_6989.html' title='Ну, надо же!..'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-193427729546318087</id><published>2008-05-26T09:34:00.004+04:00</published><updated>2008-08-02T23:32:30.421+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Пополнение в семействе копов</title><content type='html'>Все наверное знают, что такое FxCop (Microsoft Code Analysis). Если все же кто-то не знает, FxCop - это инструмент, позволяющий проверять выполнение определенных правил кодирования. Теперь в дополнение к нему Microsoft &lt;a href="http://blogs.msdn.com/sourceanalysis/archive/2008/05/23/announcing-the-release-of-microsoft-source-analysis.aspx"&gt;анонсирует&lt;/a&gt; выпуск Microsoft Source Analysis for C# (StyleCop) - инструмента для анализа исходных кодов. &lt;br /&gt;В отличие от FxCop, который анализирует бинарники (точнее MSIL), StyleCop аналазирует исходники на C#. Анализирует на предмет удобства чтения, документированности, отступов и т.п. Всего около 200 правил, в том числе:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;- Layout of elements, statements, expressions, and query clauses &lt;br /&gt;- Placement of curly brackets, parenthesis, square brackets, etc &lt;br /&gt;- Spacing around keywords and operator symbols &lt;br /&gt;- Line spacing &lt;br /&gt;- Placement of method parameters within method declarations or method calls &lt;br /&gt;- Standard ordering of elements within a class &lt;br /&gt;- Formatting of documentation within element headers and file headers &lt;br /&gt;- Naming of elements, fields and variables &lt;br /&gt;- Use of the built-in types &lt;br /&gt;- Use of access modifiers &lt;br /&gt;- Allowed contents of files &lt;br /&gt;- Debugging text&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Загрузить StyleCop можно &lt;a href="https://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=sourceanalysis"&gt;отсюда&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;Сказать по правде, я не отношусь к поклонникам подобного рода инструментов. FxCop использую от случая к случаю, в основном, когда надо быстро выполнить формальное ревью большого количества незнакомого кода, чтобы оценить его общее качество. А на счет StyleCop, так по мне, это не более чем средство окончательно задолбать разработчиков. &lt;br /&gt;А вы как думаете?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-193427729546318087?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/193427729546318087/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=193427729546318087' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/193427729546318087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/193427729546318087'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/blog-post_26.html' title='Пополнение в семействе копов'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-5798126432193249958</id><published>2008-05-23T09:42:00.004+04:00</published><updated>2008-05-23T09:55:25.836+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>И опять про MSDN</title><content type='html'>Данила Корнев, новый MSDN Online Program Manager, в &lt;a href="http://blogs.gotdotnet.ru/personal/danielkornev/default.aspx"&gt;своем блоге&lt;/a&gt; &lt;a href="http://blogs.gotdotnet.ru/personal/danielkornev/PermaLink.aspx?guid=a1319f8a-91c5-40cc-a264-05b87571370d"&gt;сообщает&lt;/a&gt; об открытии &lt;a href="http://msdn.microsoft.com/ru-ru/default.aspx"&gt;русского раздела MSDN&lt;/a&gt;. &lt;br /&gt;Буквально на днях я &lt;a href="http://stump-workshop.blogspot.com/2008/05/blog-post_2928.html"&gt;обнаружил&lt;/a&gt; что все мои закладки на статьи MSDN Magazine перестали работать. А теперь у меня появились новые поводы для недовольства, связанные с MSDN, о чем я хотел сделать комментарий в блоге Данилы, но комментарий сохранить не удалось. Поэтому комментирую здесь.&lt;br /&gt;  &lt;br /&gt;Данила, не все так здорово. Например на русскоязычной странице &lt;a href="http://msdn.microsoft.com/ru-ru/aa937802.aspx"&gt;"Центры разработчиков"&lt;/a&gt;  есть ссылка на "Журнал «MSDN Magazine»" и ведет она на английскую страницу MSDN Magazine. Несмотря на то, что существует русская версия. Сейчас на MSDN вообще_нигде_нет_ссылок на русскую версию MSDN Magazine! Зачем его вообще на русский переводят, если прочитать это никто не может.&lt;br /&gt;&lt;br /&gt;Раньше можно было почитать русскую версию документации по .Net Framework 1.1 вот по этой ссылке &lt;a href="http://msdn.microsoft.com/library/rus/default.asp"&gt;http://msdn.microsoft.com/library/rus/default.asp&lt;/a&gt;. Теперь она не работает. &lt;br /&gt;Локализация MSDN Library на русский язык в конце этого года, это здорово. Но зачем ломать то что работает! У тысяч людей есть десятки тысяч закладок на статьи русский MSDN Magazine. С переводом MSDN Magazine на новый URL mapping старые закладки не работают. Ну кто так делает?!!!&lt;br /&gt;На форумах разработчиков есть тысячи ссылок на  русскую версию документации по .Net Framework 1.1. Теперь все ссылки протухли. Что вы там у себя сэкономили, пришибив раздел http://msdn.microsoft.com/library/rus/ ?&lt;br /&gt;У вас вообще есть план миграции при разработке новых версий web ресурсов? Будь новый MSDN хоть каким распрекрасным, но если я испытываю проблемы с поиском информации, которую я раньше без проблем находил по своим закладкам, то я считаю, что это плохая работа.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-5798126432193249958?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/5798126432193249958/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=5798126432193249958' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5798126432193249958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5798126432193249958'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/msdn.html' title='И опять про MSDN'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-682689886367200540</id><published>2008-05-19T16:13:00.002+04:00</published><updated>2008-05-19T16:47:24.872+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Страшная сила кривых рук</title><content type='html'>&lt;a href="http://msdn.microsoft.com/en-us/magazine/default.aspx"&gt;MSDN Magazine Online&lt;/a&gt; очень ценный источник информации для разработчиков. С недавних пор он сменил свой look &amp; feel, стал более веб_два_нольным, скжем так. Появились кнопочки для digg, technorati, reddit и т.д., список самых популярных статей и т.д.&lt;br /&gt; &lt;br /&gt;Заодно, легким движением руки, какой то добрый человек, сменил способ формирования URL. Была уменя, к примеру, закладочка вот такого вида http://msdn.microsoft.com/msdnmag/issues/06/11/default.aspx?loc=ru , а теперь сделалась вот такого http://msdn.microsoft.com/ru-ru/magazine/cc135434.aspx Чувствуете разницу? И теперь самое интересное  - &lt;strong&gt;ссылки старого формата не обрабатываются&lt;/strong&gt;. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;У вас есть закладки на статьи MSDN Magazine? Если есть можете их выкинуть&lt;/strong&gt;. Нет никакого другого способа превратить "issues/06/11/default.aspx?loc=ru" в "cc135434.aspx", кроме как шариться по новому сайту и искать нужную статью, ориентируясь при этом на старый URL. &lt;br /&gt;&lt;br /&gt;У меня таким образом протухли десятки ссылок в том числе и на этом блоге (напр., &lt;a href="http://stump-workshop.blogspot.com/2008/02/wcf.html"&gt;"Подборка материалов по WCF"&lt;/a&gt; протухла почти вся).&lt;br /&gt;&lt;br /&gt;Кстати, о том что у статей MSDN Magazine существует русский перевод вы теперь никогда не узнаете, если не замените в середине URL "en-Us" на "ru-Ru".   &lt;br /&gt;&lt;br /&gt;В общем, спасибо тебе, MSDN Magazine, за заботу. &lt;br /&gt;&lt;br /&gt;P.S. Если бы я сделал такое в своем проекте, мне бы наверное, руки поотрывали...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-682689886367200540?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/682689886367200540/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=682689886367200540' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/682689886367200540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/682689886367200540'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/blog-post_2928.html' title='Страшная сила кривых рук'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4796532938524509408</id><published>2008-05-19T09:41:00.002+04:00</published><updated>2008-05-19T10:13:28.707+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Не зьим, так понадкусываю...</title><content type='html'>Примерно так можно кратко выразить суть очередного &lt;a href="http://www.microsoft.com/presspass/press/2008/may08/05-18statement.mspx?rss_fdn=Press%20Releases"&gt;заявления Microsoft относительно Yahoo!&lt;/a&gt;.&lt;br /&gt;Microsoft продолжает игру в кошки мышки с Yahoo После отзыва своего предыдущего предложения по поглощению, и последовавшего за ним 15% падения акций Yahoo!, Microsoft вновь возвратилась к теме.  &lt;br /&gt;&lt;br /&gt;Теперь речь идет не о полном поглощении, а возможно, о частичном. Впрочем, Microsoft вполне может снова захотеть съесть Yahoo! целиком, о чем прозрачно намекается в сообщении. &lt;br /&gt;&lt;br /&gt;Скорее всего так и будет. Уж очень серьезные ставки в игре. И речь не столько о рынке online рекламы. Основной доход Microsoft получает с десктоп приложений (Windows + Office), а бурное развитие online альтернатив десктопным приложениям представляют серьезную угрозу. Если MS Office занимает что-то около 90% процентов своего сегмента рынка, то платформа Windows Live далеко не на первых ролях. Поэтому надо любыми средствами скупать площадки online сервисов и их аудиторию. &lt;br /&gt;&lt;br /&gt;Вдруг действительно эти чертовы online applications выстрелят? Станет тогда Microsoft заурядным производителем браузера, БД и сервера приложений, каких сотни. А что мы тогда будем делать? Кто же тогда будет Большим братом, и будет "во всем виноват"? Компания на букву G?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4796532938524509408?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4796532938524509408/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4796532938524509408' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4796532938524509408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4796532938524509408'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/blog-post_19.html' title='Не зьим, так понадкусываю...'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-26398436661550679</id><published>2008-05-15T09:37:00.002+04:00</published><updated>2008-05-15T09:43:24.096+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><title type='text'>Entity Framework Breaking Changes. On beta 3 к SP1</title><content type='html'>В &lt;a href="http://blogs.msdn.com/adonet/"&gt;ADO.NET team blog&lt;/a&gt; опубликован &lt;a href="http://blogs.msdn.com/adonet/pages/entity-framework-breaking-changes-visual-studio-2008-net-3-5-sp1-beta.aspx"&gt;"Entity Framework Breaking Changes - Visual Studio 2008 &amp; .NET 3.5 SP1 Beta"&lt;/a&gt; список изменений, так сказать, не совместимых с жизнью в Entity Framework по сравнению с beta3.&lt;br /&gt;Я надеюсь, что никто не заюзал EF beta 3 в своих проектах. Иначе я им не завидую.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-26398436661550679?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/26398436661550679/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=26398436661550679' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/26398436661550679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/26398436661550679'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/entity-framework-breaking-changes-on.html' title='Entity Framework Breaking Changes. On beta 3 к SP1'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-1311225762762454431</id><published>2008-05-13T22:26:00.002+04:00</published><updated>2008-05-13T22:40:13.917+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Симпатичный гаджет</title><content type='html'>я себе на блог урвал. Висит справа внизу на сайдбаре и называется "Поиск по блогу от Quintura". На нем очень симпатично разбегаются и собираются в кучки ключевые слова. Оказывается самое употребляемое мною слово, это "система". Я подозревал что сильно "системлю", но слава богу что не "концептуально" жирным шрифтом вылезло. &lt;br /&gt;Чтоб заполучить такую штучку от &lt;a href="http://www.quintura.ru/"&gt;Quintura&lt;/a&gt; пришлось повозиться, и пройти все круги их &lt;a href="http://affiliates.quintura.com/partners/?lang=ru"&gt;афилатной программы&lt;/a&gt;.  Потом Gmail отправил их письмо в спам (наверное нутром учуял конкурентов). Но все закончилось благополучно, и теперь я счастливый обладатель эксклюзивного гаджета. &lt;br /&gt;&lt;br /&gt;P.S. Только не спрашивайте зачем мне два поиска по блогу...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-1311225762762454431?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/1311225762762454431/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=1311225762762454431' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1311225762762454431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1311225762762454431'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/blog-post_13.html' title='Симпатичный гаджет'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-3112878717918358052</id><published>2008-05-13T09:53:00.003+04:00</published><updated>2008-05-13T12:28:37.548+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Visual Studio 2008 SP1 Beta &amp; .NET 3.5 SP1 Beta</title><content type='html'>Вышла бета первого сервиспака VS2008, которая интересна прежде всего тем, что в ее состав включили долгожданный ADO.NET Entity Framework. &lt;br /&gt;Также в состав сервиспака включены пакеты ADO.NET Data Services, ASP.NET Dynamic Data и ряд улучшений для поддержки новых фич SQL Server 2008.     &lt;br /&gt;К сожалению в сервиспак не вошел ASP.NET MVC Framework.&lt;br /&gt; &lt;br /&gt;Ссылка для скачивания &lt;a href="http://msdn.microsoft.com/en-us/vstudio/cc533448.aspx"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;P.S. Почитал &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/05/12/visual-studio-2008-and-net-framework-3-5-service-pack-1-beta.aspx"&gt;Скота Гу&lt;/a&gt;. Все таки кое какие куски от ASP.NET MVC Framework попали в этот сервиспак. В частности ASP.NET Routing Engine (System.Web.Routing)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-3112878717918358052?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/3112878717918358052/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=3112878717918358052' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3112878717918358052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3112878717918358052'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/visual-studio-2008-sp1-beta-net-35-sp1.html' title='Visual Studio 2008 SP1 Beta &amp; .NET 3.5 SP1 Beta'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4545048038848233818</id><published>2008-05-12T15:54:00.004+04:00</published><updated>2008-05-12T16:36:46.756+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Велосипедофобия</title><content type='html'>&lt;div align="right"&gt;"Все мосты через преграды, переброшены без нас" (с) В.Высоцкий&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Толкаясь на форумах начал замечать у разработчиков признаки надвигающейся эпидемии этакой "велосипедофобии". Спрашивает человек "Хочу реализовать логирование так-то и так...", а ему в ответ "Зачем изобретать велосипед!!! Есть log4net...", "Чукча не читатель. Чукча писатель. Опять велосипед изобретаешь...". Пишет другой человек статью о способах реализации Persistent Object, а ему в комментах: "Зачем это все надо! Кругом полно ORM-ов выбирай на вкус...". С ORM вообще тяжко стало. Похоже что проектировать свой ORM считается отменной ересью и признаком глубокой задвинутости. &lt;br /&gt;&lt;br /&gt;Можно сказать мне повезло, я работал в команде, которая разрабатывала серьезный ORM движок еще в те времена, когда среди дотнетчиков эту аббревиатуру мало кто знал. Да и потом, я еще успел спроектировать пару ORM-чиков попроще, для нужд конкретных проектов. Отличная практика проектирования, скажу вам я. Такого клубка взаимосвязанных и противоречивых требований мало где найдешь. Но похоже следующие поколения разработчиков будет лишено такого удовольствия из-за страха перед изобретением велосипеда. &lt;br /&gt;&lt;br /&gt;И совершенно напрасно. Иногда хороший велосипед гораздо полезнее десятка плохо состыкованных шестнадцати-колесных универсальных трейлеров. &lt;br /&gt;Даже у самых лучших фреймворков всегда остаются их врожденные проблемы:&lt;br /&gt; - избыточность / недостаточность функционала для конкретной задачи&lt;br /&gt; - недостаточное соответствие конкретным требованиям&lt;br /&gt; - сложность интеграции с другими фрэймворками&lt;br /&gt; - проблемы с поддержкой и внесением изменений&lt;br /&gt;Иначе уже давно был бы создан мегафреймворк на все случаи жизни, и большинство из нас остались без работы.&lt;br /&gt; &lt;br /&gt;И в заключение цитата из статьи Тода Хоффа (Todd Hoff) &lt;a href="http://highscalability.com/scaling-twitter-making-twitter-10000-percent-faster"&gt;"Scaling Twitter: Making Twitter 10000 Percent Faster"&lt;/a&gt;. Один из уроков, вынесенных в процессе масштабирования Twitter-а:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Build it yourself. Twitter spent a lot of time trying other people's solutions that just almost seemed to work, but not quite. It's better to build some things yourself so you at least have some control and you can build in the features you need.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;"Делайте это сами. Twitter потратил кучу времени, испробуя казалось бы вполне работоспособные решения, сделанные другими, и все в пустую. Гораздо лучше сделать некоторые вещи самостоятельно, так что вы, как минимум, сможете иметь над ними полный контроль и встраивать новые фичи по мере необходимости". (с) Todd Hoff  &lt;br /&gt;&lt;br /&gt;P.S. На Тода Хофа наткнулся посредством вот этого блога &lt;a href="http://www.insight-it.ru/"&gt;Insight-it&lt;/a&gt;. Тематика, в основном, архитектура web приложений. Занимательно. Рекомендую.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4545048038848233818?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4545048038848233818/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4545048038848233818' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4545048038848233818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4545048038848233818'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/blog-post.html' title='Велосипедофобия'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-1700060223235236594</id><published>2008-05-08T21:29:00.003+04:00</published><updated>2008-05-08T22:01:27.595+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Как индусы Northwind поломали</title><content type='html'>Не волнуйтесь, Northwind починен и доступен для загрузки. Об этом сообщает OakLeaf Systems blog: "&lt;a href="http://oakleafblog.blogspot.com/2008/05/upgraded-northwindsdf-file-for-ssce-v35.html"&gt;Upgraded Northwind.sdf File for SSCE v3.5 Available for Download&lt;/a&gt;"&lt;br /&gt;&lt;br /&gt;Мелочь, конечно, но интересно другое, а именно то, как об этом пишут:&lt;br /&gt;&lt;blockquote&gt;"Microsoft &lt;strong&gt;India's&lt;/strong&gt; Northwind.sdf sample database file for SQL Server Compact [Edition] (SSCE) v3.5 that ships with Visual Studio 2008 has a defect: Its column names and two foreign-key constraints (Order DetailsFK00 and Order DetailsFK01) contain spaces. As far as I can determine, this is the first sample database from Microsoft since Access 2.0's Northwind.mdb to have spaces in column names."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;И далее:&lt;br /&gt;&lt;blockquote&gt;"It might be acceptable to include spaces in column and constraint names in Bangalore but it's not considered a good database design practice in western countries."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Вот так вот :) Тут надо сделать небольшое пояснение. В конце ноября я &lt;a href="http://stump-workshop.blogspot.com/2007/11/windows.html"&gt;писал&lt;/a&gt; о том, что Microsoft, до сих пор неохотно продвигавшая свои производственные подразделения за пределы США, наконец не устояла и двинула свои офисы в Бангалор. Первыми ласточками стали подразделения User Feedback, Product Download и центр тестирования. С первыми результатами работы этих подразделений мы и имеем теперь дело. Исключительно резкий тон комментариев свидетельствует о том, и сам перенос подразделений в Бангалор и результаты их работы многим не по нраву. &lt;br /&gt;Косячат впрочем не только в Бангалоре. Из-за пробелов в названиях колонок и констрэйнтов в Entity Framework вылетает 5 рантаймов, ну а дизанер того же EF beta 3 полностью валит 2008 студию если получает на вход невалидный XML. Но ошибки Редмонта не вызывают таких резких коментов :)&lt;br /&gt;Впрочем, лучшие умы "народов запада" уже пофиксили священный Northwind и он доступен для скачивания (ссылочка в оригинальном посте).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-1700060223235236594?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/1700060223235236594/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=1700060223235236594' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1700060223235236594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1700060223235236594'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/northwind.html' title='Как индусы Northwind поломали'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4759603478370892649</id><published>2008-05-08T10:03:00.003+04:00</published><updated>2008-05-08T11:56:08.002+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Печальный конец Borland-а</title><content type='html'>&lt;a href="http://www.borland.com/"&gt;Borland&lt;/a&gt; &lt;a href="http://www.news.com/8301-10784_3-9937966-7.html?tag=nefd.top"&gt;продает&lt;/a&gt; &lt;a href="http://www.codegear.com/"&gt;CodeGear&lt;/a&gt; (свое подразделение по разработке development tools) компании &lt;a href="http://www.embarcadero.com/"&gt;Embarcadero Technologies&lt;/a&gt; (известной своими средствами управления СУБД) за смешные деньги - $23 млн.&lt;br /&gt;Вот такой бесславный конец легендарного для многих программистов брэнда. В самом Borland теперь остаются продукты проектного управления (Caliber, Together, Silk) и пара серверов приложений Borland AppServer на J2EE и Borland VisiBroker на полумертвой CORBA. Ничего особенного, таких продуктов десятки на рынке. &lt;br /&gt; &lt;br /&gt;Если бы существовала &lt;a href="http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%BC%D0%B8%D1%8F_%D0%94%D0%B0%D1%80%D0%B2%D0%B8%D0%BD%D0%B0"&gt;Дарвиновская премия&lt;/a&gt; в области бизнеса, то ее смело можно вручить Borland. &lt;em&gt;Эта компания просто удивительный клубок выдающихся инженерных достижений и не менее выдающихся управленческих провалов&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;С именем Borland связаны названия огромного числа выдающихся продуктов: Turbo Pascal, Turbo C, ObjectVision, Paradox, dBase, InterBase, Quattro Pro, Delphi. &lt;br /&gt;В свое время Borland занимал доминирующее положение на рынке средств разработки и "настольных" БД. Все это сопровождалось чехардой поглощений и продаж, и как следствие, упущенных возможностей. &lt;br /&gt;В 1991 Borland покупает компанию  Ashton-Tate - создателя dBase, первой БД для персональных компьютеров. С dBase списаны все последующие настольные БД FoxBase, Clipper, Access и т.д. В руках компании оказываются две замечательных настольных БД: Paradox и dBase. И тем не меннее компания теряет этот рынок, который достался FoxPro, Access и Clipper-у.&lt;br /&gt;&lt;br /&gt;Показательно, что постоянно лучшие инженеры покидают Borland и затем создают выдающиеся продукты. &lt;br /&gt;Niels Jensen уходит из Borland и в последствии создает &lt;a href="http://en.wikipedia.org/wiki/Clarion_programming_language"&gt;Clarion&lt;/a&gt;, очень самобытный продукт, кторый существует и поныне.&lt;br /&gt;Adam Bosworth уходит в 1990 году в Microsoft и там создает Microsoft Access. &lt;br /&gt;И, наконец, Anders Hejlsberg, создатель Delphi (Visual Basic Killer  - так хотели назвать его создатели), покидает Borland в 1996 и в Microsoft становится одним из создателей языка C# и платформы .Net.&lt;br /&gt;&lt;br /&gt;Еще можно вспомнить бесславную эпопею с переименованием Borland в Inprise и обратно, заигрывание с CORBA, эпопею с InterBase и Firebird. В сухом остатке после всех этих перепетий два не шибко популярных сервера приложений и потеря долей рынков IDE и DB.&lt;br /&gt;&lt;br /&gt;Похоже, что 7 мая закончился период полураспада компании. Borland уходит в историю.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4759603478370892649?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4759603478370892649/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4759603478370892649' title='Комментарии: 19'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4759603478370892649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4759603478370892649'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/borland.html' title='Печальный конец Borland-а'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-7456250409867022747</id><published>2008-05-02T18:59:00.003+04:00</published><updated>2008-05-02T19:24:24.723+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>CMM как инструмент колониализма</title><content type='html'>Любопытное и весьма симптоматичное высказывание &lt;a href="http://www.yourdon.com/?loc=aboutme"&gt;Эдварда Йордона&lt;/a&gt; в его &lt;a href="http://www.yourdonreport.com/index.php/2008/04/28/visiting-russia/"&gt;отчете о визите в Россию&lt;/a&gt; по поводу распространения CMM у нас:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Also, I was surprised by the number of people in my presentations who said their software organization had received an SEI-CMM “Capability Maturity Model” assessment, and even more surprised by the number of people who said their IT organization had achieved level-3, level-4, or even level-5. It’s not as high as one might expect in India, but significantly higher than what I’ve seen in the U.S".&lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;Йордон удивлен тем, как много CMM сертифицированных компаний в России, не так много как, допустим, в Индии, но гораздо больше чем в США. &lt;br /&gt;Т.е в самой метрополии CMM никому не нужен. А вот для стран третьего мира, это весьма ценный инструмент, который позволяет среднему американскому менеджеру удостовериться, что эти аборигены знают с какой стороны подходить к компьютеру, и им можно отдавать в офшор свой драгоценный бизнес.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-7456250409867022747?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/7456250409867022747/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=7456250409867022747' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7456250409867022747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7456250409867022747'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/05/cmm.html' title='CMM как инструмент колониализма'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-374624669083994883</id><published>2008-04-29T09:47:00.002+04:00</published><updated>2008-04-29T10:03:52.039+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Бардак, он везде бардак</title><content type='html'>Я с интересом читаю блог &lt;a href="http://blogs.sun.com/jonathan_ru/"&gt;Джонатана Шварца&lt;/a&gt; (Chief Executive Officer and President&lt;br /&gt;Sun Microsystems, Inc.) Несмотря на его достаточно очевидную маркетинговую составляющую, в нем проглядывает простая человеческая непосредственность (ну или может искусно имитируется). &lt;br /&gt;Последний пост называется &lt;a href="http://blogs.sun.com/jonathan_ru/entry/%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC_%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D1%83"&gt;"Выбираем свободу"&lt;/a&gt; и суть его в том, что на одной официальной встрече Джонатан спрашивает одного большого CTO большой Компании, "а вы используете MySQL?" (Sun купила MySQL? так что он не просто так это спрашивает :). На что большой CTO отвечает: "Конечно нет. Мы используем другую известную и дорогую СУБД". А CISO добавляет: "Мы не можем использовать какой-то там левый MySQL, потому что мы очень серьезная контора!". &lt;br /&gt;И тут оказывается, что разработчики этой большой и серьезной конторы вовсю используют MySQL, и только большие начальники об этом ничего не знают. &lt;br /&gt;Тут Джонатан начинает рассуждать о том как важна свобода, и поэтому Sun это здорово. &lt;br /&gt;А я подумал что бардак, он и в Америке бардак. А CTO и CISO что у них, что у нас предпочитают надувать от важности щеки вместо того, чтобы заниматься делом.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-374624669083994883?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/374624669083994883/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=374624669083994883' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/374624669083994883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/374624669083994883'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/blog-post_29.html' title='Бардак, он везде бардак'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4879166937444610958</id><published>2008-04-23T11:37:00.003+04:00</published><updated>2008-04-23T12:11:19.540+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Опросы'/><title type='text'>Результаты опроса "В разработке какого типа ПО вы участвуете".</title><content type='html'>Опрос проводился с течении недели. В нем приняло участие 105 человек, из них 103 занимаются разработкой софта. &lt;br /&gt;Разработкой софта на заказ занимаются 41 чел.&lt;br /&gt;Примерно равное количество респондентов занимаются коробочным софтом и разработкой для Интернета (22 и 20 чел соответственно).&lt;br /&gt;Внутренней автоматизацией заняты 10 чел.&lt;br /&gt;Самым интересным для программистов - разработкой средств разработки, и инфраструктуры занимаются четверо человек.&lt;br /&gt;&lt;br /&gt;В виде пирога это все выглядит вот так:&lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=370x100&amp;chd=t:15,41,22,20,4&amp;cht=p3&amp;amp;chl=internal dev 15%|custom soft 39%|off-the shelf soft 20%|internet soft 19%|tools 3%&amp;chco=008800" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;В общем довольно странные и неожиданные результаты, которые вероятно следует объяснить спецификой аудитории этого блога. Дело в том, что сам я в последнее время занимаюсь разработкой заказного софта, и  это естественно отражается на тематике блога, и привлекает определенную аудиторию. LAMP разработчикам здесь не интересно, равно как и 1С программистам. &lt;br /&gt;Потому что по моим оценкам, самая многочисленная группа программистов, это те, кто занимается внутренней автоматизацией в десятках тысяч фирм, контор, фабрик и заводов. А следующие по распространенности, по моему, должны быть сайтостроители. За ними оффшорники, вроде меня :). Затем те, кто делает коробочное ПО (+ игры). Ну и системщиков - инструментальщиков никак не больше чем один из ста.&lt;br /&gt;&lt;br /&gt;Интересно, есть ли где ни будь более объективная статистика на этот счет?      &lt;br /&gt;&lt;br /&gt;P.S. Зеленый пирог испечен при помощи &lt;a href="http://code.google.com/apis/chart/"&gt;Google Chart API&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4879166937444610958?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4879166937444610958/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4879166937444610958' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4879166937444610958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4879166937444610958'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/blog-post_23.html' title='Результаты опроса &quot;В разработке какого типа ПО вы участвуете&quot;.'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-5150998940681058174</id><published>2008-04-16T22:38:00.004+04:00</published><updated>2008-04-16T23:06:11.860+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Версионный контроль кода в Agile</title><content type='html'>Интересная статья Хенрика Кнайберга (Henrik Kniberg) &lt;a href="http://www.infoq.com/articles/agile-version-control"&gt;Version Control for Multiple Agile Teams&lt;/a&gt; на InfoQ.com&lt;br /&gt;&lt;br /&gt;Версионный контроль традиционно является одной из самых запутанных, я бы даже сказал, запущенных практик. Причем энтузиасты склонны все чрезмерно усложнять (встречаются аццкие конструкции из транков, брэнчей, бэйслайнов, где без поллитра ни за что не разберешься), а прагматики  - все упрощать. &lt;br /&gt;&lt;br /&gt;Для Agile обычно характерно достаточно утилитарное отношение к версионному контролю. Команда небольшая, продукт постоянно в рабочем состоянии, постоянно совершенствуется, поэтому все постоянно работают в одной ветке (в транке). Но не всегда все так просто. &lt;br /&gt;&lt;br /&gt;Как работать с версионным контролем когда на проекте несколько Agile команд? Как избежать хаоса при этом? Для чего делать брэнчи для релизов? Каких политик придерживаться при обновлении брэнчей?  Как поддерживать код в транке в рабочем состоянии? Про все это и много другое Хенрик рассказывает просто и ясно, без фанатизма, по скандинавски :)&lt;br /&gt;Есть и картинки, которыми истинные аджайлисты любят обклеивать стены офиса. Наподобие этой:&lt;br /&gt;&lt;a href="http://www.infoq.com/resource/articles/agile-version-control/en/resources/part1.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://www.infoq.com/resource/articles/agile-version-control/en/resources/part1.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В общем, рекомендую почитать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-5150998940681058174?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/5150998940681058174/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=5150998940681058174' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5150998940681058174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5150998940681058174'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/agile.html' title='Версионный контроль кода в Agile'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-3055095107740303741</id><published>2008-04-16T20:45:00.001+04:00</published><updated>2008-04-17T10:12:44.012+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Статьи'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Образование и IT. Образование или IT?</title><content type='html'>Интересная статья в PCWeek профессора Шалыто &lt;a href="http://www.pcweek.ru/themes/detail.php?ID=108777"&gt;"Сохраним в университетах лучших"&lt;/a&gt; на тему подготовки специалистов для IT вызвала довольно оживленную дискуссию. &lt;br /&gt;Автор утверждает:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"...самые лучшие (выдающиеся) студенты и выпускники должны иметь материальную возможность работать не у вас в промышленности, а нас в вузах (если у них, конечно, есть такое желание)!"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Дальше я пояснил, что взяв на работу лучшего, компания получает конкурентные преимущества, а отрасль почти наверняка этого человека теряет, если человек этот, как, например, Дж. Гослинг, не предложит что-то очень важное для человечества в целом. Оказавшись же в университете на преподавательской работе, он может нести “доброе и вечное” другим сильным студентам, которые как раз и пойдут работать к вам в промышленность."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Суперталантливым молодым людям, по моему мнению, нельзя идти в крупные компании, так как в большинстве случаев они для отрасли даже не исчезнут, а можно сказать, просто аннигилируют."  &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Именно эти высказывания и вызвали наиболее жаркую полемику. Мне конечно не подняться в своих рассуждениях до анализа проблемм образования в целом, но &lt;strong&gt;с автором я не согласен&lt;/strong&gt;. &lt;br /&gt;Кафедра профессора Шалыто известна подготовкой призеров международных олимпиад по программированию. Это здорово, нужно, очень престижно и заслуживает всяческой поддержки на государственном уровне. Но к потребностям IT индустрии все это имеет мало отношения. &lt;br /&gt;&lt;br /&gt;Лучшие должны оставаться в университетах, чтобы готовить еще более лучших. Такая замкнутая экосистема может хороша для университетов, но для отрасли она просто пагубна. Проблема обучения программистов сегодня в том, что обучение оторвано от реальных потребностей рынка, и такой подход только увеличит разрыв. &lt;br /&gt;&lt;br /&gt;Действительно, уровень выпускников периферийных ВУЗов откровенно слабый из-за слабого преподавания, и тут надо что-то делать. В элитных университетах (МГУ, МФТИ, СПбГУ) дают хорошую системную, математическую и алгоритмическую подготовку, но нигде не дают нормальных знаний того, что относится к &lt;strong&gt;технологии программной инженерии&lt;/strong&gt;. Все знают, что выпускники превращаются в хороших специалистов лишь через два, три года работы в реальных проектах.  &lt;br /&gt;&lt;br /&gt;Посмотрите на программы обучения на факультете &lt;a href="http://www.cs.msu.su/jetspeed/portal"&gt;ВМиК&lt;/a&gt; МГУ. Я был поражен, когда среди "конструирования компиляторов", "численных методов" и "математических основ криптологии" встретил там курс "Методология внедрения информационных систем". Воистину гора пошла навстречу Магомету, в МГУ программистов учат не только программировать но и внедрять свои программы! Сможет ли читать курс "методология внедрения информационных систем" человек, который со студенческой скамьи сразу перешел за преподавательскую кафедру. Чтобы рассказывать без нервного срыва и матерного слова о внедрении информационных систем, надо отдать этому делу несколько лет жизни.&lt;br /&gt;&lt;br /&gt;Действительно, лучшие должны идти в образование. Но не оставаться там после обучения, &lt;strong&gt;а возвращаться туда, набравшись практического опыта&lt;/strong&gt;. Именно так происходит в США, где венцом карьеры для software engineer является если не директорский пост в технологической компании, то профессорская кафедра в престижном университете.  &lt;br /&gt;&lt;br /&gt;Суперталанты не аннигилируют в индустрии. Тот же Гослинг и его команда пришли к созданию Java долгим и извилистым путем анализа реальных потребностей рынка, а не в тиши университетских лабораторий.&lt;br /&gt;Специфика IT сегодня такова, что зачастую самые мощные инновации и исследования возникают вовсе не в университетах, а в индустрии, в последовательных центрах крупных корпораций и в маленьких стартапах. Это факт, и особенно актуально это для России. У нас нет инновационных учебных центров в области IT наподобие Университета Карнеги-Меллона или МТИ.   &lt;br /&gt;&lt;br /&gt;Наладить положительную обратную связь между индустрией и университетами для передачи инноваций и опыта, вот что необходимо. Что может подвигнуть успешных профессионалов заняться преподаванием? Деньги? Вряд ли, хотя без них тоже никак, успешный профессионал стоит дорого.  Престиж, общественное признание? Пожалуй. И конечно, целенаправленные партнерские усилия компаний и университетов в области обучения. Пока на этом поприще замечены в основном крупные западные компании: Google, Microsoft, IBM. Они готовы инвестировать в обучение. Российские компании, если и рассматривают варианты партнерских отношений с учебными заведении, то в основном с позиций извлечения выгоды (продавать учебные курсы, "покупать" выпускников подешевле, поднатаскав их предварительно). Ну, видимо не созрели еще...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-3055095107740303741?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/3055095107740303741/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=3055095107740303741' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3055095107740303741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3055095107740303741'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/it-it.html' title='Образование и IT. Образование или IT?'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-7467441833135656902</id><published>2008-04-15T09:29:00.003+04:00</published><updated>2008-04-15T09:48:50.765+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Хорошие истории</title><content type='html'>Ну до чего же американцы любят звучные акронимы! Kelly Waters в своем &lt;a href="http://kw-agiledevelopment.blogspot.com/"&gt;блоге&lt;/a&gt; пишет: &lt;a href="http://kw-agiledevelopment.blogspot.com/2008/03/invest-in-good-user-stories_11.html"&gt;"*Invest* in Good User Stories"&lt;/a&gt;&lt;br /&gt;Нет, это не призыв инвестировать деньги в хорошие истории. INVEST это сокращенное  Independent, Negotiable, Valuable, Estimable, Small, Testable - такими качествами должны обладать хорошие user story. И далее в шести небольших постах с картинками (так, Negotiable иллюстрирует огромная задумчивая горилла) Келли объясняет все эти качества.&lt;br /&gt;Можно было бы добавить, что хорошие user story должны быть непротиворечивыми, полными и, как это сказать, user friendly, что-ли... Но тогда не получится красивое слово из первых букв. Но все равно - рекомендую почитать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-7467441833135656902?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/7467441833135656902/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=7467441833135656902' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7467441833135656902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7467441833135656902'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/blog-post_15.html' title='Хорошие истории'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-1513417221728599059</id><published>2008-04-14T08:38:00.001+04:00</published><updated>2008-08-02T23:32:30.421+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>Коллективное владение кодом</title><content type='html'>Сегодня с утра вы увидели что билд вашего проекта не собирается. В модуле логгирования кто-то изменил сигнатуру метода и теперь компилятор выдает 286 ошибок. &lt;br /&gt;&lt;br /&gt;На прошлой неделе вы исправляли баг. Оказалось, что его причина в неправильном порядке инициализации интерфейсов в другом модуле. Вы попросили программиста, который отвечает за этот модуль внести нужные изменения, и до сих пор ждете, когда он это сделает. &lt;br /&gt;&lt;br /&gt;Знакомая картина, не правда ли? Если ваш проект достаточно велик, чтобы на нем работало более двух программистов, то подобные проблемы возникают постоянно и воспринимаются как обыденные и неизбежные. Причина их в политике владения кодом (code ownership), точнее в политике персонального владения кодом. &lt;br /&gt;&lt;br /&gt;Такая политика весьма распространена и по большей части складывается стихийно. Проводники этой политики - менеджеры проектов. Менеджер распределяет задачи между программистами. Менеджер хочет чтобы ресурсы на проекте использовались с максимальной эффективностью (если кто не в теме, для менеджера ресурсы на проекте - это люди), поэтому он старается разбить систему на блоки (вертикально, по функциональным признакам, или горизонтально по структурным) и закрепить эти блоки за конкретными программистами. Работая над одним и тем же блоком, программист будет работать быстрее, потому что ему не надо постоянно разбираться с чужим кодом. Так думает менеджер, &lt;strong&gt;и он ошибается&lt;/strong&gt;. &lt;br /&gt;Политика персонального владения кодом возводит в разрабатываемой системе барьеры, там где их не должно быть. Барьеры, для которых нет никаких причин, ни функциональных, ни системных, кроме причин чисто субъективных, психологических и организационных. Потери времени на преодоление этих барьеров многократно  превышают полученный выигрыш. Но если бы терялось только время... Часто бывает, что устав ожидать пока программист сделает нужные изменения в "своем" коде, другой разработчик дублирует этот код в "своем" модуле, разрушая тем самым структуру и целостность системы. &lt;br /&gt;&lt;br /&gt;Избежать подобных проблем помогает политика "коллективного владения кодом", которая зародилась в недрах методологии XP. Как и все, что пришло из XP, коллективное владение кодом поначалу вызывает недоумение. Вот довольно типичная реакция: &lt;br /&gt;&lt;blockquote&gt;"Ну не может такого быть, например, при разработке фреймворка, что каждый член команды мог править код каждого. То есть вот так пришел человек в проект — взял и изменил определение интерфейса под себя, а другой под себя — в итоге код просто расползется. Все-равно у каждого куска кода будет неформальный владелец, а остальные, максимум, будут править в нем какие-то банальные ошибки".&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Тем не менее, коллективное владение кодом не только не приводит к хаосу в разработке, но и помогает решить многие проблемы в разработке. Потому что, как обычно в XP, за парадоксальным названием стоят весьма прагматичные правила и принципы. Давайте разберемся какие.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Каждый программист имеет &lt;strong&gt;право вносить изменения в любую часть кода&lt;/strong&gt; системы.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;При этом каждый программист &lt;strong&gt;несет ответственность за весь код&lt;/strong&gt; системы.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Изменяя код в одном месте, программист обязан внести соответствующие изменения во всех остальных частях системы, чтобы обеспечить собираемость и правильное функционирование.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Если изменения, вносимые в код, нарушают целостность системы и вступают в противоречие с кодом других частей системы, программист не должен вносить такие изменения. Прежде необходимо обсудить проблему с коллегами и найти приемлемое решение.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;В общем все довольно просто: если что-то меняешь твоя обязанность сделать так, чтобы ничего не сломалось. Если ты не можешь этого добиться - не меняй, сначала обсуди с коллегами. &lt;br /&gt;&lt;br /&gt;Какие плюсы дает политика коллективного владения кодом:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Меньше временные издержки и выше скорость разработки. Программисту не надо просить другого программиста внести нужные ему изменения или исправить ошибку, а после этого ждать пока другой программист выполнит его просьбу.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Большая устойчивость кода. Программист который вносит изменения в код должен добиться собираемости всей системы. Если его изменения затрагивают другие части системы, он вносит туда изменения самостоятельно, а не оставляет эту работу другим программистам (в это время система не собираема). Если изменения рушат какую-то часть системы или противоречат дизайну другой части системы, программист узнает об этом сразу, а не спустя некоторое время.&lt;/li&gt; &lt;br /&gt;&lt;li&gt; Более высокое качество кода. Программисты в процессе работы просматривают код, написанный другими программистами. Меньше посторяющихся кусков кода. Отсутствует ситуация когда программисту проще скопировать "чужой" кусок кода и самому внести в него изменения, чем дождаться пока нужные изменения сделает владелец кода.&lt;/li&gt; &lt;br /&gt;&lt;li&gt; Лучшие коммуникации. Каждый программист более менее хорошо знает всю систему. Нет таких ситуаций, когда из команды уходит программист и никто не знает что делать с частью системы, которую он писал. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Как видим плюсы не исчерпываются избежанием конфликтов и сокращением потерь времени. Политика хорошо влияет и на качество кода и на архитектуру системы, а также снижает риски связанные с уходом программиста с проекта. &lt;br /&gt;&lt;br /&gt;Политику коллективного владения кодом можно применять не только в проектах выполняемых по методологиям XP или Agile. Важно только понимать, что она не будет работать без определенного набора "поддерживающих" практик:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Должна использоваться система контроля версий исходного кода.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Должна практиковаться непрерывная интеграция (разработчик не сидит неделями в своем коде, а сбрасывает свои изменения в репозиторий после завершения каждой микро-задачи) и регулярные автоматизированные сборки проекта.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Должны быть модульные тесты.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;  &lt;br /&gt;Это необходимый минимум, без которого у вас не получится практиковать коллективное владение кодом на проекте. &lt;br /&gt;&lt;br /&gt;Есть еще один момент. На больших проектах, где более 10 разработчиков, становится тяжело ориентироваться в большом объеме кода. В этом случае возможно выделение мини-групп разработчиков и закрепления за ними частей системы, с тем, чтобы внутри этих мини-групп практиковать коллективное владение кодом.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-1513417221728599059?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/1513417221728599059/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=1513417221728599059' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1513417221728599059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1513417221728599059'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/blog-post_14.html' title='Коллективное владение кодом'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-6250543040431934277</id><published>2008-04-10T14:36:00.002+04:00</published><updated>2008-04-10T14:40:51.086+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Опросы'/><title type='text'>Опрос - в разработке какого типа ПО вы участвуете.</title><content type='html'>Примерно год назад, я написал пост &lt;a href="http://stump-workshop.blogspot.com/2007/05/blog-post_06.html"&gt;«Золотой век русского программиста»&lt;/a&gt;, который, неожиданно для меня, привлек большое внимание и вызвал интересную дискуссию. Там речь шла о разработке ПО, и в частности о том, что в России в основном распространена разработка прикладного софта. Инфраструктурного софта разрабатывается мало, да и тот делают в основном под зонтиком западных компаний и по их заказам. Все это были по большей части мои личные наблюдения и предположения. &lt;br /&gt;&lt;br /&gt;С тех пор прошел год, а на Блогере  появилась возможность устраивать опросы. &lt;strong&gt;Так давайте посмотрим, разработка какого типа софта у нас наиболее распространена&lt;/strong&gt;. Если вы программист, архитектор, тестировщик, менеджер, аналитик - учавствуйте в опросе.&lt;br /&gt;&lt;br /&gt;Сразу предвидя вопросы по поводу критериев разделения на категории, объясняю. Для выделения категорий я выбрал особенности жизненного цикла ПО. Почему? Потому что особенности жизненного цикла более всего влияют на процесс разработки. Даже более чем языки, платформы и технологии.   Если языки и платформы влияют в основном на проектирование и кодирование (т.е. конструирование), то жизненный цикл влияет на все, на сбор требований, проектирование, тестирование, политику выпуска версий, поддержку, управление изменениями и т.д. и т.п.&lt;br /&gt;&lt;br /&gt;Почему нет пункта для тех, кто занимается не разработкой новых систем, а сидит на поддержке старых? Потому что поддержка тоже включает в себя разработкую На поддержке вы правите багги, добавляете новые фичи, проводите рефакторинг, и выпускаете новые релизы, сервиспакии патчи. Все как в «настоящей» разработке. Но согласитеть, поддержка интернет портала и офисного пакета  - это две большие разницы.&lt;br /&gt;&lt;br /&gt;Почему средства разработки и инфраструктура выделены в отдельный пункт? По идее, они попадают под определение «коробочное ПО», но есть один важный нюанс. Средства разработки и платформенное (инфраструктурное) ПО это не просто коробочный продукт, это инструмент создания такого феномена как «технологическое лидерство». Вокруг средств разработки формируются свои экосистемы в виде сообществ разработчиков, продуктов построенных на данной платформе, фирм производящий ПО и оказывающих услуги, и конечных потребителей. Классический пример  - Linux, который сам по себе ничего не стоит, но служит фундаментом на котором миллионы людей зарабатывают деньги разработкой, продажей и поддержкой своих продуктов.     &lt;br /&gt;&lt;br /&gt;Итак, вот описание категорий:        &lt;br /&gt;Внутренняя автоматизация - программа создается для использования внутри вашей компании.&lt;br /&gt;&lt;strong&gt;Заказное ПО&lt;/strong&gt; – программа создается для использования внутри другой  компании, по заказу которой вы ведете разработку. Это может быть ПО любого типа, важно что оно будет использоваться внутри одной конкретной компании и разрабатывается по их спецификациям.&lt;br /&gt;&lt;strong&gt;Коробочное ПО&lt;/strong&gt; – программа создается для широкого распространения, за  деньги или бесплатно, среди различных пользователей, частных лиц или компаний. В этот разряд попадают все программы, у которых нет конкретного заказчика: десктопные приложения, драйверы устройств и утилиты,  игры (в т.ч. и мобильные), офисное ПО, бизнес приложения (1С, Аксапта, Парус, прочие ERP, CRM, PLM, CAD/CAM системы).&lt;br /&gt;&lt;strong&gt;Интернет-приложения&lt;/strong&gt; – сайты, порталы, социальные сети и прочий Web 2.0, не зависимо от того, сделаны они на заказ, или для ведения бизнеса вашей компании (или вашего собственного бизнеса).&lt;br /&gt;&lt;strong&gt;Средства разработки и инфраструктура&lt;/strong&gt; – средства разработки, IDE, компиляторы, библиотеки, компоненты, базы данных, операционные системы, инфраструктурные сервисы, опять же, не зависимо от того, сделаны они на заказ, или для ведения бизнеса вашей компании.  &lt;br /&gt;&lt;strong&gt;Я только учусь &lt;/strong&gt;– но когда выучусь буду разрабатывать ПО.   &lt;br /&gt;&lt;strong&gt;Я не участвую в разработке ПО &lt;/strong&gt;– интересно, а как вы попали в этот блог? Можете отписать в комментах.  &lt;br /&gt;Голосуйте,  интересно будет посмотреть результаты. &lt;br /&gt;Свои частные мнения и предложения оставляйте в комментариях к данному посту.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-6250543040431934277?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/6250543040431934277/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=6250543040431934277' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6250543040431934277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6250543040431934277'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/blog-post_4345.html' title='Опрос - в разработке какого типа ПО вы участвуете.'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-2875851641431911694</id><published>2008-04-10T09:54:00.003+04:00</published><updated>2008-04-10T10:10:17.194+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Похоже, дождались.</title><content type='html'>&lt;div align="right"&gt;Но близок, близок миг победы.&lt;br /&gt;Ура! мы ломим; гнутся шведы.&lt;br /&gt;О славный час! о славный вид!&lt;br /&gt;Еще напор - и враг бежит.&lt;br /&gt;&lt;br /&gt;А.С.Пушкин "Полтава"&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Принято решение о выпуске релиза  Entity Framework (and the Entity Designer) вместе с ADO.NET Data Services &lt;strong&gt;в составе первого сервиспака к 2008 студии&lt;/strong&gt;.  Visual Studio 2008 and .NET 3.5 SP1. Об это &lt;a href="http://blogs.msdn.com/adonet/archive/2008/04/09/entity-framework-ado-net-data-services-to-ship-with-vs-2008-sp1-net-3-5-sp1.aspx"&gt;сегодня сообщила&lt;/a&gt; Elisa Flasko, Program Manager в блоге &lt;a href="http://blogs.msdn.com/adonet/"&gt;ADO.NET team&lt;/a&gt;.&lt;br /&gt;Однако дата выхода самого сервиспака еще не определена. Принимая во внимание довольно значительное количество багов, выявленных в 2008 студии, думаю, что MS не станет тянуть с выпуском SP1.&lt;br /&gt;Учитывая нелегкую историю создания этого продукта, многие до самого последнего момента сомневались в его выходе в свет. Похоже теперь это долгожданное событие наконец произойдет. Осталось немного подождать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-2875851641431911694?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/2875851641431911694/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=2875851641431911694' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2875851641431911694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2875851641431911694'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/blog-post_10.html' title='Похоже, дождались.'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-7084087591305163696</id><published>2008-04-04T14:09:00.002+04:00</published><updated>2008-04-04T14:15:52.602+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Да прибудет с вами святой Исидор. Аминь.</title><content type='html'>Сегодня &lt;a href="http://www.calend.ru/holidays/0/0/534/"&gt;День святого Исидора (покровителя Интернета)&lt;/a&gt;.&lt;br /&gt;&lt;blockquote&gt;Католический Cвятой Исидор Севильский (Isidore of Seville), епископ Севильский (560-636), получил известность не только благодаря своему благочестию, но и любви к наукам. Он автор одной из первых книг по этимологии, первым представил работы Аристотеля в Испании, был реформатором и человеком широких взглядов. &lt;br /&gt;&lt;br /&gt;Святой Исидор считается покровителем учеников и студентов, а в 1999 году папа Иоанн Павел II официально назвал святого Исидора покровителем пользователей компьютеров и Интернета. &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Даже не знаю, напиться что-ли в честь праздника?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-7084087591305163696?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/7084087591305163696/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=7084087591305163696' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7084087591305163696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/7084087591305163696'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/blog-post.html' title='Да прибудет с вами святой Исидор. Аминь.'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-1709011373891919654</id><published>2008-04-04T13:18:00.003+04:00</published><updated>2008-04-04T13:32:39.650+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Adobe Photoshop Express on-line</title><content type='html'>Adobe начала бета тестирование онлайн версии своего флагманского продукта Photoshop. Называется это все &lt;a href="https://www.photoshop.com/express/landing.html"&gt;"Adobe Photoshop Express"&lt;/a&gt;.&lt;br /&gt;Просто поразительно, сколько времени понадобилось Adobe, чтобы додуматься до простой идеи объединить возможности двух своих продуктов Flash и Photoshop. &lt;br /&gt;Получилось неплохо. Элементарные возможности редактирования изображений, хранимых в сети, при помощи flash в браузере. Там есть все что надо для придания фотографиям божеского вида. Такой-же набор возможностей редактирования есть, например, в Picasa. Так у меня с тех пор, как я стал пользоваться Пикасой, перевелись на компьютере все редакторы изображений. Мне, как непрофессионалу, хватает Paint-а и Picasa. &lt;br /&gt;Photoshop Express позволяет все это делать в браузере, правда только с фотографиями загруженными в сеть. Весьма удобно.        &lt;br /&gt;Мне одно непонятно. Как на этом Adobe деньги делать собирается? Может кто знает?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-1709011373891919654?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/1709011373891919654/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=1709011373891919654' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1709011373891919654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1709011373891919654'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/adobe-photoshop-express-on-line.html' title='Adobe Photoshop Express on-line'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-2188187994627415030</id><published>2008-04-02T22:04:00.005+04:00</published><updated>2008-08-02T23:32:30.421+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>Vision</title><content type='html'>&lt;div align="center"&gt;&lt;span style="font-size:130%;"&gt;или чем знимается разработчик во время анализа требований&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;В одном из последних постов &lt;a href="http://stump-workshop.blogspot.com/2008/03/100.html"&gt;"100% требований. Или "дьявол кроется в деталях"&lt;/a&gt; я писал о бессмысленности попыток собрать 100% требований к системе, и о том, как выкручиваться, когда тебя толкают на этот путь.&lt;br /&gt;&lt;br /&gt;Но с другой стороны, прежде чем преступить к работе, надо понять, что же мы собираемся сделать. В среде Agile, бытует мнение что подобной проблемы не существует. Что делать решает заказчик. Что скажет, то и сделаем. Это прискорбное заблуждение. Во первых, как сказал один мой уважаемый читатель, "Клиент никогда не знает точно, что ему надо". Во вторых пресловутый коммуникационный барьер, с которым борется Agile, еще никто до конца не поборол. Заказчик рассказывает вам, что он хочет, вы интерпретируете его рассказы с позиции своей не компетенции, все это искажает картину.&lt;br /&gt;&lt;br /&gt;Agile не отменяет анализ требований, он его усложняет. Усложняет тем, что не дает никакой внятной методики того, как это делать. Игра в планирование, из XP, это в большей степени планирование, чем анализ.&lt;br /&gt;&lt;br /&gt;Для начала работы нам надо иметь видение - vision. В разных проектных методиках есть документ с названием Vision, но для разработчика или проектировщика vision - это несколько иное. Для разработчика &lt;strong&gt;Vision - это целостное видение проблемы, и путей ее решения&lt;/strong&gt;. Заметьте, не будущей системы, а именно проблемы. Часто бывает ровно наоборот. Вспоминая, как начинались мои прошлые проекты, я всегда могу припомнить момент, когда менеджер или представитель заказчика говорил, "нам надо сделать систему..." и далее в одном предложении, что надо сделать. Это затравка. Молодой и неопытный разработчик клюет на нее как голодный карась, и уже через минуту он готов рассказать &lt;strong&gt;как&lt;/strong&gt; он все сделает. Так когда-то поступал и я, пока не стал ленивым и флегматичным :) В этот момент в голове разработчика создается устойчивый стереотип. Потом, когда выяснится истинная сущность проблемы, этот стереотип может сыграть с нами злую шутку. Это классический пример того, когда дизайн бежит впереди требований. Потому я и говорю, что vision - это прежде всего целостное видение &lt;strong&gt;проблемы&lt;/strong&gt;. Необходимо понять, суть автоматизируемого процесса, его смысл. Выделить сущности и их связи. Понять как будущая система улучшит процесс. В общем, обычный системный &lt;em&gt;анализ&lt;/em&gt;, описанный во всех книжках.&lt;br /&gt;&lt;br /&gt;Если вы можете описать заказчику сущность будущей системы в трех - пяти предложениях, значит у вас есть&lt;strong&gt;видение&lt;/strong&gt;. Запишите эту формулировку, она вам пригодится (например, хороший стиль - начинать с этой формулировки документы, описывающие архитектуру). Это уже &lt;em&gt;синтез&lt;/em&gt;, о котором нигде не пишут. На этом этапе вы &lt;em&gt;хорошо&lt;/em&gt; понимаете &lt;strong&gt;что&lt;/strong&gt; надо сделать, и &lt;em&gt;примерно &lt;/em&gt;понимаете&lt;strong&gt;, как&lt;/strong&gt; это сделать. По поводу "как" у вас может быть полная ясность в случае простого типового проекта, или большие сомнения, если проект сложный или уникальный. Но в любом случае, &lt;strong&gt;это отправная точка, с которой можно начинать разработку&lt;/strong&gt;. Заметьте, это далеко не 100% требований. Я затрудняюсь определить это число в процентах, может быть 20% (пресловутая пропорция 20/80), а может немного больше.&lt;br /&gt;&lt;br /&gt;Сторонники классических подходов могут возразить, что невозможно разрабатывать имея такую большую неопределенность в требованиях. Очень даже возможно, надо только подходить к разработке с головой.&lt;br /&gt;Возможно официально разработка еще не стартовала (да, да, с вас требуют определить 100% требований, либо имеет место другая административная волокита), но в вашей команде уже должна кипеть работа.&lt;br /&gt;Есть три типа активностей в разработке, которые можно выполнять на этом этапе (и совместить их с дальнейшим анализом требований).&lt;br /&gt;&lt;br /&gt;Первое, это прототипы. Как не странно, прототипы это мощное оружие для анализа требований в руках умелого разработчика. Прототипы делают для заказчика. Я подробно писал про прототипы &lt;a href="http://stump-workshop.blogspot.com/2007/01/blog-post_29.html"&gt;здесь&lt;/a&gt;, не буду повторяться. Добавлю лишь, что предпочитаю выбрасывать прототипы, а не выращивать из них готовую систему.&lt;br /&gt;&lt;br /&gt;Второе, это proof of concepts (или, по русски, доказательство реализуемости). Почти всегда, в образе будущей системы есть такие мутные места, что не понятно как это сделать, будет это работать или нет. Лично меня они более всего раздражают. Proof of concepts нужны, чтобы понять, можно реализовать ту или иную фичу, и как это сделать. Подобно прототипам, proof of concepts снижают неопределенность на этапе анализа, но мы пишем их не для заказчика, а для себя. Это не должен быть кусок будущей системы, вы должны проверять только принцип, делать все максимально абстрактно. Выполнять proof of concepts поручают лучшим разработчикам команды. Опять же, полученный код лучше выкинуть. Дело в том, что часто в этом коде не проверяются входные параметры, не обрабатываются исключения и т.д., т.е. не соблюдаются стандарты и соглашения, по понятным причинам. Так что проверили, и выкинули :)&lt;br /&gt;&lt;br /&gt;Третье, это инфраструктура. Часто с самого начала вполне ясны некоторые аспекты будущей системы. Например требования к авторизации, локализации, или к взаимодействию с другими системами. Такие инфраструктурные части требуют времени на разработку, но не видны пользователю. Если требования к ним достаточно ясны можно заняться разработкой этих компонентов.&lt;br /&gt;&lt;br /&gt;Вот так, итеративно дорабатывая прототип, устраняя сомнения по поводу реализуемости отдельных частей и создавая компоненты инфраструктуры, мы параллельно проясняем требования и детали будущей системы. В XP для этого есть термин нулевая итерация, в RUP это фаза Elaboration - анализа и проектирования (помните как на известном раповском графике в этой фазе нарастает активность выполнения :). Все эти активности плюс активное взаимодействие с заказчиком, а вовсе не груды Use Case и UML диаграмм, залог получения полных, достоверных и непротиворечивых требований. Впрочем, фиксировать требования тоже необходимо, но вовсе не для достижения просветления. Они вам потом понадобятся...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-2188187994627415030?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/2188187994627415030/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=2188187994627415030' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2188187994627415030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/2188187994627415030'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/vision.html' title='Vision'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-3453692307038438354</id><published>2008-04-01T20:17:00.003+04:00</published><updated>2008-04-01T20:31:09.750+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Google Cash - специально для россиян</title><content type='html'>&lt;a href="http://googlerussiablog.blogspot.com/2008/04/adwords.html"&gt;Google шутит&lt;/a&gt;. Если в прошлом году &lt;a href="http://stump-workshop.blogspot.com/2007/04/google.html"&gt;речь шла&lt;/a&gt; о б&lt;a href="http://googlerussiablog.blogspot.com/2007/04/google.html"&gt;еспроводных сетях на базе комаров&lt;/a&gt; и Mosquito Lisp, то на этот раз Google решил постебаться над нашей страстью к наличным. &lt;br /&gt;&lt;blockquote&gt;"Теперь вы можете установить портативный купюроприемник Google Cash прямо у себя в офисе или дома и вносить платежи за рекламу наличными рублями".&lt;/blockquote&gt;&lt;br /&gt;Купюроприемник, кстати, на картинке получился симпатичный :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-3453692307038438354?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/3453692307038438354/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=3453692307038438354' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3453692307038438354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3453692307038438354'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/04/google-cash.html' title='Google Cash - специально для россиян'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-5124023837045939581</id><published>2008-03-31T17:24:00.003+04:00</published><updated>2008-03-31T17:35:34.868+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='DOTNET'/><title type='text'>Console Application - дурное дело, не хитрое?</title><content type='html'>В больших проектах часто случается создавать консольные приложения для использования их в качестве утилит в процессе разработки, развертывания или эксплуатации основного приложения.&lt;br /&gt;Обычно такие утилиты создаются в пожарном порядке, буквально «на коленке» в качестве заплаток, для того чтобы решить срочную конкретную горящую проблему. Но, как известно, нет ничего более постоянного, чем временное. Созданные таким образом утилиты постепенно становятся важной частью системы, либо процесса ее развертывания и настройки.&lt;br /&gt;Постоянное статус консольных утилит подразумевает их использование в пакетах и сценариях автоматизации (bat и cmd файлы), а это накладывает ряд специфических требований. Вот несколько нехитрых правил, соблюдение которых поможет создавать надежные и удобные консольные утилиты:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Измените сигнатуру метода Main. Вместо &lt;span style="font-family:courier new;"&gt;static &lt;span style="color:#ff0000;"&gt;void&lt;/span&gt; Main(string[] args)&lt;/span&gt; используйте &lt;span style="font-family:courier new;"&gt;static &lt;span style="color:#ff0000;"&gt;Int32&lt;/span&gt; Main(string[] args)&lt;/span&gt;. Значение Int32, возвращаемое методом будет использовано, как &lt;strong&gt;Exit code&lt;/strong&gt; приложения. Это позволит вашему приложению просигнализировать вызывающему коду о характере возникших проблем. Обычно в качестве Exit code, сигнализирующего об успешном выполнении используют значение 0. Значения отличные от нуля сигнализируют о наличии ошибок.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Поместите все тело метода Main() в блок try – catch. Необработанные исключения делают невозможным использование вашего консольного приложения в пакетах и сценариях. В блоках catch вы можете возвращать различные значения (отличные от нуля), которые расскажут вызывающему коду о характере произошедших ошибок. Для обработки ошибок вы можете использовать событие &lt;span style="font-family:courier new;"&gt;AppDomain.CurrentDomain.UnhandledException&lt;/span&gt;, но, на мой взгляд, try – catch в Main() и проще и нагляднее.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Не используйте чтение с консоли (&lt;span style="font-family:courier new;"&gt;Console.Read() Console.ReadKey() Console.ReadLine()&lt;/span&gt;) потому, что это может оказаться неприятным сюрпризом для тех, кто использует ваше консольное приложение в пакете для автоматизации каких либо действий. Для ввода значений используйте либо аргументы командной строки, либо (если значений очень много) файлы.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Предусмотрите выдачу help-a по параметру /? Это существенно облегчит жизнь тем, кто будет использовать утилиту, а от вас не потребует много труда на реализацию.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Не скупитесь на &lt;span style="font-family:courier new;"&gt;Console.WriteLine()&lt;/span&gt; в коде своей утилиты. Пусть она подробно рассказывает о том, что делает, особенно при выполнении длительных операций. При обработке исключений используйте &lt;span style="font-family:courier new;"&gt;Console.WriteLine(exception.ToString())&lt;/span&gt;. Таким образом, вы выведите максимальное количество информации об ошибке, в т.ч. и stack trace. Для консольной утилиты это самое то, что надо.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-5124023837045939581?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/5124023837045939581/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=5124023837045939581' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5124023837045939581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5124023837045939581'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/03/console-application.html' title='Console Application - дурное дело, не хитрое?'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-8154124446705563303</id><published>2008-03-31T10:03:00.002+04:00</published><updated>2008-03-31T10:46:59.230+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><title type='text'>Mashup Security</title><content type='html'>Интересная заметка о &lt;a href="http://www.technologyreview.com/Infotech/20487/"&gt;Mashup Security&lt;/a&gt; на Technology  Review. &lt;br /&gt;Смогут ли машапы стать безопасными? От этого зависит укоренится ли эта технология в enterprise секторе либо ее уделом останутся разнообразные &lt;a href="http://www.pageflakes.com/"&gt;Pageflakes&lt;/a&gt;, &lt;a href="http://www.netvibes.com/"&gt;Netvibes&lt;/a&gt; и &lt;a href="http://pipes.yahoo.com/pipes/"&gt;Yahoo Pipes&lt;/a&gt;, пока ее не смоет новой волной какого нибудь Web 3.0.&lt;br /&gt;Проблемма в основном в том, как обезопасить корпоративные источники данных. Злодейский код из чужого домена, подмешанный в машап может с легкостью получить корпоративные данные и слить их куда надо, воспользовавшись царящим на сегодняшний день в машапах бардаком с доступом к учетным записям. &lt;br /&gt;Microsoft, как обычно предлагает ввести новые тэги (читай изменить стандарты) и добиться того чтобы все браузеры их понимали (знакомо, не правда ли).&lt;br /&gt;IBM предлагает другое решение - Smash, который не требует изменений в браузерах и будет разруливать неразбериху с credentials в машапах. Они даже предлагают исходники своей разработки в OpenAjax Alliance. Но энтузиазма на лицах ajax-оводов пока не наблюдается: "the next step for the mashup industry is to make sure that we develop a universal picture of security."&lt;br /&gt;Видимо Smash на универсальное решение все же не тянет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-8154124446705563303?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/8154124446705563303/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=8154124446705563303' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8154124446705563303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8154124446705563303'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/03/mashup-security.html' title='Mashup Security'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-6425926002377809258</id><published>2008-03-27T19:36:00.001+03:00</published><updated>2008-08-02T23:32:30.421+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>100% требований. Или «дьявол кроется в деталях».</title><content type='html'>У нас на работе разгорелась дискуссия на тему, какими должны быть идеальные требования к программному продукту. Насколько детально нужно прорабатывать требования? Какие аспекты надо описывать в требованиях (экранные формы, действия, контексты, переходы, особые случаи)? Как отслеживать изменения в требованиях? &lt;br /&gt;Всем понятно, что без внятных требований сделать хороший продукт невозможно. Зависимость тут прямая – чем лучше определены и сформулированы требования, тем лучше получится продукт (ну, наверное, правильнее применить сослагательное наклонение  - может получиться :). Отсюда простой и незамысловатый вывод – надо стараться собрать как можно более полные и детальные требования и будет нам счастье. &lt;br /&gt;&lt;br /&gt;Не будет счастья. Не работает такой подход. &lt;strong&gt;Когда вы слышите о 100% требований к системе, знайте это оксюморон.&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt;На одном из последних проектов мы разрабатывали систему, которая должна поддерживать некий новый бизнес процесс у заказчика. То есть компания заказчика занималась одной деятельностью, ну например, выращивала фанеру, и параллельно для своих нужд держала мастерскую по ремонту фанероводной техники. И так хорошо это мастерская работала, что решили они оказывать услуги по ремонту этой техники и зарабатывать на этом деньги. Ну а мы должны были сделать систему, которая будет поддерживать этот новый бизнес. &lt;br /&gt;&lt;br /&gt;Нам повезло, человек, который занимается этим новым направлением, и которого назначили владельцем системы, оказался очень грамотным специалистом и просто приятным человеком. За пару встреч с ним мы (менеджер проекта, аналитик, и архитектор) обсудили контуры будущей системы и получили общее видение, которое и оформили в виде соответствующего документа, в придачу наши ребята за пару дней соорудили прототип на статическом HTML. Прототип очень понравился заказчику, и он готов был дать отмашку на начало разработки (система нужна была ему, как говориться «уже вчера»), но не тут-то было. Руководство потребовало описания всех требований, составления детального план графика проекта и назначения формального milestone «Утверждение требований».&lt;br /&gt;&lt;br /&gt;Что поделаешь, во времена моей юности в таких случаях говорили «Партия сказала – надо, комсомол ответил – есть». Мы взялись за формирование детальных требований. Владелец системы, конечно, не мог уделять нашему аналитику много времени (ему надо было новый бизнес поднимать) и он назначил для этих целей пару своих экспертов. Мы начали расписывать детальные use case, а наш прототип начал усложняться и детализироваться. Мы детально расписали атрибуты документов и их жизненный цикл. Мы описали и реализовали в прототипе все экранные формы. Мы согласовывали все, вплоть до заголовков столбцов и надписей на кнопках. Но чем глубже мы погружались в детали, тем становилось хуже. Я уже говорил, о том, что бизнес процесс заказчика был новый, и существовал в основном лишь в головах людей, с которыми мы говорили. При детализации требований всплывали противоречия, которые наши собеседники на ходу пытались разрешить. Их решения аккуратно записывал наш аналитик. Когда мы рассматривали эти решения, всплывали новые противоречия, и этому не было конца. Хуже того, когда мы на следующей встрече показывали прототип того, что обсуждали на предыдущей встрече, обычно обсуждение начиналось по новой и принималось какое нибудь новое решение. Некоторые формы прототипа мы переделывали таким образом по три-четыре раза. Фактически мы уперлись в невидимую стену. &lt;strong&gt;Чем больше у нас становилось требований, тем больше в них обнаруживалось противоречий&lt;/strong&gt;. Так прошло два месяца, но от полной непротиворечивой картины нашей будущей системы мы были так же далеки, как и в тот день, когда в первый раз показали прототип системы заказчику. Не даром говорят, что дьявол кроется в деталях. Стоит ли говорить о том, что наши разработчики все это время нервно курили в сторонке :). &lt;br /&gt;&lt;br /&gt;Тут многие спросят, а зачем мы вообще занимались этой, извините, ерундой. Вообще-то, такая ситуация повторяется из раза в раз, вовсе не из-за глупости и неопытности участвующих в ней людей, а под давлением объективных обстоятельств. От команды разработчиков руководство требует наличия полного описания всех требований к системе, и проведение формального approve этих бумаг заказчиком. Заказчика, в этих обстоятельствах, придавливает груз ответственности, которую на него взваливают тем же самым требованием формального утверждения всех требований. Понятно, что после этого шага &lt;em&gt;заказчик оказывается в заведомо невыгодном положении&lt;/em&gt;. У него нет уверенности в том, что собранные требования верны, а после формального утверждения команда разработчика смело может отфутболивать все его просьбы о внесении изменений в будущую систему.  Получается, что и команда и заказчик находятся под давлением  из-за необходимости утверждения всех требований к системе до начала разработки. Что поделаешь, среди менеджеров среднего звена распространено мнение, что это (milestone «Утверждение требований») хороший способ &lt;em&gt;минимизации проектных рисков&lt;/em&gt;. Можно сколько угодно цитировать высказывания Крэтчена, Лармана, Фаулера и других корифеев о бессмысленности этого шага (я бы добавил, что очевидна его вредность), но это действительно хороший способ прикрыть задницу менеджера в отношениях с заказчиком, и тут ничего не поделаешь. &lt;br /&gt;&lt;br /&gt;Что же до нашего проекта, то все закончилось хорошо. Мы постарались успокоить заказчика, и заверили его, что калитка на внесение изменений в систему вовсе не будет нами захлопнута после утверждения требований. Мы продолжали уточнять детали по ходу разработки. Мы подсказывали заказчику лучшие решения для устранения противоречий, в общем, старались взаимодействовать с ним плотно и конструктивно. За время разработки практически во все собранные ранее требования были внесены изменения.  Кроме того, мы предложили провести при запуске системы период пилотной  эксплуатации,  в ходе которой &lt;em&gt;система будет оставаться открытой для внесения изменений&lt;/em&gt;. Т.е. мы проявили &lt;strong&gt;гибкость&lt;/strong&gt;. Сейчас заканчивается пилотирование системы и заказчик ей вполне доволен. А для нас очевидно, что если бы мы тупо сидели и три месяца кодировали по первоначально собранным и утвержденным требованиям, результат оказался бы плачевный. &lt;br /&gt;&lt;br /&gt;В заключение, небольшой case study:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; никогда не пытайтесь сформулировать 100% требований к системе. Есть очень ограниченное число случаев, когда это возможно сделать в принципе. Из своей практики я могу привести лишь пример портирования существующей системы на новую платформу.  Даже традиционные «тяжелые» методологии наподобие &lt;em&gt;RUP не требуют формирования 100% требований до начала разработки&lt;/em&gt;. Если кто-то требует от вас сделать это, значит этот человек недостаточно профессионален в области разработки софта. Уточняйте и формируйте требования до тех пор, пока не почувствуете что у вас и у заказчика &lt;strong&gt;сформировалось единое видение&lt;/strong&gt; системы, и вы понимаете &lt;strong&gt;как&lt;/strong&gt; ее сделать.&lt;/li&gt; &lt;br /&gt;&lt;li&gt; если вы оказались в ситуации, когда с вас требуют 100% требований до начала разработки, не бодайтесь со стеной. Направьте свою энергию на &lt;em&gt;установление хороших контактов&lt;/em&gt; с заказчиком и носителями экспертизы в предметной области. Требования все равно будут меняться и уточняться и хороший контакт с этими людьми поможет вам добиться успеха во время разработки.&lt;/li&gt; &lt;br /&gt;&lt;li&gt; для ситуации, когда требования к будущей системе сформулировать сложно, или они быстро меняются, лучше всего подходят &lt;strong&gt;agile&lt;/strong&gt; методики разработки. Однако не всегда удается их применить в рамках  фиксированных сроков и бюджетов, либо из-за ограничений в контракте с заказчиком. Тем не менее, применяйте agile практики &lt;em&gt;на уровне проектной команды &lt;/em&gt;(короткие итерации, постоянная интеграция, модульные тесты, архитектура, ориентированная на изменения). Старайтесь демонстрировать заказчику результаты разработки на самых ранних стадиях. Старайтесь получить от заказчика максимальный feedback. Это всегда производит на заказчика очень хорошее впечатление, не говоря уже о том, что благоприятно сказывается на качестве готового продукта.&lt;/ul&gt;&lt;/li&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-6425926002377809258?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/6425926002377809258/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=6425926002377809258' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6425926002377809258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/6425926002377809258'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/03/100.html' title='100% требований. Или «дьявол кроется в деталях».'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-5463104159758821952</id><published>2008-03-26T16:57:00.004+03:00</published><updated>2008-08-02T23:32:30.422+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>Что вы тут понаделали?</title><content type='html'>Когда вы ведете разработку в стиле Agile или XP, это означает, что через пару итераций (3-4 недели), систему которую вы продолжаете разрабатывать, уже вовсю используют. К сожалению так бывает далеко не всегда. Владельца системы обычно пугает тот факт, что еще недоделанная система будет использоваться его сотрудниками в реальных условиях. А если это финансовая система? А если это business critical приложение? Часто разработчиков даже близко не подпускают к их системе в production. На одном из моих проектов только выкладка в production занимала две недели. И тем не менее заказчик хочет Agile и разработчики готовы его изобразить. &lt;br /&gt;Обычно все сводится к тому, что раз в две недели владелец системы приходит к разработчикам (на Scrum или еще как), и те демонстрируют ему свои достижения. Кусок работы считается сделанным после того, как его показали заказчику. Далее составляется план на следующие две недели (в виде набора user story или еще как) и работа кипит дальше.&lt;br /&gt;Вот все это называется нехорошим словом "суррогат", а вовсе не agile. В конце концов, когда дело подходит к сдаче проекта, выясняется, что система сырая и буквально разваливается на глазах, баги сыпятся из всех щелей, а часть задекларированного функционала не сделана вовсе. Сроки проекта съезжают на пару месяцев. Если проект выполнялся по фиксированному бюджету, то матерятся разработчики, потому как работают за даром. А если оплата идет по времени, то уже заказчик проклинает весь этот agile, потому как мало того что ему сроки прослайдили, так и платить за это безобразие должен он сам.&lt;br /&gt;Отстутствие работающей системы разрушает систему agile процесса не хуже чем отсутствие нормальных коммуникаций с заказчиком. При выкладке новой версии в production о любом новом баге становится известно максимум на следующий день, и способы, которыми пользователи системы доносят эти не благие вести до разработчиков очень хорошо дисциплинируют последних. В отсутствии работающей системы демонстрация результатов итерации заказчику превращается в необременительное шоу, - "показываем то, что работает, что не работает - про то рассказываем (ничего, в понедельник доделаем)".   &lt;br /&gt;Что же делать в таких случаях? Вспомнить о гибкости agile.  Вот несколько советов:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Обязательно ведите и храните требования. В виде user story, use case, карточек. В backlog-е или на бумаге - не важно. Важно чтобы они были. Обычно работающая система и есть воплощение требований, но у вас нет работающей системы.  &lt;/li&gt;&lt;br /&gt;&lt;li&gt; Введите практику формальной приемки user story заказчиком или владельцем системы. Это подразумевается и в XP и в других agile методиках, но об этом часто забывают. Без приемки карточка не может считаться выполненной. Это можно организовать либо настройкой workflow в backlog-е системы, при котором работы закрывает только заказчик, либо отметками на карточках, если они ведутся на бумаге.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Никогда не изменяйте уже оформленные требования. Они могут быть реализованы или не реализованы. Если они не реализованы они могут быть вообще выброшены, если от них откажется заказчик. Часто бывает что требование уже реализовано и только тут заказчик понимает, что надо что то доделать или сделать по другому. Прекрасно, никаких проблем, но это должно быть оформлено в виде &lt;strong&gt;нового требования&lt;/strong&gt;. &lt;/li&gt;&lt;br /&gt;&lt;li&gt; Функциональное тестирование. В любых руководствах по agile написано, что следует автоматизировать тестирование настолько, насколько это возможно. В отсутствии работающей системы, тестировщик с пачкой карточек user story в руках пытающийся воспроизвести эти истории на вашей системе, это именно то что вам нужно. Ряд ошибок принципиально не возможно выявить модульными тестами, и вскрываются они только при непосредственном использовании системы. Помимо прочего, это будет стимулировать писать тестируемые user story. Обнаруженные баги следует оформлять в виде новых историй, а не возвращать на переработку старые. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-5463104159758821952?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/5463104159758821952/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=5463104159758821952' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5463104159758821952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/5463104159758821952'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/03/blog-post.html' title='Что вы тут понаделали?'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4106606689923050427</id><published>2008-03-05T12:19:00.003+03:00</published><updated>2008-03-05T12:34:42.545+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>LINQ to Everything</title><content type='html'>Я немного перефразировал заголовок оригинального поста &lt;a href="http://blogs.msdn.com/charlie/archive/2008/02/28/link-to-everything-a-list-of-linq-providers.aspx"&gt;Link to Everything: A List of LINQ Providers&lt;/a&gt; в блоге &lt;a href="http://blogs.msdn.com/charlie/default.aspx"&gt;Charlie Calvert's Community Blog&lt;/a&gt;.&lt;br /&gt;Там приведен действительно впечатляющий список провайдеров LINQ начиная с Active Directory и Excel и заканчивая Amazon и Flickr. А как вам, к примеру, LINQ to JavaScript?&lt;br /&gt;Да, пожалуй LINQ, это на сегодня самая "гормкая" и популярная инновация от Microsoft в области програмных языков.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4106606689923050427?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4106606689923050427/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4106606689923050427' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4106606689923050427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4106606689923050427'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/03/linq-to-everything.html' title='LINQ to Everything'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-4170895596822285076</id><published>2008-03-04T13:12:00.002+03:00</published><updated>2008-03-04T13:15:13.545+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='DOTNET'/><title type='text'>ASP.NET MVC Framework</title><content type='html'>Должен вам признаться в том, что я жуть как не люблю ASP.NET WebForms. Я не люблю их за то, что они хотят казаться WinForm-ами, а это у них плохо получается. Я не люблю их за постбэки (postback) и их аццкие порождения – вьюстэйты. Это не религиозные чувства, просто все это очень сложно и с ними не удобно работать. Viewstate тяжело контролировать, а в купе с серверными событиями он порождает очень неэффективные решения, которые по полной  грузят и канал и сервер. Механизм postback-ов провоцирует размещать код, отвечающий за сценарий взаимодействия с пользователем (workflow) в самих aspx формах. Постепенно они обрастают кодом, который естественно не охвачен модульными тестами и служит постоянным источником проблем. &lt;br /&gt;&lt;br /&gt;Но, есть хорошая новость. В готовящемся к выпуску пакете &lt;a href="http://asp.net/downloads/3.5-extensions/"&gt;Microsoft ASP.NET 3.5 Extensions&lt;/a&gt; есть замечательная штука под названием MVC Framework. &lt;br /&gt;&lt;br /&gt;В своем блоге &lt;a href="http://weblogs.asp.net/scottgu"&gt;Scott Gu&lt;/a&gt; опубликовал несколько подробных постов с описанием MVC Framework, ссылки на которые собраны под заголовком &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/02/12/asp-net-mvc-framework-road-map-update.aspx"&gt;«ASP.NET MVC Framework Road-Map»&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;Что же такого хорошего предлагают нам под маркой MVC Framework?&lt;br /&gt;&lt;br /&gt;Во-первых, это честный Model View Controller фрэймворк, который к тому же очень красиво спроектирован. Он позволяет делать хорошо структурированные решения, и предлагает для этого очень удобный инструментарий. Web запросы обрабатываются не ASP.Net страницами, а классами контроллерами. Контроллеры содержат всю бизнес логику, а на долю web страниц оставлена лишь отрисовка UI.  &lt;br /&gt;&lt;br /&gt;Во-вторых, MVC Framework легко расширяем. В качестве модели можно использовать практически все что угодно: ADO.Net DataReader-ы и DataSet-ы, любые ORM фрэймворки, XML, и конечно LINQ to SQL. В качестве View можно использовать обычные ASP.NET формы и контролы, или написать свои собственные, хотя MVC предлагает свой готовый набор компонент и утилит для генерации представления. &lt;br /&gt;&lt;br /&gt;В–третьих, MVC Framework спроектирован максимально удобно для модульного тестирования. Основные контракты реализованы через интерфейсы, и легко заменяются mock-объектами (у меня сложилось впечатление, что необходимые mock-и уже есть в составе фрэймворка). Контроллеры и  URL-мапперы можно тестировать вне ASP.NET процесса и приложения. Представления практически не содержат кода, кроме биндинга и рендеринга. Все это облегчает тестирование MVC приложения.&lt;br /&gt;&lt;br /&gt;В-четвертых, MVC Framework содержит мощный и гибкий механизм URL-маппинга. Так, например, можно сменить формат URL с вот такого «/products/edit.aspx?id=4», на вот такой «/products/edit/4», и при этом не придется изменять ни одной строчки кода, в контроллерах и web станицах. Достаточно только поменять URL-маппинг.       &lt;br /&gt;&lt;br /&gt;При всем при этом, MVC Framework не отменяет и не конфликтует (я надеюсь…) с существующими фичами ASP.NET, такими как аутентификация windows/forms, membership/roles, механизм провайдеров, кэширование данных, master pages и т.д.&lt;br /&gt;&lt;br /&gt;В общем, MVC Framework производит очень приятное впечатление. С нетерпением буду ждать его выхода. Вот только не понятно мне, почему он выходит в составе ASP.NET Extensions, по моему ему самое место в ASP.NET Core :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-4170895596822285076?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/4170895596822285076/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=4170895596822285076' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4170895596822285076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/4170895596822285076'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/03/aspnet-mvc-framework.html' title='ASP.NET MVC Framework'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-8223229540940095909</id><published>2008-02-29T17:36:00.003+03:00</published><updated>2008-02-29T17:40:31.648+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Just fun'/><title type='text'>Тяжелый день 29 февраля</title><content type='html'>Сегодня упали модульные тесты на сборке. Потому что 29 февраля.&lt;br /&gt;4 года назад тесты тоже падали, по той же причине, хотя и проект был другой и работал я в другом месте...&lt;br /&gt;Тяжелый день.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-8223229540940095909?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/8223229540940095909/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=8223229540940095909' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8223229540940095909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8223229540940095909'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/02/29.html' title='Тяжелый день 29 февраля'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-8117992687010839288</id><published>2008-02-29T15:04:00.004+03:00</published><updated>2008-08-02T23:32:30.422+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>5 инструментов</title><content type='html'>Эстафета "5 инструментов без которых я не могу работать продуктивно" пришла ко мне от &lt;a href="http://deepencpp.blogspot.com/2008/02/5.html"&gt;Юрия Волкова&lt;/a&gt; (&lt;a href="http://deepencpp.blogspot.com/"&gt;Deepen C++&lt;/a&gt;). &lt;br /&gt;Оговорюсь сразу, что, во-первых, я буду говорить только о программных инструментах (без телефона и принтера я тоже не могу работать продуктивно). Во-вторых, речь пойдет не о работе на компьютере вообще, а именно о работе архитектора - проектировщика. Итак:&lt;br /&gt;1. &lt;strong&gt;Outlook&lt;/strong&gt;. C этим инструментом у меня сложные отношения. Outlook мне никогда не нравился, но два с половиной года назад я попал  - на новой работе Outlook корпоративный стандарт. Теперь весь мой рабочий день вертится вокруг этой штуки, и со временем я стал находить, что работу свою он делает хорошо.  Помимо почты, это еще и организация митингов, резервирование переговорок, интегрированный hrelp desk, система папок проектной переписки и т.д. Кроме того, вся моя личная корреспонденция редиректится на Gmail, а оттуда дублируется на корпоративный Exchange, и в конце концов сваливается в Outlook. После того как я настроил синхронизацию календарей Outlook с телефоном (ActiveSync), стал реже опаздывать на митинги. &lt;br /&gt;2. &lt;strong&gt;Virtual PC &lt;/strong&gt;(до этого был &lt;a href="http://www.vmware.com/products/ws/"&gt;VMWare Workstation&lt;/a&gt;, но опять же - корпоративные стандарты). Постоянно использую виртуальные машины, на диске живет целый выводок образов различных ОС и конфигураций. Задачи приходится решать самые разные: тестирование развертывания продуктов на разных окружениях, всевозможные proof of concepts - проверки реализуемости различных решений, тестирование и изучение новых продуктов, и т.д. и т.п.&lt;br /&gt;3. &lt;strong&gt;Rational Rose&lt;/strong&gt;. Пробовал много разных инструментов моделирования, но классика победила :)&lt;br /&gt;4. &lt;strong&gt;Notepad&lt;/strong&gt;. Как это не покажется странным но по частоте использования обычный блокнот вообще вне конкуренции. XML и SQL, конфиги, логи, скрипты и нередко исходники - все читаю и правлю в блокноте. Конечно хорошо было-бы иметь подсветку синтаксиса и спелчекер для борьбы с моей хронической неграмотностью, но невозможно все это таскать за собой от компьютера у компьютеру. А блокнот есть везде...&lt;br /&gt;5. &lt;strong&gt;Visual Studio&lt;/strong&gt;. Одновременно на разных проектах приходится использовать три версии VS2003 VS2005 и VS2008. К сожалению программировать в последнее время приходится все меньше, но все равно считаю студию выдающимся инструментом для программиста, а в VS2008 еще и для архитектора появились неплохие инструменты.      &lt;br /&gt;&lt;br /&gt;Хотелось бы услышать с чем работают:  &lt;br /&gt;&lt;a href="http://blog.not-a-kernel-guy.com/"&gt;not-a-kernel-guy&lt;/a&gt; &lt;br /&gt;&lt;a href="http://kuklaora.blogspot.com/"&gt;kuklaora&lt;/a&gt;&lt;br /&gt;&lt;a href="http://nzeemin.livejournal.com/"&gt;Ленивый программист&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ivaliy.blogspot.com/"&gt;ivaliy&lt;/a&gt;(хотя ему сейчас, видимо, не до того...)&lt;br /&gt;&lt;a href="http://andybor.blogspot.com/"&gt;Бороздин Андрей&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;P.S. Да, совсем забыл SVN с &lt;a href="http://tortoisesvn.tigris.org/"&gt;Тартилой&lt;/a&gt;. Без них работа станет. Но свободные номера в списке уже закончились...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-8117992687010839288?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/8117992687010839288/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=8117992687010839288' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8117992687010839288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/8117992687010839288'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/02/5.html' title='5 инструментов'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-1723089881411399677</id><published>2008-02-21T14:21:00.002+03:00</published><updated>2008-08-02T23:32:30.422+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Agile и Offshore development.</title><content type='html'>Нашел в MSDN статью Андрея Филева (Andrew Filev) &lt;a href="http://www.microsoft.com/rus/msdn/publish/articles/bb245671.mspx"&gt;Успешное внедрение гибких методик разработки в оффшорной разработке программного обеспечения&lt;/a&gt;.&lt;br /&gt;Честно говоря не ожидал прочитать что либо подобное в MSDN. Статья больше об offshore, чем об agile. Особо рекомендую прочитать тем, кто продолжает считать офшорные разработки чем-то вроде работы второго сорта.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-1723089881411399677?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/1723089881411399677/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=1723089881411399677' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1723089881411399677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/1723089881411399677'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/02/agile-offshore-development.html' title='Agile и Offshore development.'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-850818088026848240</id><published>2008-02-21T12:23:00.003+03:00</published><updated>2008-02-21T13:34:31.516+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Подборка материалов по WCF</title><content type='html'>В процессе сбора информации по WCF у меня сформировалась большая подборка ссылок. Негоже добру пропадать, решил я. &lt;br /&gt;По ссылкам статьи (большинство в русском переводе) из MSDN, MSDN Magazine, GotDotNet.ru и из блогов. &lt;br /&gt;По моему про WCF написано уже все :) Осталось все это прочитать :)) &lt;br /&gt;&lt;br /&gt;1.&lt;a href="http://www.microsoft.com/Rus/Msdn/Magazine/2006/06/lowy_ins.mspx"&gt;Эффективные методики управления экземплярами в WCF-приложениях&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/06/WCFEssentials/default.aspx"&gt;Discover Mighty Instance Management Techniques For Developing WCF Apps&lt;/a&gt;(оригинал предыдущей статьи на английском)&lt;br /&gt;&lt;br /&gt;3.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/08/ServiceStation/default.aspx"&gt;Serialization in Windows Communication Foundation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/08/SecurityBriefs/default.aspx"&gt;Security in Windows Communication Foundation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/10/WCFEssentials/default.aspx"&gt;What You Need To Know About One-Way Calls, Callbacks, And Events&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/02/ServiceStation/default.aspx?loc=ru"&gt;Service Factory для WCF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;7.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/02/Foundations/default.aspx?loc=ru"&gt;Создание службы ответов WCF в очереди&lt;/a&gt;(рус.)&lt;br /&gt;&lt;br /&gt;8.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/04/Identity/default.aspx?loc=ru"&gt;Защитите приложения ASP.NET и службы WCF с помощью Windows CardSpace&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;9.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/04/ServiceStation/default.aspx?loc=ru"&gt;Основные положения системы обмена сообщениями WCF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;10.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/05/Foundations/default.aspx?loc=ru"&gt;Распространение транзакций WCF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;11.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/06/ServiceStation/default.aspx?loc=ru"&gt;Подробно об адресации WCF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;12.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/07/ServiceStation/default.aspx?loc=ru"&gt;WCF Bindings In Depth&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;13.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/08/Foundations/default.aspx?loc=ru"&gt;Декларативная безопасность WCF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;14.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/09/WAS/default.aspx?loc=ru"&gt;Расширение служб WCF за пределы HTTP с помощью WAS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;15.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/11/Foundations/default.aspx?loc=ru"&gt;Контексты синхронизации в WCF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;16.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/12/ServiceStation/default.aspx?loc=ru"&gt;Расширение WCF при помощи настраиваемых поведений&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;17.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/08/01/WCFinOrcas/default.aspx?loc=ru"&gt;Программирование HTTP с использованием WCF и .NET Framework 3.5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;18.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/08/02/PIABWCFBehaviors/default.aspx?loc=ru"&gt;Интеграция блока Policy Injection Application Block со службами WCF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;19.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/08/02/Foundations/default.aspx?loc=ru"&gt;Что нового для WCF в Visual Studio 2008&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;20.&lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/02/WindowsCommunicationFoundation/default.aspx"&gt;Learn The ABCs Of Programming Windows Communication Foundation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;21.&lt;a href="http://www.gotdotnet.ru/LearnDotNet/DotNet30/533749.aspx"&gt;Обработка ошибок в Windows Communication Foundation (WCF)&lt;/a&gt; &lt;br /&gt;&lt;a href="http://www.gotdotnet.ru/LearnDotNet/DotNet30/445109.aspx"&gt;Первый взгляд на Windows Communication Foundation&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;22.&lt;a href="http://stump-workshop.blogspot.com/2006/10/msdn-windows-communication-foundation.html"&gt;Обзор архитектуры Windows Communication Foundation&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;23.&lt;a href="http://www.microsoft.com/rus/msdn/publish/articles/bb266709.mspx"&gt;Интеграция Windows Workflow Foundation и Windows Communication Foundation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;24.&lt;a href="http://www.microsoft.com/Rus/Msdn/publish/articles/vistawcf.mspx"&gt;Размещение и использование служб Windows Communication Foundation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;25.&lt;a href="http://blogs.msdn.com/romanbat/archive/2006/10/21/windows-communication-foundation-compact-edition-and-the-story-of-the-lunch-launcher.aspx"&gt;Windows Communication Foundation (Compact Edition) and the story of the Lunch Launcher &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-850818088026848240?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/850818088026848240/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=850818088026848240' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/850818088026848240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/850818088026848240'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/02/wcf.html' title='Подборка материалов по WCF'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-3007364156652371014</id><published>2008-02-18T09:33:00.005+03:00</published><updated>2008-02-18T10:29:22.957+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Опросы'/><title type='text'>Результаты опроса "Что важнее для успеха в разработке ПО"</title><content type='html'>Опрос закончился. Приняло участие 88 человек. Итак в чем же, по мнению сообщества, роются секреты успешной разработки софта? &lt;br /&gt;65 (73%) человек отметили хорошую постановку задачи.&lt;br /&gt;59 (67%) человек выделили важность хороших программистов&lt;br /&gt;42 (47%) человека (менее половины) верят в важность хорошего менеджмента  &lt;br /&gt;39 (44%) человек отмечают архитектуру&lt;br /&gt;34 (38%) человек считают важными тесты&lt;br /&gt;10 ((11%) человек отметили важность методологии.&lt;br /&gt;&lt;br /&gt;В результате важность перечисленных аспектов распределилась следующим образом: &lt;br /&gt;&lt;img src="http://chart.apis.google.com/chart?chs=370x100&amp;chd=t:10,65,59,42,39,34&amp;cht=p3&amp;amp;chl=methodology 4%|requirements 26%|programmers 24%|manager 17%|architecture 15%|testing 13%&amp;chco=008800" border="0" alt="" /&gt;&lt;br /&gt;Согласно общественному мнению секрет успеха прост. Надо взять хороших программистов, толково объяснить им поставленную задачу и половина успеха уже у вас в кармане. Для полной уверенности в том, что все пойдет как надо, можно поставить на проект хорошего менеджера. Если не забыть про архитектуру и тесты, то успех будет полным. А методология, это штука из разряда nice to have, главное чтоб работать не мешала :)&lt;br /&gt;&lt;br /&gt;Что я хочу сказать от себя. Меня определенно радует сфокусированность подавляющего большинства (73%) на требованиях. Ну а мои личные предпочтения распределились следующим образом:&lt;br /&gt;1. Хороший менеджер, и менеджмент в целом. Мне, как человеку техническому, потребовалось определенное время (годы) для того, чтобы осознать, техническое совершенство продукта несмотря не на что играет в достижении успеха важную но все же вторичную роль. Проект  - это в первую очередь управление, без него даже самый совершенный код останется бесполезными килобайтами на жестком диске. &lt;br /&gt;2. Хорошая постановка требований. Требования - это наше все. Нельзя создать хороший софт не зная точно, что он должен делать.&lt;br /&gt;3. Хорошая архитектура. Технический аспект важен. но всего лишь на третьем месте. &lt;br /&gt;4. Хорошие программисты. Программисты нужны :) Причем нужен хотя бы один, способный обеспечить выполнение пункта 3. Не более того. Есть очень малое число проектов. для которых действительно нужны выдающиеся программисты. &lt;br /&gt;5. Хорошее тестирование. Без тестирования невозможно выпустить хороший продукт. Это как воздух, без воздуха нельзя жить, но никто не говорит о роли воздуха в достижении счастья.&lt;br /&gt;6. Хорошая методология очень важна. Но методология определяется менеджементом (извините за некрасивое слово). Методология - это стиль управления. Не столь важно какой будет стиль, главное чтобы управление было эффективным.&lt;br /&gt;&lt;br /&gt;P.S. Диаграма построена при помощи &lt;a href="http://code.google.com/apis/chart/"&gt;Google Chart API&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-3007364156652371014?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/3007364156652371014/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=3007364156652371014' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3007364156652371014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/3007364156652371014'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/02/blog-post_18.html' title='Результаты опроса &quot;Что важнее для успеха в разработке ПО&quot;'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-195177041397152722</id><published>2008-02-17T17:03:00.003+03:00</published><updated>2008-02-17T17:11:21.276+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Простой дизайн</title><content type='html'>&lt;h3&gt;Размышления о том, в чем заключается роль опыта в проектировании, в чем опасность готовых решений или каркасов.&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Недавно у меня завязалась дискуссия с одним коллегой на форуме RSDN. Обсуждался вопрос о способе расчета массы объекта, состоящего из множества составных частей (которые тоже состоят из частей). Я предложил использовать &lt;em&gt;простейший&lt;/em&gt; вариант реализации, основанный на наследовании. Коллега предложил более сложный вариант с использованием интерфейса и выделенного класса (я специально не упоминаю детали, чтобы избежать обсуждения этого вопроса здесь). Дискуссия разгорелась довольно жаркая. Суть ее свелась к спору о том, что лучше: простое решение, учитывающее только текущие требования, либо более сложное, которое учитывает возможные дополнительные требования, которые могут возникнуть при дальнейшем развитии системы. Причем, как оказалось, корень противоречия лежит в самом подходе к проектированию системы.&lt;br /&gt;&lt;br /&gt;Первый подход, заключается в том, что мы имеем требования и на основе их проектируем классы. Имеем одни требования - получаем один дизайн, изменяются требования – получаем другой дизайн, удовлетворяющий новым требованиям. Мы &lt;em&gt;стремимся иметь наиболее простой дизайн и изменять его только когда, это действительно неизбежно необходимо&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Другой подход утверждает, что опытный проектировщик руководствуется не только текущими требованиями при создании дизайна системы. Привлекая свой опыт, он может &lt;em&gt;создать дизайн, способный удовлетворить требованиям, которые могут появиться в дальнейшем при развитии системы&lt;/em&gt;. Так сказать, дизайн на вырост. Благодаря этому &lt;em&gt;можно избежать переделок дизайна&lt;/em&gt; в ходе развития системы. Сторонники этого подхода также предпочитают использовать готовые framework-и, фабрики ПО, мотивируя это тем, что «там уже есть все необходимое».&lt;br /&gt;&lt;br /&gt;Один из коллег высказал такую мысль:&lt;br /&gt;&lt;blockquote&gt;«Это, в общем, вопрос компромисса:&lt;br /&gt;Слишком частные решения как правило ограничивают масштабируемость приложения и увеличивают затраты на переработку. В том числе переработку архитектуры.&lt;br /&gt;Слишком общие решения могут безосновательно увеличить стоимость разработки и снизить производительность.&lt;br /&gt;Так что тут больше вопрос интуиции.&lt;br /&gt;Начинающие разработчики, как правило, делают первую ошибку, разработчики среднего уровня — вторую»&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Многие действительно считают, что опыт разработчика позволяет ему предвидеть будущие проблемы, и тем самым создавать качественный дизайн. Существует мнение, что в книгах по дизайну рассматриваются элементарные примеры, что реальные системы намного сложнее, и «реальный» дизайн - это заведомо сложный дизайн, требующий от разработчика опыта создания таких же сложных систем.&lt;br /&gt;&lt;br /&gt;Раньше я сам придерживался этой точки зрения. &lt;strong&gt;Но сейчас я считаю, что это ошибка&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Главные технические проблемы долго живущих и развивающихся программных систем заключены в том, что со временем их дизайн становится слишком сложным, и в том, что он перестает отвечать требованиям, предъявляемым к системе. Это первопричины, которые порождают уже все болезни таких систем, такие как, сложность поддержки, сложность внесения изменений, и, как следствие, все увеличивающийся разрыв между возможностями системы и потребностями пользователей.&lt;br /&gt;&lt;br /&gt;Основные задачи проектировщика и разработчика такой системы заключается, во-первых, в поддержании дизайна в соответствии с требованиями. Система развивается и дорабатывается, появляются новые требования и изменяются старые. Во-вторых, необходимо поддерживать дизайн системы в хорошо структурированном и максимально простом виде, чтобы облегчить выполнение первой задачи. Проблема в том, что обе задачи находятся в противоречии друг с другом. Изменения, не предусмотренные первоначальным дизайном, обычно вступают с ним в противоречия, вносят дополнительную сложность, нарушают структуру, и увеличивают энтропию системы. Вот вам и обоснование того, что &lt;em&gt;разработчик должен предвидеть возможные изменения, закладывать их в первоначальный дизайн&lt;/em&gt; (увеличение сложности при этом неприятная, но необходимая плата), и все это можно сделать на основании опыта.&lt;br /&gt;&lt;br /&gt;Опыт конечно важен для разработчика, но его роль состоит не в этом. &lt;em&gt;Опыт помогает разработчику правильно учесть все требования и создать на основании этого оптимальный дизайн&lt;/em&gt;. Помимо описанных явным образом функциональных требований, существует масса нефункциональных требований различного характера, от системных (производительность, устойчивость, масштабируемость, расширяемость), до таких, как квалификация разработчиков, размер бюджета проекта, или требования непременно сделать систему на платформе N.&lt;br /&gt;&lt;br /&gt;Всегда следует помнить, что дизайн системы есть функция требований к этой системе. Функция очень сложная и нелинейная, поскольку существуют зависимости между требованиями, каждое требование имеет свой вес, и кроме того, требования имеют скверную тенденцию вступать в противоречие друг с другом. Во многом именно по этой причине проектирование является процессом недетерминированным и эвристическим. Вот тут и проявляется роль опыта.&lt;br /&gt;&lt;br /&gt;Очень сложно получить хороший дизайн сразу и окончательно, хотя бы потому, что это всегда результат компромисса. Еще сложнее получить хороший дизайн, когда помимо реально существующих требований мы закладываем в него возможности «на будущее». Наоборот, &lt;em&gt;выделив главное, отбросив несущественное, у нас появляется гораздо больше шансов создать предельно простой дизайн, который в тоже время наилучшим образом удовлетворяет самым важным требованиям&lt;/em&gt;. Наиболее ярко этот подход проявился в методологии XP, в знаменитом принципе &lt;strong&gt;YAGNI&lt;/strong&gt; (You Aren't Gonna Need It) – «тебе это не пригодится».&lt;br /&gt;&lt;br /&gt;Оппоненты данного подхода обычно говорят: «зачем я буду несколько раз переделывать свою систему, когда я сразу могу внести в нее все необходимые свойства, благо есть архитектурные паттерны, framework-и, software factory и т.д.». Ответ прост. Проектирование процесс «грязный» (подверженный ошибкам) и итеративный. Создать «сразу» окончательный дизайн невозможно. Поэтому &lt;em&gt;наиболее выигрышной стратегией будет не «предвосхищение требований», а «ожидание изменений»&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Совершенно показателен в этом плане пример использования готовых библиотек и «фабрик ПО». Несколько лет назад Microsoft начал публиковать так называемые &lt;em&gt;Application Blocks&lt;/em&gt;, исходные коды библиотек для решения типовых задач, возникающих при построении приложений: конфигурирования, логирования, кэширования, бизнес логики и т.д. Это были действительно интересные библиотеки, которые обобщали наиболее передовой опыт. Затем все эти блоки были сведены в &lt;em&gt;Enterprise Library&lt;/em&gt;. Это уже был своего рода каркас для построения распределенных корпоративных приложений. Сейчас на основе Enterprise Library созданы &lt;em&gt;Software factory &lt;/em&gt;– библиотеки дополнены шаблонами и мастерами design time для Visual Studio. Само название «Фабрика ПО» подразумевает, что она позволяет максимально упростить и ускорить создание приложений, предоставляя каркас содержащий «все необходимое». На практике получается не все так гладко. Разработка идет очень быстро и хорошо, до тех пор, пока не возникает задача, на которую не были рассчитаны базовые библиотеки. Тут приходится вносить изменения в эти библиотеки, а поскольку они рассчитаны на максимально широкий класс задач, то они имеют достаточно сложный и нетривиальный дизайн, и вносить изменения в них весьма не просто. Это повторяется из проекта в проект – резкий старт, огромная экономия времени на рутинных аспектах и затем такой же резкий стопор в разработке, погружение в детали библиотек, переделки, а зачастую дублирование для реализации недостающих функций. В результате проект занимает примерно столько же времени, как и при разработке с нуля. А дизайн системы представляет собой огромный блестящий каркас, заполненный функционалом едва ли на десятую часть, окруженный достаточно неприглядными подпорками.&lt;br /&gt;&lt;br /&gt;Альтернатива этому – итеративное проектирование с поддержанием максимально простого дизайна каждой части системы на низком уровне, и структурной целостности на более высоком уровне. Неизбежные изменения гораздо проще вносить, когда дизайн прост, чем когда он сложен. К тому же в этом случае ваша система никогда не будет обременена тоннами неиспользуемого или бесполезного кода. Я скажу более, оптимальная стратегия проектирования для систем с длительным жизненным циклом - вносить изменения в систему как можно позже, когда их необходимость становится совсем уж очевидной. Так вы не только уменьшите количество изменений, но и улучшите их «качество».&lt;br /&gt;&lt;br /&gt;А как же framework-и и фабрики ПО? Это замечательные вещи, но использование их в проекте, особенно впервые, это значительный риск. И в тоже время, если вы уже использовали тот или иной каркас, вы зачастую можете обнаружить, что именно для вашего конкретного случая этот каркас, как говорится, именно то, что доктор прописал. Вот в чем роль опыта :) И в тоже время каркасы, это просто кладезь best practice архитектурных решений и поэтому они достойны всяческого внимания и изучения.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5092972944722879737-195177041397152722?l=stump-workshop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://stump-workshop.blogspot.com/feeds/195177041397152722/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5092972944722879737&amp;postID=195177041397152722' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/195177041397152722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5092972944722879737/posts/default/195177041397152722'/><link rel='alternate' type='text/html' href='http://stump-workshop.blogspot.com/2008/02/blog-post_17.html' title='Простой дизайн'/><author><name>Sergey Rozovik</name><uri>http://www.blogger.com/profile/13717493609449785600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://photos1.blogger.com/blogger/5492/3739/1600/srozovik.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5092972944722879737.post-6434016921817032556</id><published>2008-02-11T22:23:00.000+03:00</published><updated>2008-08-02T23:32:30.422+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Engineering'/><title type='text'>«Пилите пули, Шура, они серебряные…»</title><content type='html'>&lt;div align="center"&gt;&lt;strong&gt;или "В цепких лапах библиотек"&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Поиски серебряной пули в разработке ПО продолжаются.&lt;br /&gt;Сегодня читаю в &lt;a href="http://victorronin.com/"&gt;«Блоге об IT бизнесе»&lt;/a&gt; Виктора Ронина статью &lt;a href="http://victorronin.com/2008/02/10/serebryanaya-pulya-v-razreze/"&gt;«Серебряная пуля в разрезе»&lt;/a&gt;. Если в прошлых постах автор искал источники повышения производительности разработки софта в мотивации программистов, то теперь он ищет серебряную пулю в open source software. Вот несколько цитат:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;«Однако, я напоследок оставил то, что действительно является «серебряной пулей».&lt;br /&gt;Это – библиотеки. Точнее не только библиотеки, но и разнообразные платформы. За последние двадцать лет появилось гигантское количество открытого доступного кода или хотя бы платформ с открытыми интерфейсами.&lt;br /&gt;...&lt;br /&gt;2008 год: RFID ворота на складе, подключенные к машинам на которых установлен Ubuntu с программой, которая выгребает данных с RFID считыватели и по сети закатывает в БД. На сервере крутится программа, которая выгребает данные из БД и через SOAP загружает их в Sales Force Automation...&lt;br /&gt;&lt;br /&gt;Дай бог 0.01% [второй] системы написано программистом, а остальные (сайт sales force, библиотеки по работе с RFID, база данных, tcp/ip, xml, soap, графический интерфейс, броузер и т.п.) досталось ему фактически забесплатно. Если бы он пытался написать все сам (даже «срезая углы») у него это заняло бы всю жизнь.&lt;br /&gt;&lt;br /&gt;...мы и не заметили серебряной пули, хотя она находится у нас под носом."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Хоть Виктор и цитирует Брукса, но, похоже, старик его не слишком убедил. &lt;br /&gt;Повторное использование кода, библиотеки функций и переносимые компоненты  - все это, наряду с интегрированными средами разработки и языками высокого уровня, является основным двигателем прогресса в программной инженерии за последние 20 лет.&lt;br /&gt;&lt;br /&gt;С одной стороны, прогресс вроде бы есть. Ранее интерфейс типичного бизнес приложения мерцал зелеными буквами и цифрами на мониторе PDP терминала, и представлял собой последовательность меню в стиле «Нажмите 1 для просмотра баланса; Нажмите 2 для пополнения счета; Нажмите Esc…». Сегодня, мы можем мышкой перетаскивать активы из Нью-Йоркского филиала в Нижегородский, на интерфейсе, представляющем собой географическую карту, и смотреть отчеты в своем мобильном телефоне. Т.е. тысячи новых возможностей, интерактивность, мобильность, красочность и т.д. &lt;br /&gt;С другой стороны, прогресса никакого и нет. Как требовалось раньше 10 человеко-лет  на разработку среднего бизнес приложения, так и сегодня требуется 10 человеко-лет. Как строился квартальный отчет 45 минут, так он и строится 45 минут.&lt;br /&gt;&lt;br /&gt;Именно библиотеки и компоненты, открыли нам новые возможности при разработке приложений. Во-первых, библиотека позволяет повторно использовать однажды написанный, проверенный и отлаженный код. Во-вторых, библиотека или компонент скрывает свое внутреннее устройство, выставляя наружу более или менее простой интерфейс, тем самым инкапсулируя и изолируя в себе часть сложности системы, библиотеки и компоненты позволяют создавать более крупные и сложные системы. Это замечательно и это знают все. Но вот беда, с библиотеками и компонентами мы опять получаем проблемы, но уже на новом уровне. Сегодня любая программа использует пару десятков внешних библиотек, те в свою очередь используют еще сотню. И если раньше мы боролись с цикломатической сложностью кода, то теперь сталкиваемся с компонентной сложностью. Добавились и специфические проблемы композиции:   &lt;br /&gt;&lt;ul&gt;&lt;li&
