Friday, April 11, 2008

С Днем Космонавтики!

Много-много лет назад советский космонавт Юрий Гагарин первым вышел в открый космос:

Image Hosted by ImageShack.us

Всех с Днем Космонавтики!

Image Hosted by ImageShack.us

Проблемы телевидения с точки зрения рядового пользователя

Кросс-пост с персонального блога...
--- 

Я уже писал раньше, что телевидение испытавает серьезные проблемы, в частности с получением рекламы, на которую оно живет. Почему? Потому что аудитория падает и фрагментируется, так что даже самые успешные шоу не собирают того количества зрителей, которые они собирали, скажем, в 60-х или 70-х.

Как и обещано в предыдщуей статье «Идиотский компьютер как телевизор будущего» - этот пост является первым в серии из трех и посвящен мотивации перехода с телевидения на Интернет с бытовой точки зрения рядового пользователя. Так что откровений здесь не ждите, хотя и скорее всего будет много вещей, с которыми легко согласиться.

Итак, в моем доме телевидения практически нет. Есть кабель, самый базовый, с несколькими публичными каналами, только для того чтобы знать новости о закрытии школ в снежные дни, как дублирующий канал к Интернету и радио. Вот и все. Причем, физический кабель как правило не воткнут в телевизор, поскольку в то же гнездо сын обычно втыкает свои игровые приставки. Так почему?

  1. Неинтересно. Сотни каналов, а смотреть нечего. Мура всякая, на которую времени жалко.
  2. Времени нет. После рабочего дня в 10-12 часов не хочется тратить время ужина на всякую дрянь. См. пункт 1.
  3. Вредно. Новостные каналы накачивают нервы, все чтобы запугать обывателя. Вредно влияет на адреналин и состояние сердечно-сосудистой и нервной системы, что в условиях постоянной переработки и усталости совсем нежелательно.
  4. Рассчитано на идиотов. Так что не только скучно, но и противно.
  5. Рупор пропаганды. «За Обаму голосуют только молодые и неопытные» «Хиллари имеет опыт» «Мы не можем уйти из Ирака, потому что отвечаем за судьбу иракцев...» Чем присобачивать к телевизору дворники, можно просто не включать, или ставить что-то из своей коллекции.
  6. Интернет – интереснее. И сам решаешь, что смотреть, а что нет.
  7. Если хочется что-нибудь посмотреть, всегда под рукой сервисы вроде Netflix, где можно рентовать любые DVD, и смотреть то, что сам хочешь.

Вот такой вот коротенький список. Что это означает для телевидения? Если все больше людей будет согласно хотя бы с частью пунктов выше, телевидение потеряет аудиторию, а развлечения пойдут полностью через Интернет. Что, кажется, вполне логичным сценарием развития событий.

Tuesday, April 8, 2008

Иногда компьютеры вызывают необычно древние эмоции...

Этот DVD drive заставил меня потратить два дня, пытаясь установить разные операционные системы на вполне работающем компьютере и выдавая идиотские ошибки при чтении дисков...

Ах, да, конечно, кросс-пост с моего домашнего блога...

Sunday, April 6, 2008

Чтение HTTP в .Net и Silverlight

Ну-с, для разнообразия сугубо технический пост. Да-да, знаю, тривиально. Не нравится - не ешьте. Просто, кому-то умному, но кому это было на фиг не нужно, будет приятно увидеть что-то готовое, а не вычислять и разбираться. Или, кому-то умному, кому это пару лет не нужно было. Скажем, мне самому через пару лет. В общем, не придирайтесь, вещь тривиальная, но полезная. Даже просто для чисто бытовых потребностей, скажем там, какую онлайн библиотеку книжек скачать...

Итак, для HTTP в .Net и Silverlight есть два главных класса, которые делают примерно одно и то же: HttpWebRequest и WebClient. Пример ниже показывает как использовать их оба (есть мелкие косметические отличия).

 Итак, сначала тестовая программа, которая их будет выполнять:

using System;

namespace HttpCalls
{
     class Program
     {
          static void Main(string[] args)
          {
               HttpWebRequestBased r1 = new HttpWebRequestBased();
               r1.Get("
http://blogs.technet.com/eldar/default.aspx");
               Console.ReadLine();

               WebClientBased r2 = new WebClientBased();
               r2.Get("
http://blogs.technet.com/eldar/default.aspx");
              
Console.ReadLine();

               HttpRequestBasedSync r3 = new HttpRequestBasedSync();
               r3.Get("
http://blogs.technet.com/eldar/default.aspx");
              
Console
.ReadLine();

          }
     }
}

Теперь начнем с последнего - синхронного использования HttpWebRequest:

using System;
using System.Net;
using System.IO;

namespace HttpCalls
{
     class HttpRequestBasedSync
     {
          public void Get(string URL)
          {
               HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(URL);
               HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
               Stream stream = resp.GetResponseStream();
               StreamReader sr = new StreamReader(stream);
               string res = sr.ReadToEnd();
               sr.Close();
               Console.WriteLine("Success. Press any key to see the result:");
               Console.ReadLine();
               Console.WriteLine(res.Substring(0, 500));
          }
     }
}

Простенько и со вкусом... хм-м-м... ну, ладно, о вкусах не спорят! По крайней мере вполне компактно. Кстати, в Silverlight это дело не сработает, там синхронного GetResponseStream нету, чтобы не блокировать UI thread, на котором в Silverlight выполняется почти все интересное. Так что же делать? А делать то же самое асинхронно:

using System;
using System.Net;
using System.IO;

namespace HttpCalls
{
     class HttpWebRequestBased
     {
          public void Get(string URL)
          {
               req = (
HttpWebRequest)HttpWebRequest.Create(URL);
               req.BeginGetResponse(
new AsyncCallback(callback), null);
          }

          private void callback(IAsyncResult ar)
          {
               if (ar.IsCompleted)
               {
                    HttpWebResponse resp = (HttpWebResponse) req.GetResponse();
                    Stream stream = resp.GetResponseStream();
                    StreamReader sr = new StreamReader(stream);
                    string res = sr.ReadToEnd();
                    sr.Close();
                    Console.WriteLine("Success. Result:");
                    //Console.ReadLine();
                    Console.WriteLine(res.Substring(0,500));
               }
          }

          private HttpWebRequest req;

     }
}

К слову, callback вызывается на самом деле ровно один раз, так что не раскатывайте губу на то, чтобы показывать всякие progress bars в процессе. В Silverlight callback вызывается на UI thread, но опять же, учтите, что это может измениться, так что менять UI элементы в этом вызове лучше  избегать. Так... на всякий случай.

Ну и наконец, то же самое асинхронно с WebClient. Этот класс предполагается самым "продвинутым" и "удобынм", так что не удивляйтесь, что он требует больше всего кода.

using System;
using System.Net;
using System.IO;

namespace HttpCalls
{
     class WebClientBased
     {
          public void Get(string URL)
          {
               WebClient client = new WebClient();
               client.DownloadProgressChanged +=
new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
               client.OpenReadCompleted +=
new OpenReadCompletedEventHandler(client_OpenReadCompleted);
               client.OpenReadAsync(
new Uri(URL));
          }

          void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
          {
               if (e.Cancelled || e.Error != null)
               {
                    Console.WriteLine("Error reading the file");
               }
               else
               {
                    Stream stream = e.Result;
                    StreamReader sr = new StreamReader(stream);
                    string res = sr.ReadToEnd();
                    sr.Close();
                    Console.WriteLine("Success. Result:");
                    //Console.ReadLine();
                    Console.WriteLine(res.Substring(0, 500));
               }
          }

          void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
          {
               Console.WriteLine("Progress is {0}, {1}% out of {2} bytes.", e.BytesReceived, e.ProgressPercentage, e.TotalBytesToReceive);
          }
     }
}

Вызывается callback в Silverlight тоже на UI thread, по крайней мере пока что. В Silverlight у вас может случиться вызов client_DownloadProgressChanged с промежуточным прогрессом, в обычном .Net я этого не видел. Впрочем, даже если вызов и случается, вы только узнаете, сколько прочитано, доступа к реальным данным (Stream) у вас все равно нет до тех пор, пока чтение Http ответа не закончится.

В Silverlight во всех трех случаях Stream это по сути wrapper вокруг куска памяти, выделенного в native коде, так что всякие Seek() работают как часы. Очень удобно.

Заметьте, что это все на основании опубликованной информации на данный момент. Когда выйдет бета 2 Silverlight v.2, я опубликую подправленный вариант с изменениями и новыми интересными деталями.

Saturday, April 5, 2008

Где работает бывший дев менеджер группы Windows Home Server...

Приятно иногда заехать в гости к друзьям. Например, к Сереже Солянику. Вот так, выглядит здание Гугла в Сэттле. Точнее, в пригороде Сиэттла на полпути от Редмонда, в Киркланде, где у них тут основное гнездо.

Вообще-то, если быть занудой, значительная часть здания - ай-би-эмовское, это только третий этаж с кафетерием и застекленный курятник на четвертом этаже - гугловский. Это и на паркинге видно:

Забавно, но некоторые гугловцы даже еще не успели снять майкрософтовские паркинг пермиты. Вот взгляните, у этой машины на зеркале заднего обзора висит такая синенькая штучка - это разрешение парковаться у зданий Microsoft. Видать новенький :-) Ну, или тоже, как и я, в гости приехал...

Friday, April 4, 2008

Цена последнего галлона нефти и сверхурочной работы программиста

Да-да, как всегда, кросс-пост с персонального блога... ----

Я уже писал о проблемах, которые сверхурочные создают для организаций и экономики. Забавно, но реакция была немного как бы сказать... demented… «нытье технаря». Ну, да, стал бы я писать пост, чтобы поныть вслух перед аудиторией, которая спит и видит, чтобы сказать что-нибудь язвительное вроде как процитировано выше.

Мое мнение, которое я пытаюсь выразить здесь «сверхурочные в индустрии ПО – зло», причем не только для программистов – кто бы сомневался в этом, это зло для компании, индустрии и экономики в целом.

Если этот уровень рассмотрения вас не устраивает – вы попали не туда. Не доставайте меня тупыми комментариями, что нам за это платят больше, или что если это меня не устраивает, я могу заняться чем-нибудь другим. Вы тоже можете заняться чем-нибудь другим, и лучше бы занялись.

Итак, для тех, кого интересует экономика сверхурочных. Чтобы обьяснить сегодняшнюю мысль, как влияют сверхурочные на экономику производства ПО, мне придется начать с очень отдаленной темы – цены на нефть и эластичности рынков

Эластичность рынков

В классической экономике рынки имеют свойство эластичности. Эластичность рынка означает, что увеличение спроса приводит к увеличению предложения. Хороший пример эластичного рынка – услуги, например, рестораный сервис. Появляется спрос – открываются новые рестораны, поскольку единственный критичиский ресурс – люди, а недостатка в людях, желающих заработать, обычно нет. Экстремальный пример рынка совершенно неэластичного – аукцион картины какого-нибудь знаменитого художника. Независимо от того, сколь высок спрос на эту картину, появление второй точно такой же картины того же самого художника мягко говоря маловероятно.

Эластичные рынки реагируют на повышение спроса незначительным повышением цен, которое достаточно для привлечения инвестиций и расширения рынка, а стало быть и предложения на рыне. Неэластичные рыки реагируют только одним способом – повышением цен до уровня, когда спрос сходит на ноль.

Цена последнего галлона

Рынок нефти в этом плане устроен очень занятно. В мире уже пробурено некоторое количество скважин, из которых хлещет халява – нефть. Эти уже пробуренные скважины определяют доступный размер эластичного рынка нефти. Пока где-то в мире из скважины хлещет нефть, которую никто не купил, вы можете выйти на этотcommodity рынок и купить ее без особого влияния на цену нефти.

Как только последний галлон, который и так вытек из уже пробуреных скважин, продан, следующий галлон стоит значительно дороже. «Значительно» означает ОЧЕНЬ дороже. Ради него нужно проводить геологическую разведку, бурить новые скважины и т.д. Пока что звучит осмысленно, правда?

А дальше начинается самое интресное. В тот момент, когда начинают пытаться купить тот галлон, скважина которого еще не пробурена, цена нефти вообще резко растет. Это называется «ценой последнего галлона» - цена нефти в пределах эластичности рынка меняется очень слабо, как только эластичность рынка исчерпана, она начинает резко расти. По сути, цена последнего галлона определяет цену нефти на мировых рынках.

Это очень важный момент. Как только кто-то захотел купить этот «последний галлон», то есть первый, ради которого придется бурить новые скважины, цена всех других галлонов из уже пробуренных скважин тоже вырастает. Постарайтесь это понять, прежде чем читать дальше. А то мне опять придется чистить глупости в комментариях или публиковать их в назидание другим.

Цена часа программиста

А теперь попробуем приложить те же самые принципы к оплате программиста, как диктуется рынком. Для начала, а как же определяется цена труда? Ответ на данный вопрос был дан еще в девятнадцатом веке Адамом Смитом и Карлом Марксом. Цена труда в определенной индустрии/профессии определяется ценой воспроизовдства трудовых ресурсов. То есть, за человека определенной профессии нужно в среднем, подчеркиваю: в среднем, платить столько, чтобы он был способен содержать себя, иметь детей, вырастить их и дать им образование, чтобы когда он выйдет на пенсию или, что более вероятно в современном мире, умрет, они могли его заменить.

Кстати, у меня одно дите в колледже и второе планирует поступать на следующий год. Я вам скажу честно и уверенно: оплата труда программиста в Америке куда ниже, чем думал Адам Смит. Вот тут-то мы и приходим к «в среднем» (помните, я попросил это запомнить?)

«В среднем» означает, что хотя в среднем эта цена будем именно такой, но локально бизнесы могут «жульничать» и получать ту же самую работу подешевке. Самое популярное жульничество заключается в обворывывании будущих поколений. Нация может платить, например, программистам ниже уровня их воспроизводства, просто через некоторое время у нее не будет этих специалистов и ей придется занять «заднее сиденье» в автомобиле этой конкретной индустрии. Именно это произошло в очень многих областях науки и технологии СССР в результате перестройки. Нация была не готова платить за передовую науку, и теперь ее выбор – либо полностью зависеть от других стран, либо вкладывать огромные средства в ее восстановление и еще большие средства в правоохраниельные органы, чтобы предотвратить их разворовывание. Если в США будут платить программистам как платят мне (да-да, знаю, что при моей зарплате это звучит как выпендреж, но, увы... мое недовольство отдельно, экономические реалии – отдельно), то то же самое произойдет и с Америкой.

Второй способ жульничества заключается в импорте этих работников, чтобы компенсировать потери в результате низкой оплаты труда. В случае Америки и программистов, это выглядит примерно так: женщины в Индии и Китае рожают детей, отправляют их в местные университеты, там они – эти дети – стирают задницу до мозолей и становятся программистами, которых нанимают американские корпорации. При этом работодатели платят не цену детей в Америке, а значительно более низкую цену детей и их образования в Китае и Индии.

Кстати, возможно вас возмутило, что я не упомянул Россию наравне с Индией и Китаем. Увы, вопрос не ко мне, а к российским женщинам, которые по данным статистики (например, CIA fact book) не спешат рожать в том же темпе (а значит, так же дешево), что китайки и индийки. Да-да, я знаю, экономика – очень циничная наука. (Вздох...) В любом случае, будь Россия в этой картинке или нет, идея в том, чтобы вывести производство столь дорогого ресурса как профессионалы в более дешевые страны. Сами судите, хорошо это для экономики или нет. IMHO, outsouring production of smart educated people is probably the dumbest thing any nation can do... Извиняюсь за английский, не то чтобы у меня не хватило слов на русском, чтобы выразить эту мысль, но опубликовать эти слова здесь затруднительно по цензурным соображениям.

Цена последнего часа программиста

Пока программист счастливо (или не очень – кого это заботит?) сидит в Китае, Индии или России, сверхурочные работают. Почему? Потому что на свою, по их мерках великолепную зарплату, он оплачивает не только свое существование, но и нескольких других людей – жену, бабушек, дедушек, в некоторых случах братьев, сестер, других родственников, которые охотно возьмут на себя заботы о всяких мелких, но времяемких проблемах по дому и хозяйству – хождение по магазинам, ремонт квартиры, машины, стояние в очередях, и т.п.

Теперь, предположим, он приехал в Штаты.Он еще стоит ровно по Адаму Смиту с учетом его происхождения в дешевой стране. И менеджер и компания еще могут ему заплатить по этой шкале, если они отпустят его с работы. Но – нет, хороший менеджер в современной корпоративной Америке жаден до халявы. Он смотрит свысока на своего нового подчиненного и тот – будучи воспитаным в очень-дешевой-стране – понимает, что восемь в часов в день – это для лузеров.

И он остается на девятый час. Заметьте, расширеная семья, которая брала на себя бытовые заботы осталась в Индии и Китае. А жена вынуждена тоже работать. Вот он отработал восьмой час. После девяти часов в день он уже не может прибраться в комнате, так что его зарплата за все девять часов включает либо уборку в доме, либо массированый вывоз хлама-мусора раз в полгода.

Затем он остается на десятый час. Теперь его зарплата за каждый – обратите внимание, не за последний, а за каждый час – включает то, что он теперь неспособен сделать – еда теперь доставляется из ресторана, а краны и туалеты чинит специальная служба. Отгадайте, кто за это платит? Ну, да, вроде бы о сам, но в конечном счете фирма, его нанявшая, поскольку это теперь «рыночная цена» программиста.

А потом подходит релиз, и наш китаец или индиец сидит в выходные. Отгадайте, как это влияет на зарпату программиста, которые теперь должен оплачивать приведение двора и лужайки в порядок, услуги садовника, дизайнера двора, чистильщиков ковров, уборщиков, ... Это звучит все «благородно», а по сути это все результат того самого overtime – сверхурочных.

И обратите внимание, что же в результатет выходит? Выигрывает эта ... ну, не будем называть его грубо – менеджер, который заставил людей работать сверхурочно без оплаты. В конце концов, у него тоже не так много выбора, поскольку процессы, описанные в этой статье работают на уровне нации, а не отдельной компании. Проигрывает вся индустрия и нация, вынужденные платить куда большую зарплату, чем оно того стоит. И как вам это?

По сути мы имеем дело с тем же самым явлением, что и цена последнего галлона нефти. Дайте программистам дышать, и они сами будут стричь свои лужайки и прибирать свои задние дворы. Жмите их дальше, и это будут делать команды неквалифицированных, но многочисленных работников. И вы за это будете платить. Цена восьмого часа программиста непропорционально меньше чем цена девятого или десятого часа. И если вы неспособны контролировать свое общество, чтобы девятый, десятый, одиннадцатый или двенадцатый час не были использованы, то вы будете платить цену двенадцатого часа за все двенадцать часов – от первого до двенадцатого каждый день.

А теперь – я знаю, это буйная фантазия – но попытайтесь представить себя на месте CEO компании, где работает этот потогонный менеджер. Вам нравится идея платить значительно больше за час, чем это необходимо? Это то, что вы делаете. Именно потому, что многие люди считают сверхурочные в нашей индустрии нормой.

Enjoy! Ave!

Sunday, March 2, 2008

Как готовиться к интервью в Microsoft?

Как обычно, стандартный дисклеймер... это не истина в послдней инстанции, это всего лишь мое мнение. Куча других людей скажет, что я – идиот и ничего не понимаю в колбасных обрезках. Так что имейте в виду. Просто, поскольку я только что сменил группу, то показалось полезным описать недавний опыт пока помню. В данный переход у меня было три формальных интервью и два официальных предложения. Третья группа сказала, что наверное тоже сделала бы предложение, но уже не успела, поскольку я уже принял одно из двух первых. Так что в целом опыт кажется достаточно успешным. Итак, к делу.

Многие люди с важным видом советуют готовиться к интервью, но никогда не поясняют, что же именно для этого надо делать. А то еще советуют поучить теорию алгоритмов и структуры данных... Позвольте с таким подходом не согласиться. Теорию алгоритмов и структуры данных вы должны знать и так, еще до того как стали рассылать резюме. А если у вас интервью через неделю, то судорожное чтение книжек всего лишь приведет вас к интервью невыспавшимся и с хаосом в голове, где ваши нормальные и надежные знания заслоненны только что прочитанными и еще толком неусвоенными. Что обычно приводит к нелепым ошибкам и дешевому выпендрежу на интервью, который обходится обычно очень дорого.

Соответственно мои рекомендации немного другие, и их мало, всего три пункта:

  1. Расслабьтесь, ложитесь спать вовремя, отвлекитесь от темы и отдохните, чтобы придти в хорошей физической и психической форме. Неплохая идея сходить за день до этого в спортивный клуб, устроить пробежку или погулять по лесу. Главное – чтоб без излишнего напряга и несчастных случаев.
  2. Не волнуйтесь и не дергайтесь. Настройтесь на то, чтобы получить от интервью удовольствие. Воспринимайте это как школьную олимпиаду, где вам дадут кучу интересных задачек порешать.
  3. Если есть настроение и трудно полностью отвлечься, попробуйте немного «разогреться» перед интервью, решая каждый вечер за несколько дней до него по задачке. Это помогает войти в контекст и освежить способ мышления, необходимый для решения задачек. Но не перестарайтесь. Очень важно, чтобы во время интервью вас от задачек не тошнило.

К слову, задачек на форму крышек для люков канализации в MS уже давно на интервью не дают. Задачки на сообразительность бывают, но они всегда связаны с программироанием или математикой. Если вы идете на позицию разработчика, код на доске писать придется и много. Если program manager, то тоже не исключено, хотя может и нет. Зависит от того, какой PM требуется. Тестеры – по-разному. Низкоуровневый тестер-контрактор иногда код и не пишет, разработчик же автоматических тестов писать код должен, хотя упор скорее всего будет на совсем другие вещи.

---

Ах, да, это, конечно же, кросс-пост с моего персонального блога...