понедельник, 22 декабря 2008 г.

Что делать если от монитора быстро устают глаза?

План А

Попробуйте увеличить размер шрифтов. В Windows это можно сделать одним действием, которое почему-то называется “изменением DPI” (я не знаю что такое DPI).

Пошаговые инструкции для  Windows Vista:

1) щелкните правой кнопкой мыши по рабочему столу
2) в появившемся меню выберите пункт Personalise (он последний на любом языке – украинском, например)
3) выберите пункт Adjust font size (он слева со щитом в большинстве языков)
4) выберите Larger scale (120 DPI)
5) щелкните OK

setdpi

Шрифты после изменения становятся крупнее во всех приложениях, и нагрузка на глазки существенно снижается. Привыкнув к “крупным шрифтам” (120 DPI), я  теперь не представляю, как можно работать со стандартным значением (96 DPI). Пять действий на картинке я давно уже делаю сразу после установки ОС.


План Б
Настройте на мониторе яркость и контрастность - см. мой пост про настройку LCD-мониторов.

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

понедельник, 24 ноября 2008 г.

Фотоблог

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

Гугл, где мой интернет?


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

У гугла засорились трубы! Или он дискриминирует меня по принадлежности к Microsoft.
Все это очень неприятно :(

воскресенье, 23 ноября 2008 г.

Как я оказался в Microsoft

Для меня, по крайней мере, смена места работы оказалась событием довольно неожиданным (хотя событие это длилось 5 месяцев). Поэтому здесь я напишу как же я оказался в MS.

Но сначала я расскажу зачем :)
3 основных причины, по которым стоит идти Майрософт:
  • работа сама по себе. Такую работу как здесь найти в России сложно. Это касается и продуктов, над которыми мы работаем, и людей, с которыми мы работаем, и опыта, который здесь приобретается.

  • качество жизни в Ванкувере. Я не знаю что про него написать, любое сравнение получается каким-то непатриотичным.

  • зарплата и бонусы. Чтобы получать за software engineering столько, сколько я получаю в MS, мне бы наверное пришлось работать в Лукойле. Или Газпроме.

Как я устроился в Microsoft?
  • Узнал, когда и где проходят собеседования. Начать искать можно здесь и здесь

  • Подал резюме
    Как писать резюме хорошо написал Steve Yegge

  • Прошел phone interview

  • Прошел on-site interview в московском офисе MS
    Как проходить интервью хорошо написал незаменимый Steve Yegge

  • Пять месяцев после интервью получал разные документы и визы. По моим подсчетам, для переезда в Канаду вам следует поговорить примерно с тремя десятками человек.


Несколько базовых вещей, над которыми следует поработать над интервью:
  • разговорный английский. Будьте готовы рассказать о своей учебе, работе, интересах. Объяснить работу алгоритма, обсудить UML-диаграмму, составить тест-план.
    Если вы считаете, что знаете английский плохо, учите язык. Слушайте подкасты. Смотрите ролики. Я в течении нескольких дней объяснял жене работу алгоритмов сортировки и обсуждал дизайн тостера.

  • знание алгоритмов. Повторите базовые структуры данных, алгоритмы сортировки и поиска. Объясните их работу по-английски.

  • навыки тестирования и разработки: будьте готовы составить план тестирования простенького алгоритма. Обсудить дизайн системы классов. Рассказать о вашем опыте работы с ПО, обсудить конкретные программы. Составьте 50 тестов для алгоритма определения типа треугольника. Какими могут быть 50 тестов можно прочитать в книге Гленфорда Майерса

  • знание команд, проводящих интервью. Перед интервью вы будете знать, какие команды собираются вас взять на работу. Выясните что они делают, какими были их продукты в прошлом, и какие они будут в будущем. Эти знания вам пригодятся если вас пригласят сразу в две-три команды :)

  • soft skills - на интервью будут оцениваться ваш характер, коммуникабельность, инициативность, заинтересованность в работе. В Майкрософт работают *очень заинтересованные* разработкой ПО люди.

  • потренируйтесь писать на доске. Я перед интервью купил маркеры и исписал все стекла в доме.

  • как следует выспитесь. Если вам предлагают ночью перед интервью лететь в другой город, вежливо откажитесь. Можно прилететь за день до интервью.

воскресенье, 16 ноября 2008 г.

XYZibit

Теперь я в Microsoft

За прошедшие полгода в моей жизни произошло нечто, сопоставимое с чудом - мы с женой переехали в Канаду и я начал работать на Microsoft. С 3 ноября сего года я - Software Development Engineer in Test в SQL Server Analysis Services Team, обитающий в Ванкувере.

Ванкувер потрясает. Увы, дальше Москвы и Спб я в своей жизни до этого не бывал, поэтому сравнительной характеристики города я привести не могу. Он просто потрясает - людьми, географией, погодой, возможностями.

Работаю я в Microsoft Canada Development Centre. Информации о нем в интернете так мало, кажется что это режимное предприятие. Это не так, просто сам MCDC существует чуть более года :). Периодически люди здесь порываются учить друг друга английскому, испанскому, португальскому, русскому, французскому, китайскому, румынскому, украинскому, турецкому, и индийскому языку. Постоянных занятий пока не ведется.

О самой работе здесь мне рассказывать сложно, для этого мне придется очень долго собираться с мыслями и стараться не насолить нашим юристам. Если вы сейчас на 4 курсе вуза, очень рекомендую съездить летом на internship в Microsoft, узнаете все сами :). Я этого в свое время не сделал, о чем сейчас жалею.

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

понедельник, 6 октября 2008 г.

Сертификационные экзамены Microsoft

Вам интересны Sharepoint экзамены 70-541, 70-542? Я - основной источник информации по ним в русскоязычном интернете. Нет, правда - google по запросу 70-541 экзамен сейчас цитирует меня во втором результате, сразу после сертификационного центра где эти экзамены сдают.
Что интересно в этом положении - мне постоянно пишут письма и просят рассказать об экзамене поподробнее.
Одно из таким писем меня и подвигло на написание дополнения к моему старому посту по 70-541.

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

Ваши лучшие друзья при ответе на подобные вопросы - хорошее знание английского (с терминологией предметной области экзамена) и здравый смысл. В большинстве вопросов 3 из 4 варианта ответов выглядят как-то коряво, даже если вы изначально не знаете верного варианта.
Идеальный способ подготовки к таким вопросам - читать SDK и зубрить объектную модель. Для Sharepoint есть WSS 3 SDK и MOSS SDK.

Хорошая книжка по Windows Sharepoint Services, которая вам поможет - Inside Microsoft Windows SharePoint Services 3.0.

В экзамене 70-541 я обратил внимание на огромное количество вопросов по WSS feature framework, или Deploying Windows Sharepoint services and custom components. Будьте готовы ответить на довольно узкие вопросы по написанию xml-файлов для feature framework. Вопросы по sharepoint security model тоже есть.

четверг, 18 сентября 2008 г.

Item template для NUnit-тестов в Visual Studio

Какой код я чаще всего пишу?

using NUnit.Framework;
namespace NS.Tests
{
[TestFixture]
 public class SomethingTests
 {
  [Test]
  public void SomethingTrivialTest()

Да, мне это порядком надоело. Visual Studio уже давно содержит набор шаблонов для классов с тестами на VSTS, но для NUnit я таких шаблонов не встречал.
Я сделал самое простое - нашел статью David-а Hayden-а про Custom item templates in Visual Studio, и создал свой шаблон класса с NUnit-тестами.

Для этого достаточно открыть в VS образец такого класса, заменив некоторые переменные именами подстановок - $rootnamespace$ и $safeitemrootname$.



После чего File-Export template-Item template-Выбор файла с шаблоном-Выбор имени шаблона.



Созданный шаблон сам добавится в Visual Studio, если не убирать соответствующую галочку. Результат превзойдет ваши ожидания!



Если вы ленивы, вы можете скачать мой шаблон
и поместить его в My Documents\Visual Studio 2008\Templates\ItemTemplates. Если вам повезет, VS найдет и подключит его сама.

понедельник, 8 сентября 2008 г.

Как я провел лето

Лето я провел вобщем-то бестолково, за исключением нескольких дней.
В один такой день, 28 июня, мы с отцом поездили по Перми и позакрашивали мазню неонацистов.
Картинки

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

суббота, 30 августа 2008 г.

Ошибка сервера? Google ответит в Base64!

Очередной error screen от Google, на этот раз жутковатый:
в случае ошибки работы серверного приложения (в моем случае Blogger ), Google демонстрирует пользователю блок Base64, подозрительно напоминающий дамп памяти:


Да, я знаю что это не дамп памяти :)
Последний раз такие интерфейсы я видел во времена расцвета Delphi. Помните, как программы закрывались с сообщением "Memory read error at 0xDEADBEEFDEADBEEF"?

MSDN с человеческим лицом

Jon Galloway пишет о сверхсекретной разработке Microsoft: MSDN с человеческим лицом, или "low-bandwidth view".
С помощью фильтра loband, добавляемого в url статьи MSDN, её можно загрузить в 10-15 раз быстрее, без мишуры на пол-экрана:

System.String.aspx, 317Кб


System.String(loband).aspx, 14Кб


Low-band представление можно сохранить с помощью cookie (ссылка Persist/switch off low bandwidth view вверху страницы). Или включать по желанию - для этого есть bookmarklet, который с помощью javascript этот cookie устанавливает/сбрасывает.

Выглядит он так:
javascript:
if(document.cookie.indexOf('LoBandEnabled=yes')<0){
document.cookie='LoBandEnabled=yes;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';
}
else{
document.cookie='LoBandEnabled=no;path=/;domain=.microsoft.com;%20expires=Wed,%2001-Aug-2040%2008:00:00%20GMT';
}
window.location.reload();


Установить в браузер его можно так:
Для Firefox/Opera перетащите эту ссылку - MSDN Low Band на панель ссылок.

Для Internet Explorer - в контекстном меню ссылки MSDN Low Band выберите "Add to favorites", и добавьте её в папку со Links.

четверг, 28 августа 2008 г.

понедельник, 18 августа 2008 г.

Project Euler: Problem-a-day keeps dementia away!

Вы пишете слишком мало кода?

Слишком много общения с людьми отвлекает вас от компьютера?

Вы хотите набить руку в использовании незнакомого языка программирования?


Project Euler - это для вас!

Сайт содержит множество математических задач, для решения большинства из которых придется писать алгоритмы. Формулировки задач написаны доступным языком, решение большинства из них возможно при знании арифметики и успешно пройденного курса "Алгоритмы и структуры данных".

В сравнении с соревнованиями Topcoder решение задачек на Project Euler занятие на удивление приятное и расслабляющее.

Из пока решенных мною, самые интересные:
#26 - какое из чисел (1/d), 0<d<1000, имеет самую длинную периодическую часть?

#24 - назовите миллионную по очереди перестановку цифр 0,1,2,3,4,5,6,7,8,9, если все перестановки упорядочены в лексикографическом порядке. (Хотите задачу сложнее? То же самое, но 10^12-ю перестановку из 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)

#20 - назовите сумму всех цифр в десятичной записи числа 100! (сто-факториал)

четверг, 26 июня 2008 г.

Сравнение дат в XPath

Недавно я столкнулся с задачей фильтрации xml-форм с помощью xpath-запросов. Задача вобщем-то простая, если в форме лежат только текстовые строки.

Если в форме есть даты, приходится изголяться - Xpath в System.Xml.XPath.XPathNavigator не умеет сравнивать даты в формате "YYYY-MM-DDT00:00:00.0000000+05:00". Решение этой проблемы найти в поисковике непросто, поэтому пусть оно лежит здесь :)

Фильтрация в моём случае выглядит примерно так: //FormDate[translate(substring-before(., 'T'), '-', '')>'20071231'] возвращает все элементы FormDate с датой в 2008 году и позже.

'20071231' представляет собой результат действия translate(substring-before('2007-12-31T00:00:00.0000000+05:00', 'T'), '-', '')

среда, 18 июня 2008 г.

Map/reduce/filter на С# 3.0

Dare Obasanjo пишет о своём опыте работы с фичами нового C# - Enumerable.Select, Enumerable.Aggregate, Enumerable.Where, понять суть которых без опыта использования функций высшего порядка(high-order functions) сложно.

Каждый объект, реализующий IEnumerable, в C# 3.0 позволяет принимать новые типы вызовов, оперирующих лямбда-функциями.
Некоторые их применения очевидны - IEnumerable.Max(person=> person.Salary) вернет максимальный оклад для списка работников.

Некоторые менее очевидны, особенно если их названия наводят на ложные аналогии с LINQ:
IEnumerable.Select - применяет функцию к списку элементов, возвращает список результатов работы функции. Python для этого имеет более понятное название - map.
IEnumerable.Aggregate - применяет функцию от двух аргументов ко всем элементам списка по очереди, возвращает результат последнего вычисления функции. В Python - reduce.
IEnumerable.Where - возвращает элементы списка, удовлетворяющие условию, задаваемому лямбда-функцией. В Python - filter.

Определенно, сделав синтаксис LINQ "читаемым" и sql-подобным, разработчики C# потеряли выразительность языка в других применениях.

Новые языки

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

Читаю Programming Ruby: The Pragmatic Programmer's Guide, первое издание которой доступно по ссылке. Интерес к этому у меня вызвало огромное количество блогпостов о преимуществах динамических языков, всплывающих теперь буквально повсюду. Steve Yegge со своим Rhino - пример программиста, совершенно фанатичного во всем, что касается языков программирования.

Два утверждения, которые он обосновывает в каждом втором посте -
  • используемый язык имеет значение
  • изучение новых языков может сущеcтвенно увеличить настроение и производительность труда

Показательным мне кажется пример C#, который в версии 3.0 явно пытается угнаться за выразительностью динамических языков. Не совсем это ему удается из-за унаследованного от Java синтаксиса, кажущегося после знакомства с Ruby издевательски пресным и длинным.

Кроме дополнения C#, Microsoft портирует на .net популярные "тру-динамические" языки - Python и Ruby. .Net-порт Ruby, IronRuby, разрабатывается командой John Lam'а. Компилятор IronRuby, доступный в исходниках на RubyForge, работоспособен и вполне себе демонстрирует возможности Dynamic Languages Runtime.

Многое говорит и направление развития технологий web-разработки от Microsoft: ASP.Net MVC Framework продвигают как лучшую альтернативу традиционным WebForms, её же усиленно скрещивают с IronRuby-кодом. Ещё на IronRuby поднимают порт Rails. Так что на IronRuby можно будет писать приложения как на традиционных Rails, так и на "Rails от Microsoft" :)

P.S. нормальный редактор для Ruby-кода с подсветкой синтаксиса и интеграцией с RubyDocs я нашел только у JetBrains - IntelliJ IDEA 7.0 даёт поиграться с языком бесплатно в течении 30 дней. Компьютеров мне доступно 3, поэтому я смогу пользоваться им 90 дней :).

вторник, 13 мая 2008 г.

Обновление - Software development classic mistakes

Макконнелл и его компания, Construx Software Builders, выпустили результаты опроса "Classic mistakes".

За год в нем приняли участие 500 добровольцев, которым предлагалось оценить частоту появления и опасность ошибок из списка "классических" ошибок в проектах с их участием.

Результаты оформлены в 40-страничный whitepaper, доступный на сайте construx (для скачивания потребуется регистрация).

Анонс этой статьи в блоге Contrux содержит очень интересные выдержки - самые часто встречающиеся ошибки, самые опасные ошибки, и т.п. Лидируют в списках чрезмерно оптимистичные сроки, нереальные ожидания/планы, и недостаточный Quality Assurance.

Ещё анонс кишит копирайтами, поэтому цитировать что-либо ещё из него мне не хочется. Почитайте статью, данные о самых частых и самых редких ошибках очевидно-невероятны :)

суббота, 3 мая 2008 г.

Xlsx to html

Михаил Дроздов, мой коллега из ИВС, написал статью на любимую им тему - "Как получить таблицу данных из xlsx-файла у приложения Excel из MS Office 2007 используя структуру данных формата Open XML?". В ней описано, как без использования библиотек MS Office, одним xslt-преобразованием, получить html-представление Excel-листа. Такими вот фокусами с OpenXml-форматами он у нас занимается постоянно :)

От себя могу добавить, что содержимое xslx-файла, над которым делаются преобразования, можно получить с помощью утилит командной строки 7-zip, или следующим кодом:

System.IO.Packaging.Package p = System.IO.Packaging.Package.Open(@"book1.xlsx");

System.IO.Packaging.PackagePartCollection parts= p.GetParts();

foreach(System.IO.Packaging.PackagePart part in parts)

{

    using (BinaryReader rdr = new BinaryReader(part.GetStream()))

    {

        string filename = part.Uri.OriginalString;

        filename = filename.Substring(filename.LastIndexOf(@"/") + 1);

        using (BinaryWriter wr = new BinaryWriter(File.Create(filename)))

        {

            int bytesRead = 0;

            do

            {

                byte[] buffer = new byte[0xFFFF];

                bytesRead = rdr.Read(buffer, 0, buffer.Length);

                wr.Write(buffer, 0, bytesRead);

            } while (bytesRead > 0);

        }

    }

}


Для System.IO.Packaging понадобится WindowsBase.dll, входящая в состав .Net Framework 3.0

вторник, 29 апреля 2008 г.

40 строк кода

Когда последний раз Вы вынуждены были разбираться в ужасном коде?
Когда последний раз Вы писали ужасный код?

Не дадим этому повториться!
Повесьте у себя новый постер - "40 LOC", Вы и Ваши коллеги должны быть предупреждены

Предупреждающий постер
Предупреждающий постер

Он есть в формате Word:
И есть в pdf:
Желающие могут изменить число строк или дополнить текст мотивационными междометиями

P.S. LOC = lines of code, число строк кода. Небольшой LOC у методов является следствием хорошей практики программирования

вторник, 22 апреля 2008 г.

SPWeb.Dispose и SPSite.Dispose

Sharepoint от стека лежащих под ним .net-технологий отличает интересная особенность:
разработчики объектной модели решили не слишком заморачиваться с написанием удобных классов и возложили обязанности по
освобождению памяти
, выделяемой глубоко в недрах Microsoft.Sharepoint.dll native-кодом, на прикладного разработчика.

Если вы используете объектную модель Sharepoint, после использования объектов классов SPWeb и SPSite вы обязаны вызывать у них Dispose-методы, иначе приложение будет терять память.

SPSite oSPSite =newSPSite();
...
oSPSite.Dispose();

Несоблюдение этого правила в большинстве случаев приведет к регулярному перезапуску IIS Worker processes, что негативно сказывается на производительности портала.
Если излишне полагаться на объектную модель, возможно и такое: недавно я видел как метод, выполняющий большую, по сути транзакционную операцию над данными на узле Sharepoint, падает с OutOfMemoryException. Причина - частое создание SPWeb-объектов без освобождения ресурсов.

Основные случаи освобождения памяти описаны в многостраничном Best Practices: Using Disposable Windows SharePoint Services Objects, но информации в нем недостаточно.

Roger Lamb описал ещё 16 ситуаций, в которых безобидные вызовы вроде SPList.BreakRoleInheritance, приводят к утечке памяти.

P.S. статью Roger Lamb я увидел в блоге Serge Luca

воскресенье, 13 апреля 2008 г.

Хранение паролей в .config-файлах

Проблема, о которой я слышу слишком часто - защищенное хранение паролей в .config-файлах.

Стандартное решение для неё - System.Configuration.SectionInformation.ProtectSection() шифрует всю указанную Config-секцию, что не всегда удобно. Да и писать свои кастомные секции хочется не всегда.

John Galloway написал отличную статью о хранении паролей и прочей закрытой информции в .config-файлах приложения. В ней предлагается напрямую использовать DPAPI - технологию, скрытую за вызовами ProtectSection (если используется DpapiProtectedConfigurationProvider).

Код, который получается в результате, мне кажется более чистым и понятным, чем при других подходах.

DPAPI - Data Protection API, встроенный в Windows набор вызовов, позволяющий шифровать хранимую информацию 320-битным ключом, уникальным для пользователя. В .net framework эти вызовы выставлены в классе System.Security.Cryptography.ProtectedData, который мы и будем использовать.

Класс, ответственный за шифрование конфигурационных строк:

/// <summary>
    /// Служит для защиты пользовательских секретов, хранимых в .config-файлах 
    /// и других уязвимых источниках 
    /// Для компиляции понадобится подкючить System.Security
    /// </summary>
    class SecureConfigStringProvider
    {
 
        static byte[] entropy = System.Text.Encoding.Unicode.GetBytes("Salt Is Not A Password");
 
        /// <summary>
        /// Шифрует строку уникальным для пользователя ключом        
        /// </summary>        
        /// <returns>Зашифрованная строка в base64</returns>
        public static string EncryptString(string input)
        {
            byte[] encryptedData = System.Security.Cryptography.ProtectedData.Protect(
                System.Text.Encoding.Unicode.GetBytes(input),
                entropy,
                System.Security.Cryptography.DataProtectionScope.CurrentUser);
            return Convert.ToBase64String(encryptedData);
        }
 
        /// <summary>
        /// Расшифрует строку, зашифрованную EncryptString
        /// </summary>
        /// <param name="encryptedData">Зашифрованная строка в base64</param>
        /// <returns>Расшифровання строка</returns>
        public static string DecryptString(string encryptedData)
        {
            try
            {
                byte[] decryptedData = System.Security.Cryptography.ProtectedData.Unprotect(
                    Convert.FromBase64String(encryptedData),
                    entropy,
                    System.Security.Cryptography.DataProtectionScope.CurrentUser);
                return System.Text.Encoding.Unicode.GetString(decryptedData);
            }
            catch
            {
                return "";
            }                       
        }
    }


Его использование для хранения пароля в .config-файле:

Сохраняем пароль:
AppSettings.Password = EncryptString(PasswordTextBox.Password);


После чего он в файле выглядит примерно вот так:

<setting name="Password" serializeAs="String">

<value>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAV......</value>

</setting>



Читаем пароль из файла:
string password = DecryptString(AppSettings.Password);


Этот подход хорошо работает как для windows-приложений, так и для asp.net предложений. Одно неудобство, привязка к одному и тому же пользователю, вероятно помешает его использовать в asp.net-приложении на ферме серверов.

P.S. в оригинальной статье используется SecureString для "безопасной" работы с паролями, но безопасности такое использование не добавляет, а только раздувает код. Поэтому я привел свой вариант вызвовов EncryptString/DecryptString.

четверг, 10 апреля 2008 г.

Классические ошибки - постер

Мой предыдущий пост о классических ошибках подтолкнул меня к оформлению списка в несколько другой форме.
Я внимательно перечитал оригинал, скорректировал некоторые неточности в моём переводе, и уместил список на один лист в Microsoft Word :)

Получившийся постер уже висит у меня на рабочем месте:

Эффект возрастет, когда я перепечатаю его на более плотной бумаге в формате A3/A2 :)

Скачать его можно здесь.
Мне кажется, следущий шаг после распечатки - начать отмечать ошибки, которые происходят в вашем проекте, по мере их обнаружения. Кружочками или палочками.
Я этого не пока не сделал, иначе список на фотографии потерял бы слишком много первозданной белизны :)

P.S. Если результат работы автора и переводчика вам не равнодушен - оставьте свои комментарии и помогите Стиву с составлением нового
"Classic mistakes enumerated".

вторник, 1 апреля 2008 г.

Yellow Drum Machine

Секретные разработки Вооруженных Сил Ямайки!
Автономный робот-барабанщик:

Yellow Drum Machine

Увидено на http://jwz.livejournal.com/

понедельник, 31 марта 2008 г.

Классические ошибки разработки ПО

Важное свойство разработки ПО как профессии - необходимость постоянно обучаться.
Мы должны постоянно оценивать свою работу, обучаться новым технологиям и походам и т.п.
Любой успешный разработчик решает для себя эту задачу, или он перестаёт быть успешным :)
Но вот странная тенденция, которую я наблюдаю - подавляющее большинство людей, занимающихся разработкой ПО, предпочитают обучаться новым технологиям разработки, не пытаясь получить представление о работе других членов команды и самом процессе разработки.
Подозреваю, что с новешими фичами Framework 3.5 сейчас знакомо больше разработчиков, чем с "кирпичом" Code complete МакКоннелла.

Список из 30+ самых распространенных ошибок в разработке ПО, составленный МакКоннеллом - пример небольшого и невероятно ценного куска информации.
Список этот сейчас не обсуждается на форумах и, подозреваю, не висит ни у кого на стене, в отличие от диаграммы классов .net framework :)

Если ошибки из него возвести в ранг общепринятой терминологии, как "Паттерны проектирования", качество нашей работы должно вырасти больше, чем от перехода на .net framework 6.0

Ошибки, связанные с сотрудниками
1. Подрыв мотивации
2. Слабая команда
3. Неспособность управлять «проблемными» сотрудниками
4. Сверхвысокие обязательства, «героизм» команды
5. Добавление людей к отстающему проекту
6. Шумное рабочее место
7. Плохое взаимодействие разработчиков и клиентов
8. Нереальные планы
9. У команды нет «своего человека» среди топ-менеджеров компании-разработчика
10. Не все стороны заинтересованы в продвижении проекта
11. Отсутствие взаимодействия с конечными пользователями продукта
12. Политические решения в ущерб содержательной работе
13. Пассивное принятие желаемого за действительное

Ошибки, связанные с процессом разработки
14. Чрезмерно оптимистичные сроки
15. Недостаточное управление рисками
16. Проблемы с субподрядчиками
17. Недостаточное планирование
18. Команда с нереальными сроками игнорирует задачи планирования и сам план
19. Потеря времени на предпроектных процедурах (утверждение бюджета и т.п.)
20. Время на анализ и проектирование урезается в пользу кодирования
21. Неверные результаты проектирования
22. Время на процедуры Quality Assurance урезается в пользу кодирования
23. Задачи управления проектом не решаются
24. Слишком ранняя, слишком частая сборка проекта в релиз
25. В плане нет многих необходимых работ
26. Команда не укладывается в сроки, решением считается ускоренная работа на поздних стадиях
27. Неуправляемая «быстрая и грязная» разработка (code-like-hell)

Ошибки, связанные с продуктом
28. Множество ресурсоемких требований, в действительности необязательных
29. Добавление новых требований в ходе разработки (feature creep)
30. Множество интересных самим разработчикам требований, в действительности необязательных
31. Пассивные переговоры с клиентом, принятие нереальных планов под давлением
32. Необязательные исследовательские, «красивые» задачи в требованиях

Ошибки, связанные с технологиями
33. Синдром серебряной пули
34. Переоценка эффекта применения новых инструментов и методов
35. Смена инструментов разработки в ходе работы над проектом
36. Отсутствие автоматической системы управления кодом

Новые ошибки (не включенные в список за 1996г)

• Плановые оценки превращаются в сроки
• Чрезмерное «распараллеливание»: член команды одновременно решает слишком много задач
• Игнорирование, недооценка проблем организации работы команд, распределенных географически (global development)
• Нечеткое видение проекта (project vision)
• Положения в плане и проекте имеют приоритет над действительным положением дел (trusting the map more than the terrain)
• Аутсорсинг как средство снижения затрат

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

пятница, 21 марта 2008 г.

Код Asp.Net MVC Framework на Codeplex

Scott Guthrie и компания выложили на Codeplex часть кода Asp.Net MVC framework preview 2.

Код, который можно скачать здесь, содержит исходники System.Web.Mvc (1800 строк кода) и скомпилированные System.Web.Abstractions, System.Web.Routing.

Лицензия прав на их декомпиляцию не дает, а жаль - в System.Web.Routing лежит самое для меня интересное :). (В рефлекторе Abstractions и Routing выглядят как самые обыкновенные библиотеки без native-кода)

Для меня это первый релиз приложения, разрабатываемого Microsoft, в исходных кодах. На Codeplex есть багтрекер и каменты. Новые релизы MVC Framework явно планируется выпускать чаще, чем номерные беты.

По масштабам проект конечно походит на песочницу, но мне хочется верить, что компания, обкатав такой способ взаимодействия с сообществом, перенесет его на другие разработки.

понедельник, 10 марта 2008 г.

Microsoft Singularity source

Роюсь в исходниках Singularity. Microsoft Research, определенно, жжот:

В Microsoft.Singularity.Crypto.PublicKey.Random:

 public Random() : this(250787849) {

            // John DeTreville's Social Security Number

        }



Кусок драйвера S3 Trio на Sing#, Microsoft.Singularity.Drivers.S3Trio64.S3Device:

public void set_1024x60Hz_16bpp()

        {

            CrtAddrPort.Write16(0x0034);  // S3R4 - Backwards Compatibility 3

 

            IndxOut(CrtAddrPort, new byte[] {

                0x4b,0xff,0x00,0x8c,0x08,0x8a,0x25,0xf5,

                0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,

                0x02,0x0f,0xff,0x00,0x60,0xff,0x21,0xeb,

                0xff } );

 

            CrtAddrPort.Write8(0x51);  // overflow bits for CR13

            byte bt=CrtDataPort.Read8();//setting 4th bit , resetting 5,6 & 7 th bit

            bt &= 0x0f;                    // bit 5,4 = 01

            bt |= 0x10;

            CrtDataPort.Write8(bt);

 

            CrtAddrPort.Write16(0x355d);

            CrtAddrPort.Write16(0x005e);

            CrtAddrPort.Write16(0x1050);  // 16 bit pixel length

            CrtAddrPort.Write16(0x5067);  // mode 10: 16 bit color, 1 VCLK/pixel

            CrtAddrPort.Write16(0x026d);  // recover pixel on right hand edge in 16 bpp mode

        }

 

        // Wait for the vertical blanking interval on the chip.

        public void Wait_VSync()

        {

            byte bt;

 

            // It's possible that this routine will get called

            // when the 911 is in a zombie state, meaning there is no

            // vertical sync being generated.  This is why we have some long

            // time out loops here.

 

            // First wait for getting into vertical blanking.

 

            for (int i = 0; i < 0x100000; i++) {

                if ((SysCtrlPort.Read8() & 0x08)!=0) {

                    break;

                }

            }

 

            //

            // We are either in a vertical blanking interval or we have timed out.

            // Wait for the Vertical display interval.

            // This is done to make sure we exit this routine at the beginning

            // of a vertical blanking interval, and not in the middle or near

            // the end of one.

            //

            for (int i = 0; i < 0x100000; i++) {

                if ((SysCtrlPort.Read8() & 0x08)==0) {

                    break;

                }

            }

 

            //

            // Now wait to get into the vertical blank interval again.

            //

            for (int i = 0; i < 0x100000; i++) {

                if ((SysCtrlPort.Read8() & 0x08)!=0) {

                    break;

                }

            }

        }



Смотря на такой код, понимаешь, что Макконнелл называет внутренней сложностью проблемы, почти не устранимой изменением инструмента: писать бухгалтерию на C все ещё спокойнее, чем драйвера на .Net :)

четверг, 6 марта 2008 г.

Плоды MIX'08

Вчера на MIX'08 Microsoft выпустили две интересных беты:
  • IE 8 beta 1 - заявленный standarts compliance, прохождение ACID 2 и т.п. Большинство сайтов, тем не менее, в бете правильно не отображаются. Bil Simser выдвигает предположение, что рендеринг в IE8 ломают браузер-специфичные фиксы сайтов для IE6 и IE7 :). Как новый браузер будет бороться с таким наследством - вопрос, будоражащий умы многих. Установка IE8b1, увы, ведет к недетскому количеству глюков, поэтому ставить себе этот продукт я пока не собираюсь.

  • ASP.Net MVC Preview 2 - этот релиз MVC Framework будет первым, который я поставлю. Уж больно хочется посмотреть на новый ASP.Net без ужасов постбака и page lifecycle.
    Видео четырёх обучающих скринкастов by Scott Hanselman есть на asp.net

P.S. На visitmix.com лежат видео keynote и познавательных сессий. Новая фича IE - IE8 Activities смотрятся здорово.

пятница, 22 февраля 2008 г.

Resharper 4 nightly builds

В блоге JP Boodhoo - ссылка на Resharper 4 nightly builds (т.е. Resharper для С# 3 и VS 2008).
Скачал билд от 21.02, для VS 2008. Мелкие баги есть. Любимые шорткаты есть. Ура.

вторник, 19 февраля 2008 г.

Firefox port blocking

Вы тоже пользуетесь Firefox-ом с плагином Firebug для отладки внешнего вида страниц?
Mozilla приготовила нам подарок: с недавнего времени Firefox блокирует обращение к "нетрадиционным" портам. Например, обращение к тестовому серверу http://myserver:123 даёт
"This address is restricted: This address uses a network port which is normally used for purposes other than Web browsing. Firefox has canceled the request for your protection". Заботятся, значит.
Обход этой проблемы описан в блоге roymcavoy: ASP.Net (VS 2005): This address is restricted in Firefox error.

Нужно вызвать в firefox страницу about:config и добавить к появившемуся списку новую строку - "network.security.ports.banned.override" со значением "1-65535". После этого ваш компьютер, безусловно, будет гораздо менее защищен от хакерских атак :)

пятница, 15 февраля 2008 г.

Http code 502 от Google

Сегодня первый раз увидел страницу с серверной ошибкой от Google.
Что удивительного? На всех сервисах Google я до этого ни разу не видел страницы 404/500.
Вот так вот она выглядит:

понедельник, 11 февраля 2008 г.

Оптимизация ASP.Net от CTO Pageflakes

В блоге Scott Guthrie ссылка на статью Omar Al Zabir-а, CTO уникального Pageflakes: 10 ASP.NET Performance and Scalability Secrets.
В сжатом объеме Омар даёт огромное количество информации по оптимизации ASP.Net 2.0-сайта - от оптимизации Http Module pipeline до оптимизации хранимых процедур User profile system.
Да, в стандартной конфигурации веб-приложение ASP.Net 2.0 со включенными Membership и Profile-фичами практически не способно работать как Internet-сайт с высокой нагрузкой.

среда, 6 февраля 2008 г.

Свой типизированный профиль пользователя в ASP.Net

ASP.Net 2.0 содержит возможность использования профилей пользователей - User profile system.
Возможность эта позволяет прямо в файле конфигурации описывать структуру хранимого профиля пользователя
<profile>
<properties>
<add name="FavoritePasta" />
</properties>
</profile>

И затем использовать пользоваться этим профилем:
<span id="user-favorite-pasta"><%= Profile.FavoritePasta %></span>

Проблема в том, что Intellisense и типизация для такого профиля есть только в проекте веб-сайта, в котором он описан.
Т.е. для проектов больше "домашней странички" среда Visual Studio лишает нас возможности использования типизированного профиля.

John Galloway в своем блоге подробно описывает решение этой проблемы: Writing a custom ASP.NET Profile class. Заключается оно в создании своего класса, наследующегося от ProfileBase (код класса с двумя helper-методами есть в его статье) и явном указании использования этого класса для типизации профиля:

<profile inherits="MyMembership.UserProfile">
<providers>
<clear />
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="MyConnectionString"/>
</providers>
<properties>
<add name="FavoritePasta" />
</properties>
</profile>


Такие вот приседания вокруг базовой фичи. MVC Framework, похоже, будет ещё страшнее.

четверг, 17 января 2008 г.

Dream Big, Take Some Risks, Reap the Rewards

Jean-Paul S. Boodhoo, идеальный разработчик во плоти, даёт ответ на вопрос “How do you do it?” - Dream Big, Take Some Risks, Reap the Rewards.
Основная идея - вы должны ставить перед собой явные цели на текущий год, фокусироваться на них, ну и быть достаточно упертыми в их достижении.
В его статье одна фраза очевиднее другой, и одна другой полезнее - подваляющее большинство людей, с которыми я встречаюсь, абсолютно не мотивированы в своём профессиональном развитии.

четверг, 3 января 2008 г.

Google Docs лежит, с ним мои документы

Второй день с переменным успехом (чаще с неуспехом) захожу на Google Docs:


Здесь должен быть список документов, сохраненных в сети, но его нет - причина скрыта в бездне AJAX-вызовов

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

Да, это самый длительный (больше 2 дней) и неудобный downtime сервиса, который я могу вспомнить - с сервисами yandex, yahoo, IAC, 37signals такого не бывало.