четверг, 14 июня 2012 г.

Рецензия на книгу Джон Скит "C#: программирование для профессионалов"


В последнее время я все чаще и чаще слышу от своих коллег о том, что язык C# двигается куда-то не туда. Новые возможности в нем появляются слишком быстро, мы тут, дескать, предыдущие еще не освоили, а бравые ребята из Редмонда успели новые навыдумывать, да еще и парадигмы новые к нему прикручивают. Фич в языке уже столько, что их ни в одну нормальную голову уже не впихнуть; мало того, что их много, так с некоторыми еще и без бутылки (без спецификации) не разобраться. Да и вообще, какой-то второй С++ получается, осталось добавить undefined behavior в десяток мест спецификации и мы получим чудище, аналогичное детищу Страуструпа.

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

Благодаря своей структуре, книга “C#: программирование для профессионалов” позволяет увидеть эту целостную картину и
структурировать новые или существующие знания. На протяжении всей книги автор рассказывает об эволюции языка C# от первой версии, появившейся на свет в 2002-м году, до последней на данный момент, 4-й версии, появившейся на свет восемью годами позднее. По ходу изложения рассматриваются проблемы, присущие предыдущим версиям языка и способы их решения в последующих версиях. При этом автор дает понять, каким путем идет развитие языка C#, прогнозируя при этом будущие изменения. Все это приводит к тому, что разные фрагменты головоломки, под названием язык программирования C# начинают постепенно складываться, позволяя увидеть картину целиком.

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

Другими важными особенностями книги являются стиль и глубина изложения. Что касается стиля, то в один момент времени Джон Скит фокусируется на одной возможности языка (one step at a time), что позволяет читателю легче погрузиться в рассматриваемую тему и правильно ее понять. В принципе, книгу не обязательно читать с начала до конца; изложение построено таким образом, что вы можете выбрать интересующую вас тему или просто открыть ее на любой странице и углубиться в чтение. Что касается глубины изложения, то для различных тем она отличается от «достаточно глубоко» до «о чем думает компилятор и как он реализует ту или иную возможность». Большая часть рассматриваемых тем относится именно к языку C#, а не к проблемам загрузки сборок, работе сборщика мусора или многопоточности (2). Единственным исключением из этого правила является предпоследняя глава, в которой автор знакомит читателя с Code Contracts: «Если бы эта книга была посвящена английскому языку, то эта глава была бы посвящена поэзии». Джон серьезно рассчитывает на то, что контрактное программирование станет повседневной практикой большинства разработчиков и что в ближайшем будущем книга по языку C# или платформе .Net, в которой не будет описания контрактов, будет считаться устаревшей. И хотя в одной главе о контрактах Джону не удалось копнуть настолько же глубоко, как он это сделал в большинстве других глав, сам факт такого пристального внимания к теме контрактного программирования со стороны столь известного разработчика не может не радовать.

Напоследок хочется сказать, что  “C#: программирование для профессионалов”  является одной из лучших «продвинутых» книг по языку C#, которые когда-либо выходили в свет (3). Так что если вам нужно устаканить свои знания языка C# или разобраться глубже с той или иной возможностью, то книга Скита – это отличный способ это сделать.

(1) О Джоне Ските ходит множество слухов, включая мнение, что он уже давно придумал все новые возможности языка C# и даже написал об этом книгу, которую через три года откроет Андерс Хейлсберг, чтобы сравнить, правильно ли его команда реализовала все новые возможности.

(2) Это тонкий намек на то, что книга Скита практически не пересекается с “CLR via C#”, так что эта парочка конкурентами не является; они скорее дополняют друг друга, а не заменяют.

(3) Если вы попробуете задать подобный вопрос на stackoverflow.com, то его закроют через несколько минут с указанием двух десятков дубликатов, при этом в девятнадцати из этих дубликатов будут советовать именно книгу Скита, как лучшую “advanced” книгу по языку C#.


Sergey Teplyakov (Programming stuff)