Какое-то время назад в комменты на HN пришел Алан Кей и отвечал на вопросы. Одна из тем дискуссии, естественно, куда computer science двигаться дальше.
Думать и разговаривать об этом трудно, потому что ответа никто не знает, а заглядывать в будущее никто не умеет. Кроме того, участники разговора часто по-разному оценивают уровень рассуждений — такое даже в этом ЖЖ происходит постоянно. Есть несколько способов смотреть на программистскую действительность:
- Я это использую или могу использовать.
- Я знаю, как это сделать
- Никто не знает, как это сделать
- Никто не знает, что делать
Подавляющее большинство дискуссий происходят на уровне 1. Это уровень How-to и Experience reports. Здесь речь идет о готовых, уже существующих инструментах, которые можно взять с полки. Не подумайте, что тут не о чем говорить — применимость инструментов, эксплутационные качества, взаимные сравнения. Но здесь речь всегда о том, что уже есть, готово, состоялось, сделано кем-то другим, известно как факт, дано нам свыше.
Статьи, написанные на уровне 2, уже вызывают сложности с восприятием, когда их пытаются интерпретировать на уровне 1. Здесь речь идет о том, что предлагается сделать. Новая идея, новый подход, новая библиотека, новый язык — их еще не существует, но конкретика, как это должно выглядеть, уже есть. Естественно, возникает огромное сопротивление — просто потому, что доступ к уровню 1 гораздо проще, чем к уровню 2. Люди очень хорошо видят препятствия (они есть уже сейчас), но с плохо оценивают выигрыш (его никто пока не видел). Я говорю на собственном опыте в том числе — многие вещи я очень легко пропускаю в первый раз, но начинаю ценить, когда они уже состоялись и все вокруг с ними носятся.
Кое-как я, впрочем, научился с этим работать:
- Я априори предполагаю, что любую новую идею я оценить не могу.
- Когда я вижу какое-то предложение (новая библиотека, язык, подход — как правило, это более чем одна идея, часто они еще и зарыты в реализации), я пытаюсь прикинуть новизну каждой идеи отдельно.
- Новые идеи, как мы говорили, оценить нельзя.
- Неновые идеи, как правило, можно оценить по их успеху в других местах.
- Иногда новой может быть комбинация неновых идей. См. выше.
Итого мы либо получаем оценку на основе предыдущего опыта (это уже было и выступило вот так, если вы думаете, что будет по-другому, нужно что-то делать по-другому), либо получаем, что оценку дать нельзя. Результат не очень практичный, но зато согласуется с наблюдениями. Как минимум это помогает не игнорировать идеи, результат которых может быть потенциально существенным. Т.е. мы избавились от ложноотрицательных оценок.
А дальше начинается совсем интересное. Третий уровень — никто не знает как это сделать. Но здесь хотя бы понятно, что именно сделать — т.е. понятны проблемы. Ситуация похожа на второй уровень, только конкретных предложений пока нет. Тут проходят интересные дискуссии о возможных решениях и их недостатках. Аналогично со вторым уровнем, где мы оценивали пользу, тут можно прикидывать реализуемость тех или иных подходов. Схема очень похожа, и ложноотрицательных результатов тоже надо бояться. Интересная особенность этого уровня — решения пока нет ни у кого — означает, что искать его нужно за пределами текущего комплекса знаний, out of the box. Совет:
Дискуссия на третьем уровне очень важна, потому что позволяет прогрессу двигаться инкрементально.
И наконец четвертый уровень — никто не знает, что делать. Ничего не понятно, ничего не известно. Кое-что, впрочем, и тут можно сказать:
- Глобально хочется программы быстрее, больше, надежнее, самостоятельнее, доступнее.
- Почти наверняка можно сделать лучше, чем сейчас.
- В целом понятны способности человека и что надо ориентироваться на них (см. предыдущий пост).
Это совсем космический уровень и у меня не хватает эрудиции описать, что тут происходит. Именно этот уровень отвественен за качественные скачки в computer science, и он почти недостижим последовательным решением сегодняшних проблем из уровней 2–3. Один из предложенных Аланом способов, как можно работать на этом уровне:
Главное, на что я хочу обратить внимание — всегда важно понимать контекст, в котором идет обсуждение. Скажем, спор «почему C++ программистам не нужен Go» идет в контексте первого уровня — две вполне конкретные технологии, данные нам свыше. Заявление «Go был бы лучше, если бы в нем...» это уже второй уровень. Комментарии в духе «это уже есть в Хаскелле» — с первого уровня. Ответ «там не такое же потому-то и потому-то» — опять второй. Третий уровень — это что-то из серии «чисто декларативная система могла бы кардинально снизить сложность», никто такого не видел, но в принципе цель благородная. Ну или попроще — «нужна какая-то модель для программирования в распределенной конкурентной среде» :)
Еще пример: «вот что может JavaScript» — первый. «Вот так можно было бы сделать JavaScript производительнее» — второй. «Как приспособить JavaScript для написания больших программ» — третий. Этот вопрос перешел бы на второй уровень, если бы в любом другом языке эту проблему решили, кстати.
Четвертый уровень — это из серии «в будущем программировать сможет каждый», «в каждой железке будет компьютер» и т.п. Непонятны ни конкретика, ни проблемы, но хочется, чтобы так было.