четверг, 7 апреля 2011 г.

Рецензия на книгу Джона Скита “C# in Depth”, 2nd Edition

CSharp_In_Depth

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

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

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

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

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

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

----------------------

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

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

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

16 комментариев:

  1. Мне кажется, что он всё-таки не Джон, а что-нибудь вроде Йон.

    ОтветитьУдалить
  2. Ну все, теперь осталось написать еще рецензию для "C# in a Nutshell" и "CLR via C#" все лучшие книги по C# будут покрыты.

    ОтветитьУдалить
  3. По вашему мнению, какая книга больше подойдёт на роль учебника по С#, "C# in Depth" или "C# Unleashed"? Удобно ли их чтение через Amazon Kindle?

    ОтветитьУдалить
  4. @sombre hombre: Ну, хз, может и Йон, только translate.google.com говорит, что должно быть Джон. Да и Йон звучит как-то не очень. В общем, даже если это и не так, у меня он будет Джоном:)
    З.Ы. здесь это имя произносится как Джон.

    ОтветитьУдалить
  5. @Ruben: Моя рецензия на "CLR via C#" опубликована на rsdn.ru. Правда она на русское издание (т.е. предыдущее на данный момент), но тем не менее она есть. А вот с книгой Албахари лично я знаком не очень близко. Постараюсь это как-нибудь исправить.

    @Grigory: Если говорить об учебнике, то книга Скита вряд ли будет хорошим вариантом, особенно, если опыта в программировании относительно не много. Что касается C# Unleashed, то, возможно, это тоже будет не лучшим вариантом, по этой же причине.

    В общем вывод такой: если вы достаточно опытный программист, то C# 4.0 Unleashed (просто он больше тем покрывает), либо Скита, а лучше - обе.
    Если не слишком опытный, то либо Троелсена (если совсем опыта мало), либо Албахари.

    Что касается чтения на kindle-е, то я бы не советовал. У меня 6-ти дюймовый экран и читать на нем pdf практически не реально. Возможно будет нормально читать такое дело на iPad-е, но я, по старинке, рекомендовал бы бумажный вариант.

    ОтветитьУдалить
  6. >>Если не слишком опытный, то либо Троелсена (если совсем опыта мало)

    ИМХО, Троелсена только если студент, или опыта в программировании 0.5-1 лет.

    ОтветитьУдалить
  7. Мне кажется, что он всё-таки не Джон, а что-нибудь вроде Йон.

    Джон, Ион и Иван это одно и тоже имя

    ОтветитьУдалить
  8. Да, книга Скита очень крутая, вначале года даже обзавелся её hard-copy версией (как раз прямо после публикации второго издания). Читаю потихоньку, но т.к. с C# особо вообще не приходилось иметь дела, каждый раз открываю для себя что-нибудь новое )

    Среди новых свершений Джона можно назвать новую бесплатную книжку Edulinq по серии постов "Reimplementing LINQ to Objects" из его блога.

    ОтветитьУдалить
  9. @qosys: Да, я тоже в бумаге ее читал. И даже несмотря на достаточный опыт, как теории, так и практики, нового узнал достаточно много.

    Да, а серия Скита Reimlementing LINQ тоже очень прикольная.

    ОтветитьУдалить
  10. Этот комментарий был удален автором.

    ОтветитьУдалить
  11. В своем блоге я сослался на Вашу рецензию и там же опубликовал перевод на русский язык (рабочий) вводной главы из книги Джона Скита «С#: углубленный курс программирования»

    ОтветитьУдалить
  12. Виктор Николаевич, спасибо, что вы взялись за перевод такой замечательной книги. Как вы смотрите на предмет научной редактуры этой книги? Книга очень хорошая и ее важно не испортить качеством перевода. Я опять вам предлагаю свои услуги в этом вопросе, так что если надумаете, буду рад сотрудничеству.

    ОтветитьУдалить
  13. "Джон серьезно рассчитывает на то, что контрактное программирование станет повседневной практикой большинства разработчиков и что в ближайшем будущем книга по языку C# или платформе .Net, в которой не будет описания контрактов, будет считаться устаревшей."
    Интересный факт состоит в том, что "Програмирование по Контракту" есть зарегистрированная торговая марка системы Eifel, созданной Бертранном Майером ещё очень и очень и очень давно. И он тоже думал о том что писать иначе не будут. Более того, в Eifel таки иначе и нельзя :). Что-то последние лет 20-25 как-то мало программировали по контракту. :) Может пока Майкрософт не "разрешит" программист не перекрестится?

    ОтветитьУдалить
  14. Сам факт того, что одна из mainstream платформ (это я про .NET) получила в свое распоряжение инструмент для контрактного программирования говорит о том, что эта техника набирает популярность.

    Тоже самое, кстати, можно сказать и о функциональных фишках, которые проникают в C# с завидным постоянством.

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

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

    ОтветитьУдалить
  15. @всем по поводу Джона/Йона:

    На самом деле, Скит - он Jonathan Skeet, Jon - это сокращение от Jonathan. Последнее произносится так - Джонатан. Поэтому и Jon произносится как Джон.

    ОтветитьУдалить
  16. А для введения в Шарп, кто подойдет?

    ОтветитьУдалить