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

Вот я тут в комментах у [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 до использования ошибок типа переполнения буфера;
- знать полное собрание сочинений Дани Шеповалова.

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

32 комментария

  1. kettle пишет:

    Вас бы, Шура, отправить на годик учителем информатики в сельскую школу, что бы подкорректировали свое мнение насчет 3-4 языков программирования для пары разных платформ.
    Вам дай волю, вы в программу автошколы в обязательные добавите занятия по смене ремня ГРМ и прокачки тормозной системы в одно рыло. :) И еще будете обдумывать не стоит ли заодно рассмотреть замену колец поршней в зависимости от износа цилиндров и проточку тормозных дисков.

    • А что в этом такого? Это же не обязательная программа, а этакий ориентир, позволяющий определить, интересуется ли человек информатикой или так, ЕГЭ сдал на сто баллов.

      Да, 3-4 языка для пары разных платформ – это не особо сложно и много. “Школьный” Pascal или лучше Python, скажем, PHP для веба (но и Python сюда можно), добавим сюда Си для компа и ардуины какой-нибудь (или другой вариант – Java для компа и андроида) – вот и “три языка для пары разных платформ”.

      • kettle пишет:

        в этом потеря связи с реальностью.
        я не про возможность найти 3-4 языка, я про возможность их освоить в рамках школьной программы, да еще применительно к разным платформам.
        нет, если на уровне

        main(){printf(”hello world”);}
        10 print “hello world”
        program test; begin writeln(’hello world’); end.
        то вопросов нет. Но если что-то более осмысленное – хотя бы один язык освоить и то хорошо.
        На все ИКТ, емнип, отводится порядка 100 часов.
        Для примера, учебный центр при МГТУ. Базовые понятия пых-пыха – 24 часа. И еще 32 на html5 и css3, которые желательны перед пых-пыхом. И еще 24 часа на пых-пых в связке с мысклом. И еще 32 часа на сам мыскл. И все, часы закончились. А мы только начали.
        Там же в учебном центре: “Базовая компьютерная подготовка с изучением Windows, Word 2019/2016, Excel 2019/2016, Internet ” – 84 часа.
        Добавляем туда 16 часов поверпоинта и все, ваше время истекло.
        А вы хотите сюда упихнуть кодинг, графику 2д/3д, видео и т.д.

        • А где я предлагаю запихнуть вот это все в школьную программу? Наоборот:

          > этот объем знаний вполне посилен интересующемуся школьнику, но намного превосходит то, что было бы разумно включить в школьную программу

          “Для примера, учебный центр при МГТУ” – ну его на хуй.

        • 105 часов – это в 7-9 классе; добавим еще 10-11 – где на “базовом” уровне на информатику отводится 70 часов, а на профильном – все 280.

          И добавлю – нет необходимости изучать в школе “пых-пых в связке с мысклом”. Кому надо – осилит это и сам.

          • kettle пишет:

            В “7-9 классе” я год занимался в “кружке”, где нас пустили за СМ-4 с бейсиком. Час в неделю. Тогда это был 6-й класс. Ну да. фор/иф я дэцл освоил. Но не более того.
            А на профильном у нас было 2 лекции и 2 семинара. (или 4? запамятовал уже). Вот знаете, тоже нефига не густо.
            Не нравится МГТУ, возьмите любой другой учебный центр с курсами по компьютерном безграмотности, можно даже взять иностранные.
            Например, официальный курс микрософт “внедрение и управление вин10″ – 40 часов. “поддержка и устранение неполадок вин10″ – еще 40 часов.
            И если вы думаете, вас там научат глубоко рыться в потрохах винды, шерстить реестр и логи – обломитесь.

            • Вот удивительно – но в трех школах, где я учился, в каждом из старших классов был как минимум один человек (а где был “технический” уклон – по двое-трое; ИМХО этого достаточно), умевший “рыться в потрохах винды” и “шерстить реестр”, научившихся этому безо всякого официоза типа курсов МС. Да и вообще, список составлен по мотивам реальных событий.

              • kettle пишет:

                В потрохах винды умеет рыться Марк Руссинович, а остальные так, немножко знают что такое реестр.
                И подозреваю что по мотивам ваших реальных событий мало кто действительно знает перечисленное глубже чем “уверенный пользователь, видел два раза на картинке”.
                Человек, который хорошо владеет фотошопом, потратил на него явно больше, чем 70 часов ИКТ за два года.

                • Я вот не очень помню, сколько часов фотошопа было в 8 классе – но mad skillz там научили, а остальное – как-то самостоятельно.

                  • kettle пишет:

                    Могу ошибаться, но мне думается что ваше владение фотошопом после 8-го класса по функциональным возможностям не далеко ушло от пайнтбраша.

                    • Полиграфической подготовкой мы там точно не занимались, но вот монтаж, небольшая ретушь, и все вот в таком духе – это было. Достаточно, например, для того, чтобы напечатать на цветном принтере печать на документ в нужном месте, хе-хе.

                    • kettle пишет:

                      И это вы называете “умею пользоваться фотошопом”?
                      Вы еще расскажите, что умеете красные глаза в фотошопе убирать. Это вообще, наверное, навык восьмидесятого левела?

                    • Предлагаю также выяснить, что значит “знаю C++”.

                    • kettle пишет:

                      Ну… для начала знать, что С++ это не развитие С, а “форк” от С. :)
                      И main() { cout<<"Hello world";} на знание тянет слабо.

                      Да, кстати, ваш вордпресс съедает то, что считает тегами, там выше должен был быть четвертый hello world на пых-пыхе. Особенно прекрасно это в контексте обсуждения быдлокодинга и прочих технологий. :)

                    • О, отлично, ставим две галочки – за C и C++!

                    • kettle пишет:

                      Ага. И не знаем ни то, ни другое. :)

  2. Михаил пишет:

    Эх, не с той стороны от кобылы ты Дядя Федор телегу ставишь…
    Вся эта движуха работает при соблюдении двух условий 1. есть сформулированный госзаказ на таких специалистов в будущем, 2. создана система, которая не пытается всех научить, а отсеивает всех неспособных!
    В истории есть периоды увлечения, машиностроением, атомными проектами, радиолюбительством, хоккеем и т.д и т.п.
    Увы, но век ИТ на острие прогресса заканчивается.
    Сейчас надо аналогичную программу по биологии и медицине запиливать, а ИТ, к моменту вырастания этих деток будет востребованно на уровне конструирования более лучших паровозов.

    • “Всех научить” – это COS109.

      А что касается биологии и медицины – вот работаю я тут с нейробиологами. Ты бы знал, каким откровением для них стала книжка The scientist and engineer’s guide to DSP (http://www.dspguide.com/ )! Программирование на Python или MATLAB для ученого – сейчас необходимость (даже для филологов каких-нибудь).

    • kettle пишет:

      Ну вы прямо как Греф, то он говорит, что программисты не нужны, а то жалуется, что его ИИ “обул”. :)

  3. squeezedorange пишет:

    “курс Брайана Кернигана по “компьютерной грамотности” для студентов “нетехнических” специальностей в университете Принстона”
    “Нетехнические специальности” – это кто в данном случае?
    Это не курс, а экспресс-ликбез да еще и с перекосами. JS (за каким болтом он нужен, спрашивается) и тут же картинки типа “четкий поц – мутный поц” в главе про граф. редакторы… Ну такой себе курс, в духе брошюрок “ПК для чайников”.

    • This course is meant for humanities and social sciences students who want to understand how computers and communications systems work and how they affect the world we live in.

      JS – как пример языка программирования (большое его достоинство в том, что программу на JS можно запустить на любом “студенческом” компьютере, в отличие от чего-то более серьезного). Очень советую все-таки найти и скачать книжку или посмотреть конспекты лекций, это ни в коем разе не “пк для чайников”.

      • squeezedorange пишет:

        Вводное прочел, тем не менее не понятно, зачем “humanities and social sciences students” примеры на каком бы то ни было ЯП. Это как рассказывать на курсе естествознания всем и каждому, какие реакции происходят на Солнце и что такое главная последовательность, когда достаточно описать строение солнечной системы, чтобы будущий соц. работник не выглядел жителем очень крайнего севера. Возможно, это только моя склонность к упрощению непрофильных дисциплин при обучении.

        • Ну тут две вещи: во-первых, гуманитарии сейчас тоже вполне себе могут столкнуться с программированием; во-вторых, какое-то представление о нем полезно для общего кругозора. В конце концов, в этом курсе на экзамене программировать не требуется (где-то там в сопроводительных материалах писалось), в лучшем случае надо ответить на вопрос “что делает программа”.

      • С JS начинать обучение начинать как раз нельзя. У JS
        - убегающий скоуп
        - массивы – это объекты
        - самая слабая динамическая типизация из всех, что я видел
        - куча частных случаев в синтаксисе и поведении

        ООП в нём избежать не получится – большая часть API в stdlib – объектная.
        Короче, я просто категорически против. Если нет цели создать побольше самых отъявленных кодомакак.

        • В рамках конкретно CS109 никто и не “создает кодомакак”. И до большинства из перечисленных проблем никто в рамках двух лаб в этом курсе и не дойдет.

          • Это так кажется, на самом деле – упрёшься на первых же занятиях. Потому что материал будет даваться детям, которые циклы-то ещё писать не умеют толком, а материал будет даваться на языке, где типичная ошибка “нет метода foo у объекта bar”. Дидактически-верно азы программирования на процедурных языках типа Pascal давать.

            • Надеюсь, что наиболее дидактически верно использовать Turbo Pascal 7.0? Как раз подойдет – на первой лабе установим его на компьютеры студентам (вместе с DosBox, попутно разобравшись с нюансами в винде двух версий и MacOS), на второй – решим проблемы с модулем CRT.

              По окончании курса студенты будут иметь сформировавшееся представление о программировании, как о занятии красноглазиков-аутистов.

              • Зачем? Free Pascal есть.

              • Детям не надо давать промышленные языки программирования. Чем хорош тот же BASIC – там есть ТОЛЬКО ВСТРОЕННЫЕ ФУНКЦИИ, пяток типов (без неявного приведения!) и совсем немного ключевых слов. Это отличная отправная точка. ООП в самом начале – лишнее. Я об этом.
                Pascal, например, создавался для обучения специально с подходящими для занятия в классе требованиями: интегрированная среда с хорошими сообщениями об ошибках и встроенной либо быстро доступной справкой, небольшой размер самого языка – в плане доступных парадигм. В идеале – ровно одна (а не “ООП с элементами ФП и опциональной статической типизацией”). Плюс массивы и строки из коробки, как самостоятельные типы.

                • Turbo Pascal, в котором все учились – это как раз “промышленный язык программирования” тех лет.

                  Что касается парадигм программирования – ООП в SICP, например, объясняется буквально одним абзацем (и в нем нет слов “православие, самодержавие, народность” “инкапсуляция, наследование, полиморфизм”), и более того – нет ничего сложного в ООП как таковом (это вообще заблуждение, что ООП – какой-то “высший пилотаж”).

                  • Насколько я помню, объекты в SICP в том виде, в котором их задумывал Алан Кей, не объясняются. Вижу слово “объекты”, но смысл вкладывают другой.
                    Python и JS, модные нынче – это языки, созданные инженерами для решения инженерных задач. Корявостей дизайна в них – не счесть. В Python – ООП, причем странно-реализованное: множественное наследование, нет ограничения видимости. Когда такое ООП – первое встреченное, то потом ставить голову на место сложно. Ну и в целом давать такой язык первым – значит прививать ложное понимание, что так и должно быть. То же самое с C# и Java. Это всё языки для работы. Со своими компромиссами в ущерб концептуальности. Учебный язык не должен быть таким.
                    На определённом этапе обучения нужен именно процедурный язык. С массивами, строками, графикой. БЕЗ объектов. ООП – это следующий шаг. После достаточного количества кода, написанного процедурно/структурно. Причем нужно опять же нормальное ООП – инвазивное, т.е. когда “всё – объекты”. А не когда “есть объекты, а есть примитивы”, как в Python. И этот язык уже может быть динамически-типизированным как Squeak – он научит работать с объектами через “утиную типизацию”, двойную диспетчеризацию и вот это всё. На этом ООП нужно упереться в производительность в какой-то момент – из-за рефлекшнов в рантайме и прочего. Чтобы ощущалась мощь, но не бесплатная. А дальше, уже имея опыт полярно-разных концепций – “всё руками, никаких абстракций” и “абстракция даже от чисел” – можно брать промышленный язык. Тут уже можно детально работать над пониманием указателей – чтобы было понимание разницы между указателем и ссылкой в managed языке. Параллельно можно рассмотреть реализацию ООП в нескольких промышленных языках – порассуждать о компромиссах тех самых, на которые пошли создатели языков и о том, почему последние так поступили.
                    Turbo Pascal, кстати, это не тот Pascal, который для учебы создавался. Там уже точно “испортили”. TP – это да, промышленный язык/среда.