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

<channel>
	<title>Victor Ronin&#039;s IT blog &#187; Код и программистское</title>
	<atom:link href="http://victorronin.com/category/kod-i-programmistskoe/feed/" rel="self" type="application/rss+xml" />
	<link>http://victorronin.com</link>
	<description>Thinking aloud about business and software development</description>
	<lastBuildDate>Tue, 01 May 2012 22:37:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>По пути наибольшего сопротивления.</title>
		<link>http://victorronin.com/2011/04/01/po-puti-naibolshego-soprotivleniya/</link>
		<comments>http://victorronin.com/2011/04/01/po-puti-naibolshego-soprotivleniya/#comments</comments>
		<pubDate>Fri, 01 Apr 2011 17:57:27 +0000</pubDate>
		<dc:creator>Victor Ronin</dc:creator>
				<category><![CDATA[Код и программистское]]></category>

		<guid isPermaLink="false">http://victorronin.com/?p=767</guid>
		<description><![CDATA[У меня такое впечатление, что у меня где-то в генокоде прописано то, что я постоянно в программировании двигаюсь по пути наибольшего сопротивления. То есть, если мне нужно сделать, что-то с новой (для меня) технологией, то я последовательно наступаю на ВСЕ грабли, который можно найти. Сегодняшний пример. Мне нужно написать небольшой Servlet (условно говоря 1 страница [...]]]></description>
			<content:encoded><![CDATA[<p>У меня такое впечатление, что у меня где-то в генокоде прописано то, что я постоянно в программировании двигаюсь по пути наибольшего сопротивления.</p>
<p>То есть, если мне нужно сделать, что-то с новой (для меня) технологией, то я последовательно наступаю на ВСЕ грабли, который можно найти.</p>
<p>Сегодняшний пример.<br />
Мне нужно написать небольшой Servlet (условно говоря 1 страница кода) и отмерять jMeter&#8217;ом его быстродействие. Ну блин, что может быть проще?</p>
<p>Ан&#8230; нет. Учитывая, что сервлеты я писал дааавно (да и JSP&#8217;шки, разве что самые простенькие делал), то естественно я успел наткнуться на странные грабли.</p>
<p>Посылаю POST (из jMeter), а в Servlet приходит GET. Ладно, сделал HTML, посылаю форму POST, все равно зараза приходит GET. В общим, в инете рылся, ничего не нашел по этому поводу. Плюнул, Нашел пример сервлета, запустил &#8211; для него таки приходит POST. </p>
<p>Ok. Ищем разницу. Нашел таки. Оказывается, в порыве страсти, когда я делал servlet-mapping, то url-pattern я указал &laquo;/&raquo;<br />
Соотвественно, весь URL у меня должен выглядеть так &laquo;http://localhost:8080/<war name>/&raquo;. А я вместо этого и в jMeter и в HTML написал &laquo;http://localhost:8080/<war name>&raquo; (без последнего слеша). </p>
<p>И вот эта зараза, вместо того, чтобы послать меня нафиг или работать нормально, решила, что вместо POST, она будет делать GET, а все параметры выкинем в окно.</p>
<p>Бац-бац-бац головой об стену.</p>
<p>Доктор, дайте мне пилюль от граблей.</p>
]]></content:encoded>
			<wfw:commentRss>http://victorronin.com/2011/04/01/po-puti-naibolshego-soprotivleniya/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Вопрос по JNI и JEE к джавистам.</title>
		<link>http://victorronin.com/2011/03/23/vopros-po-jni-i-jee-k-dzhavistam/</link>
		<comments>http://victorronin.com/2011/03/23/vopros-po-jni-i-jee-k-dzhavistam/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 21:44:37 +0000</pubDate>
		<dc:creator>Victor Ronin</dc:creator>
				<category><![CDATA[Код и программистское]]></category>

		<guid isPermaLink="false">http://victorronin.com/?p=753</guid>
		<description><![CDATA[Условия: а) Есть DLL в которой нужная нам функциональность б) Есть самописанная JNI обертку (проверил на JSE &#8211; работает на ура) в) Есть JBoss на виндах Вопрос: в) Как бы по правильному использовать JNI в JEE envinronment (под JBoss). То, что написано дальше, может быть чушью, так как опыта в этом ноль без палочки и [...]]]></description>
			<content:encoded><![CDATA[<p>Условия:<br />
а) Есть DLL в которой нужная нам функциональность<br />
б) Есть самописанная JNI обертку (проверил на JSE &#8211; работает на ура)<br />
в) Есть JBoss на виндах</p>
<p>Вопрос:<br />
в) Как бы по правильному использовать JNI в JEE envinronment (под JBoss).</p>
<p>То, что написано дальше, может быть чушью, так как опыта в этом ноль без палочки и дай бог день чтения форумов.<br />
Так, что прошу не судить строго.</p>
<p>Из того, что я прочел и понял<br />
- Если у нас что-то крешится в DLL, то падает весь сервер.<br />
- Если Java класс делающий System.LoadLibrary загружен одним ClassLoader&#8217;ом, то если второй ClassLoader попытается<br />
загрузить тот же класс, то оно не сможет загрузить DLL, так как DLL уже загружен в процессе (особенность винды) и поэтому не сможет использовать JNI интерфейсы.<br />
- Как я понял, по спецификации EJB не работают с JNI. С другой стороны, в нескольких местах прочел, что работаю, но с ограничениями. </p>
<p>Пару идей которые встречал<br />
а) Сделать C++ приложение JMS enabled. И общаться из приложения в app server с этим JMS enabled приложение<br />
б) Поднять отдельный сервер и общаться через RMI.<br />
в) Сделать adaptor (JavaEE connector architecture). Это опцию я понял хуже всего, но зато похоже она наиболее правильная.</p>
<p>Ну и еще раз повторю вопрос, только теперь чуть более развернуто. Как бы сделать это по правильному? Какие есть еще подводные камни о которых нужно знать (так как хочется не только сделать правильно, но и понимать, почему это правильно). </p>
]]></content:encoded>
			<wfw:commentRss>http://victorronin.com/2011/03/23/vopros-po-jni-i-jee-k-dzhavistam/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>По следам опыта создания DLL&#8217;ек.</title>
		<link>http://victorronin.com/2011/03/18/po-sledam-opyta-sozdaniya-dllek/</link>
		<comments>http://victorronin.com/2011/03/18/po-sledam-opyta-sozdaniya-dllek/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 21:45:58 +0000</pubDate>
		<dc:creator>Victor Ronin</dc:creator>
				<category><![CDATA[Код и программистское]]></category>

		<guid isPermaLink="false">http://victorronin.com/?p=747</guid>
		<description><![CDATA[Ну, что может быть сложного в написании DLL? Ну пишем код, помечаем функции которые экспортируются, компилируем&#8230; вуаля&#8230; готово. Ну, это естественно на бумаге, а в жизни, как оказалось множество оврагов. Очень быстро и поверхностно (все пишется с точки зрения C/C++, но на самом деле актуально фактически для всего из чего можно собрать DLL) - Ну [...]]]></description>
			<content:encoded><![CDATA[<p>Ну, что может быть сложного в написании DLL? Ну пишем код, помечаем функции которые экспортируются, компилируем&#8230; вуаля&#8230; готово. </p>
<p>Ну, это естественно на бумаге, а в жизни, как оказалось множество оврагов. Очень быстро и поверхностно (все пишется с точки зрения C/C++, но на самом деле актуально фактически для всего из чего можно собрать DLL)</p>
<p>- Ну начнем с простого факта. В DLLMain нельзя делать много из того, что можно делать в многих других местах.<br />
а) Вызывать LoadLibrary, FreeLibrary<br />
б) Работать с Registry<br />
в) Работать с потоками и процессами. (Создавать потоки можно, но ждать их нельзя)<br />
г) Использовать API, которые предоставляются не Kernel32.dll<br />
д) И само собой нельзя делать все то, что использует вышеперечисленные вещи. Например нельзя использовать COM</p>
<p>- Увы, факт ограничений в DLL написал маленькими буквами где-то на 5 странице документации. Еще хуже то, что зачастую все будет работать нормально, до тех пор пока вам какой-нибудь заказчик не пришлет баг, которые повторяется в 30% случаев, когда луна находится в перегелии и не зная этих ограничений можно долго и счастливо все это дебажить.</p>
<p>- Ладно. С ограничениями разобрались. Если нам что-то надо будет сделать, мы создадим потом, который сделает эти операции или сделаем глобальную переменную объекта, в конструкторе которого сделаем все что нам надо. Правильно? Бззззз&#8230; Ответ не правильный.<br />
а) Если мы создаем поток и не ждем его (так как ждать нельзя), мы не можем быть уверенными что DllMain уже закончится, так что мы просто создали race condition и проблемы стали еще более тяжело воспроизводимы<br />
б) Глобальные переменные и статические члены классов инициализируются и деинициализируются внутри DllMain. Хотя это с ходу не видно, но если полезть в CRT, то это станет понятно. Таким образом, описанные ограничения касаются также конструкторов и деструкторов.</p>
<p>- Итого, имеем, чтобы по честному сделать какую-ту серьезную инициализацию, то нужно иметь функцию в нашей DLL которую клиент вызовет и там мы сделаем все сложные действия. Аналогично, кстати для деинициализации.</p>
<p>- Особенно все прикольно становится, когда мы пишем DLL которую будет впихивать в чужие процессы с помощью SetWindowHookEx или просто plugin&#8217;ы к какой-то системе. В обоих случаях, интерфейс может быть заранее определен и там нету функций инициализации и деинициализации. Соотвественно, не ясно что делать.</p>
<p>- Ok. Поздняя инициализация нам поможет насчет инициализации. То есть когда-то кто-то вызовет первый из интерфейсов, мы сделаем все сложные действия. А что делать с деинициализацией? В отличии поздней инициализации, ранней деинициализации не существует то? На это увы, общего ответа я не нашел и в каждом случае, нужно искать свое решение. </p>
<p>- Следующая особенность состоит в том, что все потоки созданные в DLL на самом деле принадлежат процессу. То есть если вдруг DLL будет выгружена из памяти (потому что вызывающий процесс сделал FreeLibrary и DLL counter стал равным 0), то внезапно адресное пространство где была DLL будет высвобождено. А поток останется __ЖИВ__. То есть он попытается выполнить свою следующую операцию, для этого попытается считать следующую команду из адресного пространства где была DLL и мгновенно закрешится. Скажите прекрасно?</p>
<p>- Ok. То есть нам надо остановиться все потоки, которые мы создали в DLL перед тем, как она будет выгружена и это при том, что мы еще даже точно не знаем, как нам запустить какой-то код перед выгрузкой, причем в момент, где нет ограничений. А да, и я еще молчу о том, что написать нормальный thread manager который обрабатывает достаточно большое количество разных ситуаций не вызывая dead lock&#8217;ов и race condition, задача в целом не тривиальная.</p>
<p>- Так&#8230; Что там у нас дальше. Ага. Вам нужно использовать COM? Само собой вы привыкли к CoInitialize(Ex) и побежали. Только вот, есть одна проблема. Если вы это делаете в DLL то вы исполняетесь в чужом потоке и у потока уже может быть инициализирован COM, причем не в том режиме (STA vs MTA) в котором вам нужно. Что делать? Создавать отдельный поток в котором выполнять все COM действия. </p>
<p>- Единственное пожалуй из положительного. Многое из того, что я писал относится к выгрузке DLL системой. Есть простой трюк, как удостовериться, что система никогда не выгрузит ваш DLL (исключая закрытие программы). Все что вам нужно сделать в DLL это вызывать GetModuleHandle(Ex). Это добавит 1 к DLL counter&#8217;у и можно не беспокоиться, что counter когда-либо вернется к нулевому значению.</p>
<p>- А еще во время выхода из процесса, система убивает все потоки, причем поток мог быть посередине модифицирования каких-нибудь данных (внутри критической секции). Еще приятней то, что он мог быть внутри функции работы с heap и таким образом heap будет в inconsistent state. И поэтому лучше не делать ничего хитрого (а по возможность вообще ничего) в DLLMain DLL_PROCESS_DETACH и в деструкторах глобальных объектов (взято отсюда: http://blogs.msdn.com/b/oldnewthing/archive/2007/05/03/2383346.aspx</p>
<p>Вроде все, хотя может что-то еще вспомню.</p>
]]></content:encoded>
			<wfw:commentRss>http://victorronin.com/2011/03/18/po-sledam-opyta-sozdaniya-dllek/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Поборол опенсорсофобию.</title>
		<link>http://victorronin.com/2011/01/07/poborol-opersorsofobiyu/</link>
		<comments>http://victorronin.com/2011/01/07/poborol-opersorsofobiyu/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 20:53:28 +0000</pubDate>
		<dc:creator>Victor Ronin</dc:creator>
				<category><![CDATA[Код и программистское]]></category>
		<category><![CDATA[Мысли вслух]]></category>

		<guid isPermaLink="false">http://victorronin.com/?p=711</guid>
		<description><![CDATA[Раньше, я очень с опаской относился к open source (в смысле, лезть в код, чтобы разобраться как оно работает или не дай бог исправить какой-то баг). За последние пол года, покопался с хорошей кучей всякого open source: - Apache - OpenSSL - Ruby - BouncyCastle - EJBCA и еще с некоторым количеством менее известных вещей. [...]]]></description>
			<content:encoded><![CDATA[<p>Раньше, я очень с опаской относился к open source (в смысле, лезть в код, чтобы разобраться как оно работает или не дай бог исправить какой-то баг).</p>
<p>За последние пол года, покопался с хорошей кучей всякого open source:<br />
- Apache<br />
- OpenSSL<br />
- Ruby<br />
- BouncyCastle<br />
- EJBCA<br />
и еще с некоторым количеством менее известных вещей.</p>
<p>Ну, что.. Боязнь лезть в код исчезла. Плюс, даже кинул авторам проектов пару пофиксов, багов, которые по ходу нашел.</p>
<p>Те проекты, которые распространненые, обычно очень неплохо написаны &#8211; нормальная архитектура и код, так что разобраться можно.</p>
<p>Единственное, с чем я по прежнему не согласен, это то, что код &#8211; лучшая документация. Лично для меня, лучшая документация &#8211; графические диаграммы, дающие взгляд с высоты птичьего полета на систему, плюс хорошие описание public API. Детали, действительно проще таки подчерпнуть из кода.</p>
]]></content:encoded>
			<wfw:commentRss>http://victorronin.com/2011/01/07/poborol-opersorsofobiyu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Какое же унылое гавно это программирование под iPhone.</title>
		<link>http://victorronin.com/2010/12/02/kakoe-zhe-unyloe-gavno-eto-programmirovanie-pod-iphone/</link>
		<comments>http://victorronin.com/2010/12/02/kakoe-zhe-unyloe-gavno-eto-programmirovanie-pod-iphone/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 21:30:04 +0000</pubDate>
		<dc:creator>Victor Ronin</dc:creator>
				<category><![CDATA[Код и программистское]]></category>

		<guid isPermaLink="false">http://victorronin.com/?p=693</guid>
		<description><![CDATA[Несколько недель уже вожусь с программирование под iPhone. Почему-то складывается настойчивое желание купить билет на самолет и прийти в офис Appl&#8217;а с бейсбольной битой. Из того, что наболело - Управление памятью в Objective C какой-то странный изврат. С одной стороны вроде reference counter, а с другой стороны извольте ручками добавлять, убавлять, прописывать правильные атрибуты пропертям. [...]]]></description>
			<content:encoded><![CDATA[<p>Несколько недель уже вожусь с программирование под iPhone. Почему-то складывается настойчивое желание купить билет на самолет и прийти в офис Appl&#8217;а с бейсбольной битой.</p>
<p>Из того, что наболело</p>
<p>- Управление памятью в Objective C какой-то странный изврат. С одной стороны вроде reference counter, а с другой стороны извольте ручками добавлять, убавлять, прописывать правильные атрибуты пропертям. </p>
<p>- XCode 3 расчитан на чертовых ниндзь. Кучу наиболее часто используемой функциональности (а-ля запуск программы или build) висит на комбинации из трех кнопок, вместо одной (или максимум двух). Постоянно приходится мудры какие-то руками выделывать.</p>
<p>- XCode 4 гораздо лучше в использовании клавиш, но он явная beta и крешится на любой чих и при отладке частенько теряет стрелочку, что же мы сейчас отлаживаем.</p>
<p>- Куча системных API возвращает, что операция не удалась, но не возвращает ошибки (и как я понимаю, нету эквивалента GetLastError)</p>
<p>- Куча API крешится при передаче каких-то не совсем подходящих значений. Блин, а слабо входные параметры проверять и не крешиться? Особенно радует, когда это происходит при передаче<br />
параметров только что полученных из другой системной функции.</p>
<p>- API растасовано так, что черт ногу сломит. Естественно чтение из файла и URL нужно запихнуть в NSString. Божественно&#8230; может запихнем в NSString вообще все функции, которые возвращают строки? </p>
<p>- Security framework с которым мне надо работать урезан по самое нехочу. При том, что я четко знаю, что API эти в библиотеки есть и пользуются внутренними программами.</p>
<p>Уххх&#8230; Поубивал бы.</p>
]]></content:encoded>
			<wfw:commentRss>http://victorronin.com/2010/12/02/kakoe-zhe-unyloe-gavno-eto-programmirovanie-pod-iphone/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Хакинтош</title>
		<link>http://victorronin.com/2010/11/27/xakintosh/</link>
		<comments>http://victorronin.com/2010/11/27/xakintosh/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 00:22:08 +0000</pubDate>
		<dc:creator>Victor Ronin</dc:creator>
				<category><![CDATA[Код и программистское]]></category>

		<guid isPermaLink="false">http://victorronin.com/?p=690</guid>
		<description><![CDATA[Люди, а кто-нибудь серьезно занимался разработкой под iPhone на Hackintosh&#8217;е (а еще лучше на VM&#8217;ке MacOS)? Поделить впечатлениями о а) Стабильности б) Проблемах в) Насколько оно нормально работает с внешними устройства (а-ля Debug через USB)]]></description>
			<content:encoded><![CDATA[<p>Люди, а кто-нибудь серьезно занимался разработкой под iPhone на Hackintosh&#8217;е (а еще лучше на VM&#8217;ке MacOS)?</p>
<p>Поделить впечатлениями о<br />
а) Стабильности<br />
б) Проблемах<br />
в) Насколько оно нормально работает с внешними устройства (а-ля Debug через USB)</p>
]]></content:encoded>
			<wfw:commentRss>http://victorronin.com/2010/11/27/xakintosh/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Строки.</title>
		<link>http://victorronin.com/2010/11/03/stroki/</link>
		<comments>http://victorronin.com/2010/11/03/stroki/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 22:47:01 +0000</pubDate>
		<dc:creator>Victor Ronin</dc:creator>
				<category><![CDATA[Код и программистское]]></category>

		<guid isPermaLink="false">http://victorronin.com/?p=679</guid>
		<description><![CDATA[Забавная штука строки в программировании. Ну, что может быть проще &#8211; есть строка, ее куда-то передать и сохранить. Какие могут быть вообще проблемы с этим? Как показывает опыт, гигантское количество может быть проблем. Ну начнет с того, что есть куча кодировок: всякие UTF-8, Windows-1251, ASCII, ANSI? Если вы не совсем понимаете откуда растут ноги, то [...]]]></description>
			<content:encoded><![CDATA[<p>Забавная штука строки в программировании. Ну, что может быть проще &#8211; есть строка, ее куда-то передать и сохранить. Какие могут быть вообще проблемы с этим?</p>
<p>Как показывает опыт, гигантское количество может быть проблем.</p>
<p>Ну начнет с того, что есть куча кодировок: всякие UTF-8, Windows-1251, ASCII, ANSI? Если вы не совсем понимаете откуда растут ноги, то почитайте <a href="http://www.joelonsoftware.com/articles/Unicode.html">тут</a>. </p>
<p>Кстати. еще приятная вещь, которая наложилась поверх всех этих UTF-16 это little-endianess и big endianess (можно почитать <a href="http://en.wikipedia.org/wiki/Endianness">тут</a>).</p>
<p>Но это еще все. Еще приятная штука, что куча программ/форматов используют специальные разделители для своих внутренних нужд.Ну например sheel в Unix использует | для pipes, да в Windows/DOS command line она тоже вроде используется. Соответственно, люди придумали escape символы, чтобы показать, что символ пользуется не в переносном (специальном смысла), а<br />
прямом. К этому еще добавилось разделитель слов (пробел) и кавычки (как метод показать, что пробел не специальный знак).</p>
<p>К чему это я? Да прост убил фактически день на отслеживание следующей ситуации.</p>
<p>Installer использует<br />
Command line и вызывает<br />
Ruby script (с параметрами), который использует<br />
Command line и вызывает<br />
Java (c параметрами), которая вызывает какой-то<br />
Java bean (внутри одного большого проекта), который читает и пишет<br />
DB, а также создает<br />
Certificate.</p>
<p>Из этого все Command line не любит определенные символы.<br />
DB не любит определенные символы.<br />
Certificate не любит определенные символы<br />
Большой продукт пытается примерить некоторые входные параметры с тем, что не любит DB и Certificate. Но примеряет не все, не до конца и не совсем по стандарту. Плюс благодаря<br />
этому он еще и херит некоторое количество того, что должно было работать для Certificate.</p>
<p>В общем, выдайте мне машину времени, нужно срочно вернуться на 50 лет назад и выдать им единый метод<br />
а) Хранения integer в памяти<br />
б) Encoding строк<br />
в) Использования разделителей и escape characters<br />
г) Правил по работе с строками вот в таких вот стеках.</p>
]]></content:encoded>
			<wfw:commentRss>http://victorronin.com/2010/11/03/stroki/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Количество unitTest&#8217;ов</title>
		<link>http://victorronin.com/2010/09/17/kolichestvo-unittestov/</link>
		<comments>http://victorronin.com/2010/09/17/kolichestvo-unittestov/#comments</comments>
		<pubDate>Fri, 17 Sep 2010 16:56:45 +0000</pubDate>
		<dc:creator>Victor Ronin</dc:creator>
				<category><![CDATA[Код и программистское]]></category>

		<guid isPermaLink="false">http://victorronin.com/?p=653</guid>
		<description><![CDATA[Люди, а как вы выбираете количество unittest&#8217;ов, которое писать? С одной стороны, вроде чем лучше покрытие &#8211; тем лучше. С другой стороны unitTest&#8217;ы &#8211; это тоже код, который при изменении основного кода нужно поддерживать. Опять же, для небольшого классика на несколько килобайт кода, зачастую можно наколбасить кучу тестов, которые будут проверять кучу разнообразных граничных условий. [...]]]></description>
			<content:encoded><![CDATA[<p>Люди, а как вы выбираете количество unittest&#8217;ов, которое писать?</p>
<p>С одной стороны, вроде чем лучше покрытие &#8211; тем лучше. С другой стороны unitTest&#8217;ы &#8211; это тоже код, который при изменении основного кода нужно поддерживать.</p>
<p>Опять же, для небольшого классика на несколько килобайт кода, зачастую можно наколбасить кучу тестов, которые будут проверять кучу разнообразных граничных условий.</p>
<p>Собственно говоря, как вы выбираете, когда остановиться?</p>
]]></content:encoded>
			<wfw:commentRss>http://victorronin.com/2010/09/17/kolichestvo-unittestov/feed/</wfw:commentRss>
		<slash:comments>53</slash:comments>
		</item>
		<item>
		<title>Поиск исполнителей (мысли вслух).</title>
		<link>http://victorronin.com/2010/09/13/poisk-ispolnitelej-mysli-vslux/</link>
		<comments>http://victorronin.com/2010/09/13/poisk-ispolnitelej-mysli-vslux/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 21:50:47 +0000</pubDate>
		<dc:creator>Victor Ronin</dc:creator>
				<category><![CDATA[Время]]></category>
		<category><![CDATA[Деньги]]></category>
		<category><![CDATA[Код и программистское]]></category>

		<guid isPermaLink="false">http://victorronin.com/?p=648</guid>
		<description><![CDATA[Недавно у меня появилась идея небольшого проектика. Так ничего особенного, можно сказать забава с какими-то минимальными возможностями вдалеке. Для проектика нужен небольшой сайт&#8230; ну скажем 3-5 страничек, точное количество пока не совсем понятно, но что-то в этом диапазоне. Ну и какой-то не сложный дизайн. Подумал и решил выдать это дело на RentACoder. Выложил и получил [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно у меня появилась идея небольшого проектика. Так ничего особенного, можно сказать забава с какими-то минимальными возможностями вдалеке. Для проектика нужен небольшой сайт&#8230; ну скажем 3-5 страничек, точное количество пока не совсем понятно, но что-то в этом диапазоне. Ну и какой-то не сложный дизайн.</p>
<p>Подумал и решил выдать это дело на RentACoder. Выложил и получил эдак 30 bid&#8217;ов и немножко был поражен. Начинаются bid&#8217;ы от $400 и заканчиваются $3k.<br />
Те кто были на нижней стороне диапазона имеют либо достаточно фиговые отзывы, либо не имеют их вообще. По моему опыту заказывать у них &#8211; это выстрел себе в ногу. Боли много, толку мало.</p>
<p>ok. Смотрим на тех, кто может сделать это профессионально и достаточно хорошо (люди, которые имеют достаточно много отзывов и уже работали над такими же проектами). Ух&#8230; $1.5-$3K. Мдя&#8230; Я конечно хочу этот проектик, но если вдуматься то, я в результате получу просто сайт, который нужно еще раскручивать и т.п. Собственно, я получу очень небольшую кучку кода и дизайн, взамен я должен отдать эквивалент, скажем недельной поездки с женой на Гаваи. </p>
<p>Я вполне понимаю, что скажем для Москвы $500 &#8211; это уже не деньги. И ясно, что человеку там для хорошей жизни нужно делать уже некоторое количество таких проектов. Однако, RentACoder сайт всемирный и Вася Пупкин живущий где-нибудь в небольшом городке в Малазии, зарабатывая $1000 в месяц будет чувствовать себя местным королем. </p>
<p>В целом, чувствуется некая взвинченность нижнего ценового диапазона. Кстати, я вполне осознаю, что при этом есть задавленность вниз среднего ценного диапазона (на большинство средних проектов идет дикая конкуренция).</p>
<p>В целом, пока проектик лежит на полке. Делать его самому мне совсем сейчас не светит, времени мало и веб опыт достаточно ограниченный, поэтому осознаю, что убью времени гораздо больше, чем хотелось бы.</p>
]]></content:encoded>
			<wfw:commentRss>http://victorronin.com/2010/09/13/poisk-ispolnitelej-mysli-vslux/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>По поводу рабочего графика программистов.</title>
		<link>http://victorronin.com/2010/08/29/po-povodu-rabochego-grafika-programmistov/</link>
		<comments>http://victorronin.com/2010/08/29/po-povodu-rabochego-grafika-programmistov/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 16:52:29 +0000</pubDate>
		<dc:creator>Victor Ronin</dc:creator>
				<category><![CDATA[Код и программистское]]></category>

		<guid isPermaLink="false">http://victorronin.com/?p=616</guid>
		<description><![CDATA[Один из читателей блога задал вопрос: Как лучше всего распределять время и рабочий график программиста? Я это спрашиваю в связи с тем, что в последнее время стал замечать, что совершенно не могу работать в офисе. Меня эта обстановка сковывает и я целый день занимаюсь фигнёй и ковыряюсь в интернете. Но совершенно по-другому обстановка выглядит дома. [...]]]></description>
			<content:encoded><![CDATA[<p>Один из читателей блога задал вопрос:</p>
<blockquote><p>Как лучше всего распределять время и рабочий график программиста?</p>
<p>Я это спрашиваю в связи с тем, что в последнее время стал замечать, что совершенно не могу работать в офисе. Меня эта обстановка сковывает и я целый день занимаюсь фигнёй и ковыряюсь в интернете. Но совершенно по-другому обстановка выглядит дома. Тут я могу сосредоточенно думать, могу писать код по 4-5 часов подряд. И всегда, самые интересные мысли приходят когда я занимаюсь совершенно посторонними вещами.</p>
<p>В общем, если предоставить мне некую свободу, мне кажется я принесу больше пользы компании, потому что смогу больше думать и больше создавать, не находясь в рамках офисной обстановки.</p>
<p>Не уверен, но думаю не у одного меня такое ощущение: приходишь на работу работать, потому что это надо не тебе, а директору. Хотя хочется приходить на работу творить и создавать новое, ради удовольствия. </p></blockquote>
<p>Как я понимаю, под &laquo;распределять время/рабочий график&raquo; имелось в виду &laquo;когда, где и как&raquo; работать.</p>
<p>Разобью вопрос на несколько частей.</p>
<p>1) Есть ли единый (и самый лучший) метод работы, который подойдет всем?<br />
2) Какие методы хороши для каких видов работы?<br />
3) Куда послать директора или что нужно фирме?<br />
4) Творить или не творить?</p>
<p>Итак пойдем по пунктам.</p>
<p>1) Есть ли единый (и самый лучший) метод работы, который подойдет всем?</p>
<p>Бьюсь об заклад, это будет единственный вопрос, по которому все сойдутся в мнениях. Единственного и правильного решения не существует. Один человек &laquo;сова&raquo; и ему хорошо работать вечером, другой &laquo;жаворонок&raquo; и ему хорошо работать утром. Кто-то быстрее заныривает в работу, а кто-то буквально из-за мелкого внешнего раздражителя выпадает и долго не может сосредоточиться.</p>
<p>Так, что скорее важно разобраться какой метод работы подходит лучше для вас. Что подводить нас к второму пункту.</p>
<p>2) Какие методы хороши для каких видов работы?</p>
<p>Я бы сказал, что есть два типа программистской работы: требующая концентрации и требующая коммуникации. Решение сложный задач, добавление большего количество &laquo;мяса&raquo; на скелет, отладка &#8211; требует концентрации. Создание архитектуры, работа с QC, интеграция, планирование требует коммуникации.</p>
<p>Ну и логично, что в зависимости от того, что вы делаете (в основном и прямо сейчас) гораздо выгоднее быть либо в тихом закрытом помещении (офисе, домашней обстановке) или в комнате где сидят другие люди с которыми вам нужно общаться.</p>
<p>3) Куда послать директора или что нужно фирме?</p>
<p>Если вы работаете в обстановке, которая не подходит для вашего типа деятельности, то это может обозначать несколько вещей<br />
Категория недопонимание:<br />
- вы делаете не тот тип деятельности который от вас на самом деле от вас ожидали (например, вы &#8211; team lead и должны со всеми общаться, а вы хотите на неделю запереться дома и активно педалить код)<br />
- просто ваше начальство не осознает, что вы могли бы быть более продуктивным работая по другому.</p>
<p>Тут, все просто. Вы идете и в спокойной обстановке обсуждаете, как сделать так, чтобы и вы и фирма выиграли (вы получили более подходящий метод работы. фирма получила более эффективного программиста).</p>
<p>Категория несоответствие:<br />
- вы осознаете, что от вас хотят (например сосредоточение на коде), но вы хотите совсем другого (team leader&#8217;ство с постепенным переходом в менеджеры)<br />
- вашей компании может не быть прямой выгоды от того, что вы работаете эффективно (например для тех компаний которые берут внешние проекты c time&#038;material оплатой, может складываться ситуации, когда выгодно чтобы программист делал как можно дольше (естественно удерживая это ниже уровня, когда заказчик уйдет)</p>
<p>Это уже слегка похуже. Но, в целом, опять же, можно пойти к начальству и попытаться найти какое-то разумное решение. Хотя тут оно уже не всегда возможно.</p>
<p>Категория конфликт:<br />
- вы и компания хотите чего-то одного (например эффективности), а ваш прямой начальник хочет чего-то совсем другого (минимального напряжения на работе, при игнорировании целей фирмы).</p>
<p>В общем решать такую ситуацию, что плевать против ветра. Силы уйдет много, а результат будет один &#8211; сами себя оплюете. Я бы рекомендовал вместе вложения сил в военные действия внутри фирмы, спокойно разослать ваше резюме и найти другое место работы. </p>
<p>Кстати, еще одно замечание по поводу сосредоточения. Я сам по себе знаю, частенько начинаешь копаться в инете, когда просто не хочется за что-то браться. В таком случае, лучше себя заставить из зачастую быстрее сделать не слишком вкусную задачу, чем пол дня мусолить и откладывать ее.</p>
]]></content:encoded>
			<wfw:commentRss>http://victorronin.com/2010/08/29/po-povodu-rabochego-grafika-programmistov/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

