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

Классические книги по программированию

Ежегодно выходит множество книг по программированию, начиная от описания определенных языков программирования, заканчивая восхвалением методологий, которые, якобы, должны изменить этот компьютерный мир к лучшему. Наиболее сложной задачей для читателя в этом случае является выбор из всего этого многообразия книги, на которую действительно будет не жалко потраченных усилий. На многих форумах довольно легко найти перечень рекомендуемых книг по С++, C#, ООП и чему угодно еще, которые люди относят к классике в своей области. Я же хочу собрать в одном месте книги, которые считаются классическими в различных областях компьютерной науки. При этом я не собираюсь основываться исключительно на собственном мнении (более того, я не готов основываться на мнении любого ОДНОГО человека), а воспользоваться для этих целей мнением компьютерного сообщества.

Хорошей практикой в подборе компьютерной литературы является рассмотрение «перекрестных ссылок» литературных источников. Например, если вы возьмете любую книгу, так или иначе связанную с объектно-ориентированным анализом и проектированием, то в перечне литературы вы несомненно найдете труды Бертрана Мейера, Гради Буча, упоминание книги Банды Четырех (GoF) и, наверняка, Рефакторинг Мартина Фаулера. Такую же картину вы можете наблюдать и пролистывая книги по С++, .Net, базам данных, управлению проектами или любой другой области. Кроме того, многие авторы в перечне литературы приводят не просто голый список, а список с небольшими комментариями, по которым легче судить, какая книга является однодневкой, а какая классической.
Теперь вернемся к самому перечню книг. Приведенный список, ни в коем случае не является окончательным, будет развиваться и дополняться, ведь главная его цель – собрать настоящую классику компьютерной литературы, но не абстрактную, а такую, которая бы помогла практикующему разработчику в заполнении брешей в той или иной области знаний.

Книги по С++

1. Бьерн Страуструп. Язык программирования С++. Специальное издание. Бином, Невский диалект, 2008

cpplanguage

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

Рецензия

2. Бьерн Страуструп. Дизайн и эволюция языка C++. ДМК Пресс, Питер, 2006

cppdesign

Язык С++ является таким, каким он есть со всеми его достоинствами и недостатками. Но прежде чем говорить о тех или иных архитектурных вопросах, стоит посмотреть на то, в каких условиях находились его авторы и почему они принимали те или иные решения. В этой книге рассказывается именно об этом: для чего были введены ссылки, какие силы двигали командой разработчиков языка при реализации первых шаблонов, почему библиотека ввода/вывода такая, какая она есть и так далее. Все эти сведения помогают несколько мягче относиться к недостаткам языка и с еще большим уважениям относиться к его достоинствам.

Рецензия

3. Скотт Мейерс. Эффективное использование С++

effectivecpp

3.1. Скотт Мейерс. Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ. 3-е издание. ДМК Пресс, 2006

Рецензия

moreeffectivecpp 3.2. Скотт Мейерс. Эффективное использование С++. 35 новых способов улучшить стиль программирования. Питер, 2006

Рецензия

effectivestl

3.3. Скотт Мейерс. Эффективное использование STL. Питер, 2002

Рецензия

Все три книги Скотта Мейерса относятся к категории «для продолжающих» и будут полезны людям уже знакомым с С++, но желающим поднять свои знания на следующий уровень. Книги уже давно стали классикой в своей области и являются родоначальниками серии «Effective programming», главным редактором которой является Скотт Мейерс.

4. Герб Саттер. Сложные задачи (Exceptional C++)

exceptionalcpp 4.1. Герб Саттер. Решение сложных задач на C++. Вильямс, 2008

Рецензия

exceptionalcppstyle 4.2. Герб Саттер. Новые сложные задачи на C++. Вильямс, 2005

Рецензия

Книги Герба Саттера по праву считаются лучшими в области «продвинутых» книг по языку С++. В них рассматриваются интересные задачи и не менее интересные решения, исследуются темные углы языка С++, включая тему безопасности исключений, которая является весьма сложной и наиболее любимой автором (не зря первые две книги автора названы “Exceptional C++” и “More Exceptional C++”). Главы этих книг доступны на сайте автора (http://gotw.ca), кроме того на сайте Герба можно найти множество статей серии Effective Concurrency, которые уже в ближайшее время выйдут в виде новой книги. 

5. Андрей Александреску. Современное проектирование на С++. Вильямс, 2004

moderncppdesign

В своей книге Александреску показывает, как можно реализовать основные шаблоны проектирования, описанные в книге «банды четырех», с помощью современного компилятора С++. Книга требует серьезной подготовки как в области шаблонов проектирования (design patterns), так и шаблонов С++ (C++ templates), поэтому я бы рекомендовал ее к прочтению после тщательного изучения книги «банды четырех» и книги Джосаттиса и Вандервурда по шаблонам С++.

Рецензия

6. Герб Саттер и Андрей Александреску. Стандарты программирования на С++. Вильямс, 2008

cppcodingstandarts

Книга представляет собой концентрацию опыта, накопленного авторами и компьютерным сообществом в области программирования на С++. Ее можно рассматривать как краткую версию «продвинутых» книг по языку программирования С++, ставших такими популярными в последнее время.

Рецензия

7. Дэвид Вандевурд, Николай М. Джосаттис. Шаблоны C++. Справочник разработчика. Вильямс, 2008

cpptemplates

Книга представляет собой наиболее полное руководство по шаблона С++, начиная от простых шаблонов функций и классов, заканчивая метапрограммированием и определением фундаментальных типов во время компиляции. Она прекрасно дополняет книгу Александреску «Современное проектирование», а точнее позволяет понять и реализовать самостоятельно все то, о чем пишет Андреи в своей книге.

Рецензия

Книги по Java

1. Bruce Eckel. Thinking in Java, 4th Edition. Prentice Hall Ptr, 2006

thinking_in_java

Книга Брюса Эккеля является, безусловно, лучшим учебником по языку программирования Java с введением в объектно-ориентированное программирование и шаблоны проектирования. Автор обладает отличным стилем изложения, приводит интересные примеры и не стесняется критики разработчиков языка. В 2009-м году вышла на русский язык под названием «Философия Java», отличительной особенностью русскоязычного варианта является отсутствие пяти глав: Strings, Container In Depth, Enumerated Types, Annotations и Graphic User Interface. Поэтому вопрос о том, какой вариант выбирать остается открытым.

2. Кей Хорстманн, Гари Корнелл. Java 2. Библиотека профессионала.

core_java_vol1 2.1. Кей Хорстманн, Гари Корнелл. Java 2. Библиотека профессионала. Том 1. Основы. 8-е издание. Вильямс, 2008
core_java_vol2 2.2. Кей Хорстманн, Гари Корнелл. Java 2. Библиотека профессионала.Том 2. Тонкости программирования. 8-е издание. Вильямс, 2008


Наиболее фундаментальный труд по языку Java.

3. Joshua Bloch. Effective Java, 2nd Edition. Prentice Hall, 2008

effective_java Книга Джошуа Блоха занимает то же положение на полке Java программиста, что и книги Скотта Мейерса и Герба Саттера на полке С++ программиста. Эта книга содержит множество приемов и идиом и будет полезна каждому, кто всерьез занимается этим замечательным языком.

4. Brian Goetz et al. Java Concurrency in Practice. Addison-Wesley Professional, 2006

java_concurrency

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

Рецензия

Книги по .Net, C#

1. Джеффри Рихтер. CLR via C#

clr_via_csharp 1.1. Джеффри Рихтер. CLR via C#. Питер, Русская редакция, 2007

Рецензия

clr_via_csharp_third 1.2. Jeffrey Richter. CLR via C#. 3d Edition. Microsoft Press, 2010

Эта книга уже давно стала классикой в области программирования на платформе .Net. Именно она является первой книгой, на которую необходимо обратить внимание каждому разработчику, который рассчитывает использовать платформу .Net в своей профессиональной деятельности. Третье издание книги подверглось существенным переработкам, в результате чего в ней отражены новшества C# 3.0 и C# 4.0, а также содержит новую часть, полностью посвященную вопросам многопоточности.

2. Дон Бокс, Крис Селлз. Основы платформы .NET. Том 1. Общеязыковая исполняющая среда. Вильямс, 2003

essential_net

При своем небольшом объеме (всего 288 страниц) и почтенном возрасте (оригинал вышел в 2002 году) книга остается ценным экспонатом в библиотеке .Net программиста. Поскольку авторы описывают исключительно фундаментальные концепции платформы, причем делают это с невероятным талантом, совмещая доступность изложения и глубину, поэтому эта книга остается, и будет оставаться актуальной на протяжении всего времени жизни платформы .Net.

 
3. Krzysztof Cwalina, Brad Abrams. Framework Design Guidelines 2nd Edition. Addison-Wesley Professional, 2008

Framework_Design

Разработка качественных программных систем является весьма сложной задачей, а разработка качественных библиотек (особенно framework-ов) является поистине вершиной мастерства архитекторов и разработчиков. Сложность здесь кроется в специфике принимаемых решений, ведь акцент серьезно смещается в сторону простоты и удобства использования, расширяемости и надежности. Но хотя эта тема является центральной, книга будет также весьма полезна и простым разработчикам, ведь знание ключевых идиом языка является совершенно необходимым, когда команда смотрит хотя бы немного дальше своего носа, и заботится не только о написании кода, но и о его последующем сопровождении.

Рецензия

4. Bill Wagner. Effective C#

effective_csharp 4.1. Bill Wagner. Effective C# (Covers C# 4.0): 50 Specific Ways to Improve Your C#. 2nd Edition. Addison-Wesley Professional, 2010

more_effective_csharp 4.2. Bill Wagner. More Effective C#: 50 Specific Ways to Improve Your C#. Addison-Wesley Professional, 2008

Тема эффективности использования стала настолько популярной, что подобная литература появляется по большинству языков программирования и многим технологиям. Язык программирования C# не является исключением. Представителем серии «эффективного программирования» на языке C# являются эти две книги Била Вагнера. Первая книга вышла еще в 2004-м году и посвящена C# 1.0 и рассматриваются самые разные вопросы, начиная от различий между классами и структурами, заканчивая важностью строгой гарантией исключений и проблемами взаимодействия управляемого и неуправляемого кода. Вторая книга хотя и вышла незадолго до официального выхода C# 3.0, но уже отражает всю специфику этой версии языка и платформы. В книге рассматриваются особенности работы с обобщениями (generics), многопоточностью (в том числе и при работе с пользовательским интерфейсом), новые возможности языка C# 3.0 и отдельно рассматриваются вопросы, связанные с LINQ. В марте 2010 года вышло второе, переработанное издание первой книги, в которой отражены изменения C# 4.0, включая такие новшества как PLINQ и тип Dynamic (которому посвящена целая глава).

Книги по ООП, шаблонам проектирования

1. Бертран Мейер. Объектно-ориентированное конструирование программных систем, 2-е издание. Русская редакция, 2005

meyer

Книга, которую многие по своей фундаментальности в области объектно-ориентированного программирования сравнивают с творением Дональда Кнута (причем совершенно без преувеличения) в области алгоритмов и структур данных. Эта книга является наиболее фундаментальным трудом по объектной парадигме, когда-либо выходивших на русском или на английском языках. Книга охватывает широкий круг вопросов, начиная от вопросов наследование, инкапсуляция, модульности, повторного использования, заканчивая автоматическим управлением памятью, шаблонами проектирования и проектированием по контракту (который только спустя два десятилетия начинает набирать обороты в mainstream языках и технологиях).

2. Гради Буч. Объектно-ориентированный анализ и проектирование, 3-е издание. Вильямс, 2008

booch

Еще одна классическая книга по объектно-ориентированному программированию, но в отличие от книги Бертрана Мейера имеет менее формальный и более описательный характер. В книге потрясающе описана проблема сложности ПО, описаны роли абстракции и иерархии, изложено сравнение наиболее популярные на сегодняшний день методологии разработки и многое другое.

Рецензия

3. Эрик Гамма, Ральф Джонсон, Ричард Хелм, Джон Влиссидес. Приемы объектно-ориентированного проектирования. Паттерны проектирования. Питер, 2007

GoF

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

Рецензия

4. Мартин Фаулер. Рефакторинг. Улучшение существующего кода. Символ-Плюс, 2008

refactoring

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

Рецензия

Книги по управлению проектами

1. Фредерик Брукс. Мифический человеко-месяц или Как создаются программные системы, 2-е издание. Символ-Плюс, 2006

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

Рецензия

2. Том ДеМарко и Тимоти Листер. Человеческий фактор. Успешные проекты и команды. 2-е издание. Символ-Плюс, 2009

peopleware

Книга «Человеческий фактор» является отличным доказательством того, что, несмотря на стремительное развитие технологий, человеческий фактор является одной из наиболее сложных проблем при построении программных систем. Фредерик Брукс (читая лекции своим студентам) выделил следующие фундаментальные концепции книги: 1) важность кристаллизации команд (team jelling) и понятие травли команд (teamicide); 2) важность рабочего пространства; 3) акцент на «качестве сотрудников»; 4) влияние (негативное) на переезд крупного программного проекта с одного места (географического) в другое. Этой книге уготована долгая жизнь по той же причине, «почему рассказы Гомера пережили тысячи лет: эти рассказы о людях, и они также верны сегодня, как и тысячу лет назад».

Рецензия

3. Эдвард Йордон. Путь камикадзе. 2-е издание. Лори, 2008

death_march

Еще одна классическая книга по управлению проектами, но в отличие от предыдущих книг, посвящена работе над безнадежными проектами (риск провала которых превышает 50%). В книге рассматривается широкий спектр проблем, начиная от политики и принципов ведения переговоров, заканчивая ролью человеческого фактора и важностью инструментальных средств.

Рецензия

Книги по WinAPI/WinSocks

1. Джеффри Рихтер, Кристоф Назарр. Windows via C/C++. 5-е издание. Питер, Русская Редакция, 2009

windows_via_c

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

Рецензия

2. Джеффри Рихтер, Джейсон Кларк. Программирование серверных приложений для Microsoft Windows 2000. Питер, Русская Редакция, 2001

programming_server_side

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

Рецензия

3. Энтони Джонс, Джим Оланд. Программирование в сетях Microsoft Windows. Питер, Русская Редакция, 2002

network

Наиболее полное руководство по разработке сетевых приложений с использованием WinAPI. Если вдруг понадобиться поработать с NetBIOS, именованными каналами, реализовать асинхронный ввод-вывод с помощью портов завершения, настроить качество обслуживания или воспользоваться простыми (Raw) сокетами, эта книга будет как нельзя кстати.

Книги по COM/ATL

1. Дон Бокс. Сущность технологии COM, Питер

essential_com

Если вы все же каким-то образом связаны с этой замечательной технологией, «с маршалингом, моникерами, распределенными потоками, агрегатами и миллионом других вещей, которые понимал только Дон Бокс, и даже Дон Бокс больше не может на это смотреть», то эта книга должна быть первой в вашем списке. А если серьезно, то это лучшая и единственная книга по технологии COM, которая поможет вам понять эту технологию.

Рецензия

2. Кристофер Таваре, Кирк Фертитта, Брент Ректор, Крис Селлз. ATL 8. Внутренняя структура и применение. 2-е издание. Вильямс, 2007

atl

Лучшая и единственная (ну, не совсем единственная, но остальные книги выходили не позднее 2000 года) книга по библиотеке ATL.

Алгоритмы

1. Дональд Э. Кнут. Искусство программирования

knuth1

1.1. Дональд Э. Кнут. Искусство программирования. Том 1. Основные алгоритмы. 3-е издание. Вильямс, 2008

knuth2 1.2. Дональд Э. Кнут. Искусство программирования. Том 2. Получисленные алгоритмы. 3-е издание. Вильямс, 2005
knuth3 1.3. Дональд Э. Кнут. Искусство программирования. Том 3. Сортировка и поиск. 2-е издание. Вильямс, 2008

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

2. Генри C. Уоррен, мл. Алгоритмические трюки для программистов. Вильямс, 2007

hackers_delight

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

Рецензия

Общие вопросы программирования

1. Эндрю Хант и Дэвид Томас. Программист-прагматик. Путь от подмастерья к мастеру. Лори, 2009

pragmatic

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

Рецензия

2. Джон Бентли. Жемчужины программирования, 2-е издание. Питер, 2007

perls

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

Рецензия

3. Стив Макконнел. Совершенный код. 2-е издание. Питер, 2007

code_complete

По статистике над одним проектом в среднем работает 10 поколений разработчиков, а это значит, что большая часть жизненного цикла ПО составляет его поддержка и сопровождение. Из чего можно сделать простой вывод, что за _чтением_ программы проводится гораздо больше временем, чем за ее _написанием_, а это, в свою очередь значит, что качество кода играет очень важную роль. В этом вопросе книга Стива Макконнелла (как и многие книги в этом списке) является лучшей в своей области. В книге рассматривается широкий спектр вопросов, так или иначе связанных с кодированием, начиная от правил именования переменных (которым выделены 52 (!) страницы), заканчивая рефакторингом и рекомендациям по оптимизации.

Рецензия

4. Джеффри Фриддл. Регулярные выражения. 3-е издание. Символ-Плюс, 2008

regex

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

Базы данных

1. К. Дж. Дейт. Введение в системы баз данных. 8-е издание. Вильямс, 2006

introduction_to_database

Книга прекрасно отражает, насколько обширной является тема систем управления базами данных, она отличается немалым объемом (более 1300 страниц), а перечень литературы к каждой из глав дает понять, что это только верхушка айсберга. Книга не описывает ни одну из существующих СУБД, а сосредоточена прежде всего на реляционной модели (хотя довольно часто проскакивает критика о несоответствии реляционной модели в существующих реализациях) и является наиболее фундаментальным трудом в своей области.

2. Джеффри Ульман и др. Системы баз данных полный курс, Вильямс, 2004

data_base__complete_book

Еще одна классическая книга из области систем управления базами данных. Книга также обладает немалым объемом (1088 страниц), покрывает большинство наиболее актуальных тем этой области, но является более практичной, нежели книга Криса Дейта. Книга также не привязывается к конкретной СУБД и будет полезна всем читателям, которые интересуются этой тематикой.


вторник, 23 февраля 2010 г.

Многопроцессорная компиляция проектов на VC++ 2008

Одной из отличительных особенностей процесса компиляции исходных кодов на языке программирования С++ (по сравнению с языками с «двухфазной» компиляцией) является относительно большое время компиляции. Так, если длительность процесса компиляции проекта на C#, состоящего из пары сотен файлов занимает не более пары десятков секунд (естественно, что этот показатель зависит от аппаратной конфигурации компьютера), то процесс компиляции (и линковки) аналогичного по размеру проекта на С++ может занимать в десять раз больше времени.

Второй особенностью компиляции в языках С и С++ является независимая компиляция каждого модуля трансляции (.cpp (или .c) файла) с последующей линковкой всех объектных файлов в единую библиотеку или исполняемый файл. Из-за этой особенности возникает естественный вопрос о возможности параллельной компиляции нескольких .cpp файлов параллельно на многопроцессорном или многоядерном компьютере.

Начиная с Visual C++ 2008, компилятор поддерживает дополнительный ключ компиляции (/MP и /MPn), с помощью которого можно указать использовать параллельную компиляцию нескольких .cpp файлов одновременно. Распараллеливание процесса компиляции осуществляется за счет запуска нескольких процессов cl.exe для нескольких .cpp файлов одновременно.

Количество процессов cl.exe, которые будут запущены одновременно для компиляции различных модулей трансляции можно указать явно, используя ключ /MPn (например, /MP4, для запуска 4-х процессов), либо ключ /MP (в этом случае будет запущено количество процессов, равное количеству логических процессоров).

По словам членов команды Visual C++ Team прирост производительности (точнее уменьшение времени компиляции) может составлять порядка 30%, но это очень сильно зависит от того, какой процент времени будет занят линковкой объектных файлов. Так, при полной перекомпиляции проекта этот выигрыш будет заметнее, а при перекомпиляции только нескольких файлов – менее заметен.

Я проверял влияние ключа /MP на 4-х ядерном процессоре, на проекте C++/CLI, состоящий приблизительно из 350 файлов. Результаты откровенно порадовали:

4 ядра (без ключа /MP): общее время компиляции 9:16, линковка – 1:37
4 ядра (ключ /MP): общее время компиляции 4:47, линковка – 1:40

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

Помимо параллельной компиляции отдельных .cpp файлов, Visual Studio 2008 поддерживает также параллельную сборку С++ проектов (возможна параллельная сборка только независимых проектов). Хотя это также уменьшает время компиляции, существенной разницы на своих проектах я не почувствовал, поэтому и особого впечателения на меня эта возможность не произвела.

Дополнительные ссылки
1. Multi-processor builds in Orcas, Visual C++ Team Blog
2. Building projects in parallel, MSBuild Team Blog
3. /MP (Build with Multiple Processes), MSDN,
4. Using Multiple Processors to Build Projects, MSDN
5. Enabling multiprocessor support in an MSBuild host, MSBuild Team Blog
6. Did you know… Only VC supports parallel building within the IDE - #324 , Sara Ford’s Weblog,
7. MPCL Plugin

воскресенье, 14 февраля 2010 г.

Что нового в третьем издании книги Джеффри Рихтера “CLR via C#”

CLR

До официального выхода третьего издания знаменитой книги Джеффри Рихтера “CLR via C#” остался еще один день (официальная дата выхода – 15 февраля 2010 года), а доброжелатели уже постарались над тем, чтобы эта книга стала достоянием широкой общественности.

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

Первое, что бросается в глаза, так это то, что третье издание "подросло" в объеме чуть более чем на 150 страниц. Второе издание содержит 736 страниц, а третье - 896.

Первое изменение в содержании (не путать с содержимым, хотя есть сомнения в изменении содержимого первых четырех глав) найдена только лишь главе 5. Primitive, Reference, and Value Types): в третьем издании появился раздел: The dynamic Primitive type.

Глава 8 второго издания: Methods: Constructors, Operators, Conversions, and Parameters... разбита на две главы в третьем: Глава 8. Methods, Глава 9. Parameters.

Глава 8. Methods. В третьем издании добавлены нововведения из C#3.0:
Extension Methods
   Rules and Guidelines
   Extending Various Types with Extension Methods
   The Extension Attribute
Partial Methods
   Rules and Guidelines

Главе 9. Parameters. В третьем издании добавлены нововведения C# 3.0 и 4.0:
Optional and Named Parameters
   Rules and Guidelines
   The DefaultParameterValue and Optional Attributes
Implicitly Typed Local Variables
Parameter and Return Type Guidelines

Главе 10. Properties. В третьем издании добавлены нововведения C# 3.0 и C#4.0 :
Parameterless Properties
   Automatically Implemented Properties
   Object and Collection Initializers
   Anonymous Types
   The System.Tuple Type

Глава по обобщениям (Generics) теперь стала 12-й (во втором издании, была 16-й). Содержание этих глав совпадает, но размер этой главы в третьем издании увеличился с 28 страниц до 32. Буду рад, если кто-то скажет об отличиях:)

Глава 15. Enumerated Types and Bit Flags. В третьем издании добавлен раздел Adding Methods to Enumerated Types, в котором рассказывается о добавлении методов перечислениям с помощью методов расширения.

Глава 16. Arrays. В третьем издании добавлен раздел Initializing Array Elements, в котором говорится о новых возможностях инициализации массивов, появившихся в C# 3.0

Глава 17. Delegates. В третьем издании раздел Syntactical Shortcut #2: No Need to Define a Callback Method переписан с применением лямбда-выражений.

Глава 20. Exceptions and State Management. Теперь глава об обработке исключений называется именно так. В ней многие разделы имеют немного другие названия и слегка перетасованы (сложно сказать, как это отразилось на содержимом), но появились два новых раздела: Constrained Execution Regions (CERs) и Code Contracts

Глава 21. Automatic Memory Management (Garbage Collection). Содержание глав во втором и третьем издании практически совпадают, единственное отличие состоит в том, что в третьем издании эта глава на 8 страниц длиннее (72 в третьем издании, 64 - во втором).

Глава 22. CLR Hosting and AppDomains. Появились следующие разделы: AppDomain Monitoring, AppDomain First-Chance Exception Notifications, отличается раздел How Hosts Use AppDomains.

Глава 24. Runtime Serialization. Это новая глава, которая появилась в только в третьем издании книги.
Serialization/Deserialization Quick Start
Making a Type Serializable
Controlling Serialization and Deserialization
How Formatters Serialize Type Instances
Controlling the Serialized/Deserialized Data
   How to Define a Type That Implements ISerializable when the Base Type Doesn’t Implement This Interface
Streaming Contexts
Serializing a Type as a Different Type and Deserializing an Object as a Different Object
Serialization Surrogates
   Surrogate Selector Chains
Overriding the Assembly and/or Type When Deserializing an Object

Часть 5 теперь называется Threading. Наконец-то Рихтер оказался в своей стихии. В третьем издании вопросам многопоточности уделено 180 (!) страниц, а во втором издании только 64(!). Т.е. эту часть можно читать целиком.

Глава 25. Thread Basics
Why Does Windows Support Threads?
Thread Overhead
Stop the Madness
CPU Trends
NUMA Architecture Machines
CLR Threads and Windows Threads
Using a Dedicated Thread to Perform an Asynchronous Compute-Bound Operation
Reasons to Use Threads
Thread Scheduling and Priorities
Foreground Threads versus Background Threads
What Now?

Глава 26 Compute-Bound Asynchronous Operations
Introducing the CLR’s Thread Pool
Performing a Simple Compute-Bound Operation
Execution Contexts
Cooperative Cancellation
Tasks
   Waiting for a Task to Complete and Getting Its Result
   Cancelling a Task
   Starting a New Task Automatically When Another Task Completes
   A Task May Start Child Tasks
   Inside a Task
   Task Factories
   Task Schedulers
Parallel’s Static For, ForEach, and Invoke Methods
Parallel Language Integrated Query
Performing a Periodic Compute-Bound Operation
   So Many Timers, So Little Time
How the Thread Pool Manages Its Threads
   Setting Thread Pool Limits
   How Worker Threads Are Managed
Cache Lines and False Sharing

Глава 27. I/O-Bound Asynchronous Operations
How Windows Performs I/O Operations
The CLR’s Asynchronous Programming Model (APM)
The AsyncEnumerator Class
The APM and Exceptions
Applications and Their Threading Models
Implementing a Server Asynchronously
The APM and Compute-Bound Operations
APM Considerations
   Using the APM Without the Thread Pool
   Always Call the EndXxx Method, and Call It Only Once
   Always Use the Same Object When Calling the EndXxx Method
   Using ref, out, and params Arguments with BeginXxx and EndXxx Methods
   You Can’t Cancel an Asynchronous I/O-Bound Operation
   Memory Consumption
   Some I/O Operations Must Be Done Synchronously
   FileStream-Specific Issues
I/O Request Priorities
Converting the IAsyncResult APM to a Task
The Event-Based Asynchronous Pattern
   Converting the EAP to a Task
   Comparing the APM and the EAP
Programming Model Soup

Глава 28. Primitive Thread Synchronization Constructs
Class Libraries and Thread Safety
Primitive User-Mode and Kernel-Mode Constructs
User-Mode Constructs
   Volatile Constructs
   Interlocked Constructs
   Implementing a Simple Spin Lock
   The Interlocked Anything Pattern
Kernel-Mode Constructs
   Event Constructs
   Semaphore Constructs
   Mutex Constructs
   Calling a Method When a Single Kernel Construct Becomes Available

Глава 29 Hybrid Thread Synchronization Constructs
A Simple Hybrid Lock
Spinning, Thread Ownership, and Recursion
A Potpourri of Hybrid Constructs
   The ManualResetEventSlim and SemaphoreSlim Classes
   The Monitor Class and Sync Blocks
   The ReaderWriterLockSlim Class
   The OneManyLock Class
   The CountdownEvent Class
   The Barrier Class
Thread Synchronization Construct Summary
The Famous Double-Check Locking Technique
The Condition Variable Pattern
Using Collections to Avoid Holding a Lock for a Long Time
The Concurrent Collection Classes

Более подробное мое мнение по поводу содержимого этих изменений, я надеюсь можно будет узнать в ближайшем будущем, когда я с этими самыми изменениями познакомлюсь. Но в одном можно быть уверенным, Рихтер знает свое дело, поэтому если у вас возникнет вопрос о хорошей книге по платформе .NET, первой в этом списке должна быть именно эта книга!

UPDATE:

Только сейчас заметил, что "все уже украдено до нас" и Джеффри Рихтер в своем блоге уже писал об изменениях между вторым и третьим изданиями (почитать об этом можно здесь).

Ко всему, что я написал выше стоит добавить следующее:

Chapter 1-The CLR’s Execution Model
Added about discussion about C#’s /optimize and /debug switches and how they relate to each other.

Chapter 2-Building, Packaging, Deploying, and Administering Applications and Types
Improved discussion about Win32 manifest information and version resource information.

Chapter 3-Shared Assemblies and Strongly Named Assemblies
Added discussion of TypeForwardedToAttribute and TypeForwardedFromAttribute.

Chapter 5-Primitive, Reference, and Value Types
Enhanced discussion of checked and unchecked code and added discussion of new BigInteger type

Chapter 19-Nullable Value Types
Added discussion on performance.

Chapter 20-Exception Handling and State Management
This chapter has been completely rewritten. It is now about exception handling and state management.

Chapter 21-Automatic Memory Management
Added discussion of C#’s fixed state and how it works to pin objects in the heap. Rewrote the code for weak delegates so you can use them with any class that exposes an event (the class doesn’t have to support weak delegates itself). Added discussion on the new ConditionalWeakTable class, GC Collection modes, Full GC notifications, garbage collection modes and latency modes. I also include a new sample showing how your application can receive notifications whenever Generation 0 or 2 collections occur.

Chapter 23-Assembly Loading and Reflection
Added section on how to deploy a single file with dependent assemblies embedded inside it. Added section comparing reflection invoke vs bind/invoke vs bind/create delegate/invoke vs C#’s dynamic type.

Часть 5. Threading таки является полностью новой.

пятница, 12 февраля 2010 г.

Книга Джоэла Спольски “Джоэл. И снова о программировании”

More_Joel_on_Software Так уж получается, что к продолжениям аудитория всегда предъявляет более высокие требования, чем к первым частям произведений. Классическим примером является кинематограф, ведь каждый раз после выхода продолжения очередного (особенно удачного) фильма постоянно слышишь что-то вроде: "Да, фильм/актер/актриса/режиссер/продюсер/мальчик, заваривающий кофе уже не тот, вот первая часть фильма была ого-го, а вторая - так себе. Вполне естественно, что подобное отношение к продолжениям касается не только голливудских блокбастеров, но и компьютерной литературы.

Сегодня речь пойдет о продолжении известной книги Джоэла Спольски "Джоэл. И снова о программировании", вышедшей вслед за первой частью с не менее завораживающим названием "Джоэл о программировании". Обе книги являются представителями относительно нового течения в компьютерной литературе, которое называется "блуком" (от английского book (книга) и blog). По-сути, Джоэл является родоначальником этого течения и, наверное, одним из самых ярких его представителей. Вторая книга Джоэла представляет собой минимально измененный набор статей, опубликованных на сайте Джоэла joelonsoftware.com, по самой различной тематике, начиная от вопросов образования, заканчивая проблемами служб технической поддержки и ценовой политикой для коробочных программных продуктов.

Если сравнивать эту книгу с первой частью (что, как было сказано, является вполне естественным стремлением), то складывается впечатление, что большая часть наиболее известных, популярных и интересных статей, все же досталась первой книге. Я не говорю, что "Джоэл уже не тот", нет, это не так. Но нужно сказать, что средний уровень второй книги все же значительно ниже. Если первая часть книги в основном состоит из ярких и очень сильных статей, нескольких средних и нескольких откровенно спорных, то вторая часть книги более ровная. Там практически нет откровений, но и спорных моментов меньше (за исключением главы об обработке исключений, Джоэл является ярым противником этого явления, как средства обработки ошибок). Но, не смотря на это в книге достаточно много сильных глав. Мне очень понравилась серия глав об образовании, главы о различных способах управления, о практическом применении качественной офисной среды в компании Fog Creek, о том, как создать компанию, в которой вы бы сами хотели работать и многое другое. В целом Джоэл остается самим собой, как всегда ироничный, то критикующий Майкрософт, то восхищающийся ею, восхищенный Стивом Джобсом и продуктами Apple, немного рекламирующий свою компанию, ее продукты и методы управления, иногда повторяющийся (а иногда и противоречащий себе), но всегда интересный. Достаточно прочитать несколько страниц, чтобы оценить стоит дальше читать или нет.

Отдельно хочется коснуться перевода. Перевод адекватный, есть небольшие ляпы (но у кого их нет), но чего мне особенно не хватало, так это научного редактора первой части книги. В первой части в примечаниях редактор не только проливали свет на некоторые вопросы (что упрощало понимание материала), но и, не стесняясь, спорил с мнением автора. Хотя многим подобные вольности редактора могли не понравиться, мне читать такие диспуты было интересно. Здесь же ничего такого нет, а очень бы хотелось.

Напоследок, хочется коснуться классического вопроса, который задает себе практически каждый, когда речь идет о блуке: "зачем мне нужна книга, все содержимое которой я могу свободно найти в интернете?". На этот вопрос я отвечу цитатой редактора этой книги Гэри Корнелла, который говорит об успехе первой части книги Джоэла следующее: "Мне кажется, секрет здесь в том, что смаковать деликатес вроде статей Джоэла гораздо приятнее в печатном виде, чем в окне броузера". И в этом вопросе я с ним полностью согласен.

Оценка: твердая четверка.

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

Диагностика проблем загрузки сборок

Практически каждый разработчик сталкивался с неприятной ситуацией, когда во время загрузки приложения, разработанного с использованием .NET Framework, возникают какие-то ошибки, связанные с поиском или загрузкой сборок и запуск приложения завершается предложением отправить отчет в Майкрософт. Кроме того, практически каждый, кто читал замечательную книгу Джеффри Рихтера, ужаснулся тому многообразию вариантов, откуда может быть загружена сборка, а также богатым возможностям администрирования .Net приложений (probing, dependend assemblies, codebase, Publisher Policy и др.) [1], [2]. Помимо проблем с поиском нужной сборки подливают масла в огонь вероятные ошибки загрузки сборок, связанные с вопросами безопасности (в результате чего генерируется SecurityException), а также форматом сборки (исключение BadImageFormat).

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

За загрузку сборок в CLR отвечает специальный загрузчик, получивший кодовое имя Fusion. Если в процессе загрузки сборок возникают проблемы, то для упрощения диагностики существует возможность включить логгирование этого процесса. Для этого необходимо задать следующие параметры в реесте: установить параметр HKLM\Software\Microsoft\Fusion\ForceLog в 1, а в значении параметра HKLM\Software\Microsoft\Fusion\LogPath указать путь хранения лог-файла (по умолчанию, этих параметров в реестре нет, соответственно, диагностика загрузки сборок не производится).

Для проверки ошибок загрузки сборок я создал простое решение (solution) с двумя проектами: консольным приложением TestFusion и библиотекой классов TestFusionLib. Я добавил в библиотеку класс TestClass, а в TestFusion добавил использование этого класса. После компиляции обоих проектов, я удалил из папки bin файл TestFustionLib и запустил TestFustion.exe.

D:\Sources\VS2008\TestFusion\TestFusion\bin\Debug>TestFusion.exe

Необработанное исключение: System.IO.FileNotFoundException: Невозможно загрузить файл или сборку "TestFusionLib, Version

=1.0.0.0, Culture=neutral, PublicKeyToken=null" или один из зависимых от них компонентов. Не удается найти указанный файл.

Имя файла: "TestFusionLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"

   в TestFusion.Program.Main(String[] args)

Диспетчер сборки загружен с:  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll

Выполняется в контексте исполняемого файла  D:\Sources\VS2008\TestFusion\TestFusion\bin\Debug\TestFusion.exe

--- Подробный журнал ошибок.

=== Информация о состоянии предварительной привязки ===

Журнал: User = HOME\Sergey

Журнал: DisplayName = TestFusionLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

 (Fully-specified)

Журнал: Appbase = file:///D:/Sources/VS2008/TestFusion/TestFusion/bin/Debug/

Журнал: Initial PrivatePath = NULL

Вызов сборки: TestFusion, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.

===

Журнал: данная привязка начинается в контексте загрузки default.

Журнал: файл конфигурации приложения не найден.

Журнал: используется файл конфигурации компьютера из C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config

.

Журнал: политика в данный момент не применяется к ссылке (личная, пользовательская, частичная привязка сборки или привязка по местоположению).

Журнал: попытка загрузки нового URL file:///D:/Sources/VS2008/TestFusion/TestFusion/bin/Debug/TestFusionLib.DLL.

Журнал: попытка загрузки нового URL file:///D:/Sources/VS2008/TestFusion/TestFusion/bin/Debug/TestFusionLib/TestFusionLi

b.DLL.

Журнал: попытка загрузки нового URL file:///D:/Sources/VS2008/TestFusion/TestFusion/bin/Debug/TestFusionLib.EXE.

Журнал: попытка загрузки нового URL file:///D:/Sources/VS2008/TestFusion/TestFusion/bin/Debug/TestFusionLib/TestFusionLib.EXE.

Помимо просмотра и конфигурирования процесса логирования загрузки сборок вручную, в составе .NET Framework SDK поставляется полезная утилита с названием Fuslogvw.exe (Fusion Log Viewer) [3], которая в значительной степени упрощает подобный процесс диагностики.

Внимание! Утилиту Fuslogvw.exe необходимо запускать с правами Администратора, в противном случае вы не сможете изменить ни какие параметры.

Примечание. Путь к Fuslogvw.exe: %ProgramFiles%\MicrosoftSDKs\Windows\v6.0A\bin\Fuslogvw.exe

Если после неудачного запуска приложения (в нашем случае TestFusion.exe) запустить Fuslogvw.exe (или нажать кнопку Refresh, если эта утилита уже была запущена), то мы увидим следующую картину:

Fuslogvw

Нас интересует вторая строка. Если на ней нажать View Log, получим следующие данные:

*** Запись журнала привязки сборки  (06.02.2010 @ 17:47:02) ***

Операция выполнена со сбоем.

Результат привязки: hr = 0x80070002. Не удается найти указанный файл.

Диспетчер сборки загружен с:  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll

Выполняется в контексте исполняемого файла  D:\Sources\VS2008\TestFusion\TestFusion\bin\Debug\TestFusion.exe

--- Подробный журнал ошибок.

=== Информация о состоянии предварительной привязки ===

Журнал: User = HOME\Sergey

Журнал: DisplayName = TestFusionLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

 (Fully-specified)

Журнал: Appbase = file:///D:/Sources/VS2008/TestFusion/TestFusion/bin/Debug/

Журнал: Initial PrivatePath = NULL

Журнал: Dynamic Base = NULL

Журнал: Cache Base = NULL

Журнал: AppName = NULL

Вызов сборки: TestFusion, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.

===

Журнал: данная привязка начинается в контексте загрузки default.

Журнал: файл конфигурации приложения не найден.

Журнал: используется файл конфигурации компьютера из C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.

Журнал: политика в данный момент не применяется к ссылке (личная, пользовательская, частичная привязка сборки или привязка по местоположению).

Журнал: попытка загрузки нового URL file:///D:/Sources/VS2008/TestFusion/TestFusion/bin/Debug/TestFusionLib.DLL.

Журнал: попытка загрузки нового URL file:///D:/Sources/VS2008/TestFusion/TestFusion/bin/Debug/TestFusionLib/TestFusionLib.DLL.

Журнал: попытка загрузки нового URL file:///D:/Sources/VS2008/TestFusion/TestFusion/bin/Debug/TestFusionLib.EXE.

Журнал: попытка загрузки нового URL file:///D:/Sources/VS2008/TestFusion/TestFusion/bin/Debug/TestFusionLib/TestFusionLib.EXE.

Журнал: все попытки проверки URL закончились неудачно.

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

Отступление от темы. Диагностика проблем загрузки неуправляемых библиотек

Обсуждая вопрос диагностики загрузки управляемых библиотек, нельзя оставить без внимания вопросы загрузки неуправляемых библиотек (native dll). На различных форумах очень часто задают вопросы подобного рода: «Мое приложение при переносе с моей машины на какую-то другую, перестает запускаться. В чем может быть проблема?». Подобная проблема очень часто связана с тем, что при компиляции неуправляемого кода (например, mixed сборок, разработанных с помощью C++/CLI) помимо стандартных управляемых библиотек приложение использует C Runtime Library в виде отдельной dll. Поскольку на машине разработчика эта библиотека существует в папке System32 с тех самых пор, как на этот компьютер установлена среда разработки, это не вызывает никаких проблем у разработчика, но этой библиотеки очень часто не бывает на машине пользователя. Многие разработчики справляются с этой проблемой путем включения в свой инсталляционный пакет Visual С++ Redistributable Package  

В отладке подобных проблем первое, что нужно сделать, это скачать замечательную утилиту под названием Dependency Walker [5] и попытаться открыть ваш exe-файл с помощью этой утилиты на машине пользователя (или на машине с идентичной конфигурацией). Dependency Walker рекурсивно проходится по всем неуправляемым библиотекам и сразу же покажет вам, какой именно неуправляемой библиотеки не хватает.

Дополнительные ссылки

1.     Джеффри Рихтер, CLR via C#, Глава 2, раздел “Простое средство администрирования (конфигурационный файл)”.

2.     Джеффри Рихтер, CLR via C#, Глава 3, раздел “Дополнительные конфигурационные средства (конфигурационные файлы)”.

3.     Assembly Binding Log Viewer (Fuslogvw.exe) in MSDN documentation

4.     Debugging Assembly Loading Failures by Suzanne Cook (http://blogs.msdn.com/suzcook/archive/2003/05/29/57120.aspx)

5.     Утилита Dependency Walker

пятница, 5 февраля 2010 г.

[ANN] Бесплатные тесты на Brainbench по C#3.0 и .NET framework 3.5

Я прекрасно осознаю ограниченность подхода оценивать способностей разработчика по подобным синтетическим тестам. Этот вопрос не раз обсуждался на различных блогах и форумах, но не смотря на это очень часто в резюме люди оставляют ссылки на свой public transcript или явно указывают оценки, полученные при cдаче того или иного теста.

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

Любопытно то, что сейчас на brainbench доступны 3 новых теста по платформе .NET, это C#3.0, C#3.0 Fundamentals (я честно говоря не особо понимаю, в чем отличия между подобными тестами) и .NET Framework 3.5 (есть еще C#1.0, который висит в общедоступных тестах, кажется уже около года). Насколько эти тесты являются адекватными (если такое понятие, как адекватность вообще можно применить к подобному тестированию) я не знаю, т.к. сам я их еще не сдавал, но, как выдастся время обязательно попробую.

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