среда, 30 октября 2013 г.

Интервью с Джоном Скитом

Материал взят из журнала DotNetCurry посвященному технологиям основанным на платформе .NET.

Ссылка на журнал: http://www.dotnetcurry.com/magazine/dnc-magazine-issue2.aspx

Во втором номере этого журнала, мы рады видеть Джона Скита в нашем "виртуальном" кресле. Джон Скит - настоящий помощник сообщества (взгляните на его значки на StackOverflow), ведущий C# специалист и автор множества книг. Джон является MS MVP начиная с 2003 года. В настоящее время он работает в компании Google.



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

DNC: Привет Джон, мы очень рады, что ты нашел время в своём графике для этого интервью. Для начала мы все хотим знать больше о Джоне Ските, расскажи нам как все началось? Как Джон начал работать с компьютерами?

JS: Мой первый компьютер - общий для всей семьи был Sinclair ZX Spectrum 48 K, который мы купили  когда мне было 8. Со временем я покупал и другие модели Spectrum-а, но затем постепенно перешел на PC. Долгое время я проводил большинство своего времени за компьютером, просто играя в игры, но программирование так же всегда присутствовало.

DNC: С какими сложными задачами ты столкнулся при работе на Sinclair? Задачи, которые погрузили тебя глубже в компьютерные науки?

JS: Одним из моих первых "больших" проектов на Spectrum-е было написание аналога языка Logo.  В школе у нас были микрокомпьютеры BBC Micros и Logo использовался как язык для введения в вычисления; я действительно им наслаждался и хотел использовать его дома, но у нас не было интерпретатора для Logo. Я не имел понятия о тригонометрии и не имел хорошего представления о структурном программировании, но я проявил упорство и закончил с достаточно неплохой реализацией. Руководство, которое было вместе с Spectrum-ом было очень хорошим, я буквально выучил оттуда всю элементарную тригонометрию, за долго до того как мы начали изучать её в школе.


Я все еще помню одну подпрограмму рисующую либо удаляющую треугольник представляющий собой черепаху. Подпрограмма начиналась со строки под номером 7000 и если результат выглядел не совсем правильно, я просто добавлял вызов "GOSUB 7000" до тех пор пока она работала. Я понимал, что если имеется более одного вызова подпрограммы в определенном месте, значит что-то было неверно... но я не всегда знал, что именно.

DNC: Хорошо, мы хотели оставить этот вопрос на потом, но сейчас ты сказал, что создал аналог Logo когда тебе было... 8(?)... Задумывался ли ты когда-нибудь о создании своего собственного языка программирования?

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

DNC: Что ж, есть много диванных специалистов и тут у нас есть Джон. Мы все знаем о твоей любви к C#. Большинство твоей работы связано с Java. Какие другие языки программирования ты используешь для работы? Какие-нибудь языки ты изучаешь как хобби или хотел бы изучать? Почему?

Мой секрет заключается в том, что я действительно не знаю другие языки программирования. Я достаточно знаю VB, чтобы отвечать на некоторые вопросы на StackOverflow, и я могу читать некоторые вопросы по F#, но я очень не многоязычен в этом смысле.

JS: Мой секрет заключается в том, что я действительно не знаю другие языки программирования. Я достаточно знаю VB, чтобы отвечать на некоторые вопросы на StackOverflow и я могу читать некоторые вопросы по F#, но я очень не многоязычен в этом смысле. Я определено хочу изучить подробнее F# и надеюсь выучить Go, поскольку мои коллеги много говорили о нём.

Вся хитрость заключается в том, чтобы найти фактическое применение вещам - большинство моего хобби связанно с созданием .NET библиотек таких как Noda Time или написание статей о C#.

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

DNC: Очень хорошо, теперь мы можем добавить и тег Go к твоему списку на StackOverflow. Как программист полиглот как часто у тебя бывает чувство "ммм... это интересно, это работает по-разному в других языках?" Что-нибудь приходит в голову?

JS: Замыкания. Когда вы ссылаетесь на внешнюю переменную из замыкания, что на самом деле это означает? Разные языки имеют разные ответы... В языке C# ответ на этот вопрос менялся с течением времени (если вы захватите переменную цикла в foreach в C# 2.0 - 4.0 то вы в конечном итоге будете захватывать одну и ту же переменную для каждого значения в последовательности; в C# 5.0 будет захватываться новая переменная на каждой итерации).

DNC: Вернемся к твоей любви к C#, какую одну функцию ты всегда хотел но которая никогда не будет реализована или если бы ты мог добавить "единственную"  функцию в C# , что это было бы?

JS: Я бы хотел видеть больше поддержки неизменяемым типам в той или иной форме. Существует много мест, где она может оказаться полезной. К примеру, я люблю поведение анонимных типов - просто неизменяемые классы которые переопределяют методы Equals, GetHashCode и ToString полезным способом, а так же позволяют давать нужные имена их свойствам. Если бы мы могли делать то же самое для обычных классов так же просто! Создание "обычного" класса, который содержит несколько свойств, имеет конструктор принимающий значения и переопределяет различные методы делает код немного boiler-plate (Boiler-plate code - так называют повторяющиеся кусочки программного кода, которые с небольшими изменениями воспроизводятся много раз), особенно если вы хотите создать подлинно readonly переменные, а не имеющие свойства с private set-ером.
Кроме того, я бы хотел видеть больше поддержки для создания неизменяемых типов - инициализаторы объектов и коллекций хороши, но работают только для изменяемых типов. Вы можете использовать паттерн строитель, но это не очень красиво. Я сомневаюсь будет ли добавление функциональности связанной с паттерном строитель интересным дополнением к языку. По крайней мере именованные аргументы и параметры по умолчанию дают альтернативную функциональность. Конечно, эти идеи о неизменяемости на поверхностном уровне. Глубокая неизменяемость сложна, но даёт большие преимущества. Я знаю команда C# знают об этой пользе - если они смогут придумать эффективное решение то это будет замечательно.

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

JS: Самое интересное во всем этом заключается в том, что многие функции которые изначально появились в динамических языках на самом деле не являются динамическими. LINQ - полностью статически типизированный, но генераторы списков появились в Python-e до этого. Так же "var" делает C# похожем на динамический язык, но без потери типобезопастности.  Конечно тип "dynamic" добавленный в C# 4.0 совсем другое дело.

Я думаю новая функциональность async/await добавленная в C# 5.0 (и естественно VB) изменит игру.

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

DNC: Помимо неизменяемости, которая, кажется изменилась только в поддержке ReadOnlyCollections в C# 5.0, что еще находится в списке твоих пожеланий для C# 6.0?

JS: Это все, что я мог предложить, я уверен у команды C# есть что-то гораздо более удивительное на уме. Я уже говорил об улучшенной поддержки неизменяемых типов, так же я бы хотел увидеть улучшенную поддержку кортежей способных сделать некоторый код намного проще, но я так же считаю важным, чтобы C# избежал загрязнение ненужной функциональностью. Команда разработчиков должна держать очень высоко планку для новых функций, только так они могут рассчитывать на то, что разработчики узнают о ней со временем. Мне посчастливилось узнать C# начиная с версии 1.0 , но можете ли вы представить начать его изучение с C# 5.0? Как много времени вам потребуется, чтобы выучить весь язык, включая самые последние добавленные функции? (Я намерено держусь подальше от небезопасного кода, фактически я вырезал целый раздел из знания языка, надеюсь он мне никогда не понадобится).

DNC: Расскажи нашим читателям больше о проекте Protobuf (портированном на .NET). Кроме проекта Protobuf есть ли у тебя сверх секретные проекты над которыми ты работаешь?

JS: Protocol Buffers используется для представления структурированных данных в Google. Это достаточно простой язык для описания структуры, а так же для наиболее эффективного представления для хранения и передачи. Это платформо-независимый формат, который очевидно будет вам полезен если у платформы которую вы используете есть поддержка соответствующей библиотеки. Google сделал проект Protocol Buffers открытым почти сразу, после того как я к нему присоединился и я решил портировать его на .NET. Моя версия находится примерно на ровне с Java и C++  версиями, которые предоставляет Google, но есть и другие порты. В частности, я знаю, Marc Gravell проделал интересную работу в его версии Protobuf для .NET, которая использует немного другой подход.

Сейчас я мало работаю над Protocol Buffers - большинство моего open source кодинга я провожу над NodaTime, который начинал как порт с JodaTime date/time библиотеки для Java, но закончил, тем что стал портом "движка" JodaTime, но с довольно различным API поверх него. Это действительно хороший проект для изучения дизайна API.

DNC: Пожалуйста задай нашим читателям 3 интересных вопроса о C#.

JS: ОК! Несколько вопросов различной сложности:

Вопрос 1: Вызов какого конструктора вы можете использовать, чтобы данный код распечатал True (в реализации .NET от Microsoft)

object x = new /* fill in code here */;
object y = new /* fill in code here */;
Console.WriteLine(x == y);

Помните, что это просто вызов конструктора и вы не можете поменять тип переменных.

Вопрос 2: Как вы можете заставить это код скомпилироваться, так что он вызывает три различные перегрузки метода?

void Foo()
  {
     EvilMethod<string>();
     EvilMethod<int>();
     EvilMethod<int?>();
  }

Вопрос 3: Используя локальную переменную, как вы можете уронить это код во 2-ой строчке?

string text = x.ToString(); // No exception
Type type = x.GetType(); // Bang!

DNC: Можете выбрать одну или две интересных бесед на StackOverflow? (Лично я люблю читать факты о Джоне Ските :))

JS: Да мне тоже нравится страница фактов о Джоне Ските. Как я уже говорил это не совсем все обо мне, я просто удобное имя, чтобы повесить его на шутку. Посты, которые мне нравятся - это те, в которых я узнаю что-то новое о C# или те которые дали повод написать действительно ужасающий код - как правило вместе с комментарием - "это ужасно, не используйте его в реальной жизни".  Мне было очень приятно, когда Эрик Липперт добавил комментарий к одному из таких постов  - "это лучшее злоупотребление C#, которое я когда-либо видел". Одно из преимуществ быть C# разработчиком-любителем заключается в том, что я могу писать код на подобие этого без каких-либо последствий. 

DNC: Если начинающий/молодой разработчик стремится быть похожим на Джона Скита - экстраординарного программиста с чего им начинать? Возможно ли создать "глубокую копию" Джона Скита по программированию?

JS: Начнем с того, что планку надо держать намного выше! Слухи о моей компетенции сильно преувеличены, как вы не раз слышали если говорили с моими коллегами. Я прочитал спецификацию C# более подробно, чем многие люди, и у меня есть дар намеренного злоупотребления возможностями языка и мои навыки общения достаточно хороши, но несмотря на это я не специалист. У меня есть твердое мнение по поводу API и дизайна языка, но попросите меня написать полное приложение, и я окажусь беспомощным.

Комментариев нет:

Отправить комментарий