Чтобы не пропало

Вот я тут в комментах у [info]mbr в очередной раз обосрал школьную информатику — но чтобы не пропало, вынесу сюда списочек «что должен знать интересующийся предметом старшеклассник».

За «обязательный минимум» можно принять, скажем, COS 109 — курс Брайана Кернигана по «компьютерной грамотности» для студентов «нетехнических» специальностей в университете Принстона. Специально даю ссылку не на книгу (Understanding the Digital World), а на страничку курса — там есть довольно полезные «лабораторные работы» и наборы задач. В эти «лабораторные работы» входит, скажем, простой HTML, рисование фотожаб, работа с электронными таблицами, представление о программировании.

В этот минимум хорошо бы добавить еще умение пользоваться текстовым редактором и текстовым процессором (и понимание разницы между ними), какими-нибудь «мультимедийными» программами типа аудио- или видеоредакторов, 3D-редакторами, «переустановить винду» и вообще пользовательскую грамотность (не только применительно к ПК, но и для «мобильных устройств» с iOS или Android — как «перекинуть фоточки» и все такое).

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

Перейду теперь к «максимуму» — или «что должен знать юный программист». По моему опыту, этот объем знаний вполне посилен интересующемуся школьнику, но намного превосходит то, что было бы разумно включить в школьную программу. В любом случае, от «начинающего программиста» хочется ожидать примерно следующего:

— знакомство с двумя-тремя (а может, и побольше) достаточно разными языками программирования; к примеру, я в старших классах, помимо стандартного школьного Паскаля, «пощупал» пару вариантов QBasic, Visual Basic, Delphi, C (и даже написал пару-тройку сравнительно больших программ под Windows), PHP (по статьям в журнале Ксакеп), пару «игрушечных» языков (из этой книжки) (RL — диалект Лиспа и «игру в схемы» — своеобразный HDL);
— к предыдущему пункту — знакомство, пусть даже поверхностное, на уровне «а это тоже можно программировать», с парой разных «платформ» — скажем, можно пощупать «десктопные» приложения, браузерный Javascript, CGI-приложения, приложения для мобильников, прошивки микроконтроллеров;
— представление о различных алгоритмах и структурах данных — то есть все эти стандартные «сортировки пузырьком», «красно-белые деревья» и все такое (к этому же пункту отнесу и «теоретическую информатику», но возможно — в сильно урезанном даже по сравнению со школьной программой виде);
— представление о том, что такое реляционные базы данных, ER-модель, умение написать простой SQL-запрос;
— понимать, как работает современный веб — где выполняется Javascript, что такое веб-сервер, как работают CGI-приложения, как это все связано вместе;
— к предыдущему пункту — какие-то основы сетей — знать, что такое TCP, IP и еще куча буковок, уметь настроить WiFi-роутер и с помощью Wireshark подрезать чужой пароль;
— элементарные навыки работы/администрирования Unix-образных систем («переустановить винду» относим к компьютерной грамотности) — поставить две ОС на одну машину, знать основные команды в терминале, уметь настроить веб-сервер, поставить WordPress, вот это вот все;
— «практика с железом» — раньше я написал бы сюда «умение сделать нуль-модемный кабель для игры в Doom», сейчас даже не знаю, что можно считать аналогичным — но что-то все равно надо;
— «как это все сломать» — условно говоря, основы хакинга — от SQL injection и cross-site scripting до использования ошибок типа переполнения буфера;
знать полное собрание сочинений Дани Шеповалова.

Вот как-то так :)