Я уже пять лет обучаю наших сетевых инженеров Python. Не отправляю их на курсы по программированию для новичков, а выбираю именно формат внутреннего обучения. В этом посте я постараюсь дать развернутый ответ, чем мне не угодили массовые курсы, и расскажу об одном серьезном недостатке многих из них. Еще будет немного прикладной пользы для сетевых инженеров, которые самостоятельно хотят освоить Python и упростить себе работу.
Я работаю в центре сетевых решений. Это более 150 человек, из которых, по крайней мере, 100 — инженеры. Повседневная работа последних всё чаще требует применения инструментов автоматизации и скриптов. Увеличивается вес программной части внедряемых нами решений, повышаются требования к скорости их развертывания. При этом там, где раньше требовалось настроить одно устройство, сегодня нужно развернуть десятки и более типовых структурных элементов — виртуальных серверов, маршрутизаторов, межсетевых экранов.
Автоматизация необходима. Но это в теории. На практике же наши инженеры не спешат осваивать программирование самостоятельно, чтобы сделать свою работу проще: часто эта область кажется им сложной и непривычной. Я же, как главный конструктор и архитектор, всегда хотел, чтобы сетевые инженеры, работающие со мной на проектах, владели современным набором инструментов, а не только командной строкой. То есть могли писать скрипты под задачи и ориентировались в смежных областях: DevOps, SRE и др.
Для этого надо было упростить им вход в новую сферу, дать базовые инструменты и помочь получить первые результаты. Так мы с командой пришли к созданию собственного курса, как самого короткого пути к этой амбициозной цели — обучить (всех) наших инженеров программированию.
![](https://habrastorage.org/getpro/habr/upload_files/135/40d/de4/13540dde46da3cda2fd38617e084495b.png)
Python или Python
Для старта надо было выбрать язык программирования, который мы будем изучать. Я считаю, что в принципе нет критичной разницы, что выбрать для старта, поскольку главное — освоить именно само программирование, понять базовые основы, а сделать это можно на примере любого языка (языки, специально созданные для ненормального программирования, исключаем из рассмотрения).
Но был ряд обстоятельств и ограничений, которые привели к Python. В университете мы можем осваивать язык в течение нескольких семестров: сначала обучать студентов алгоритмизации, потом изучать прикладные вещи. Мы в центре сетевых решений не хотели превращать наших специалистов по инфраструктуре в разработчиков. Мы стремимся быстро, за пару недель, научить наших инженеров полезному в их работе навыку, да еще так, чтобы уже во время курса и сразу после него участники ощутили результат. То есть внедрили что-то в повседневную работу, и сразу что-то им стало лучше, быстрее, удобнее делать.
Python можно рассматривать как современный аналог Бейсика. Именно на Бейсике я написал в 1987 году свою первую программу. Этот язык создавался как раз для того, чтобы непрограммисты могли писать программы для решения своих задач. Для тех же целей сегодня отлично подходит Python. У него низкий порог входа, при этом он достаточно выразителен, чтобы писать на нем программы сразу «правильно», в соответствии с современными парадигмами.
Еще одно обстоятельство: вся автоматизация в OPS пишется именно на Python, именно под Python написаны основные библиотеки по управлению сетевым оборудованием, и именно этот язык часто можно увидеть в качестве встроенного языка в платформы популярных сетевых вендоров.
При таких вводных для сетевых инженеров лучшим выбором оказался Python, и за две недели реалистично научить людей с его помощью решать задачи.
Зачем нужен свой, когда уже есть тысячи других?
Наверное, самым важным при запуске любого внутреннего обучения становится вопрос о его необходимости. Зачем инвестировать в обучение тому, чему можно научиться на сотнях, если не тысячах уже существующих курсов?
У меня есть несколько аргументов в пользу внутреннего обучения:
Это, конечно, возможность кастомизировать курс под конкретные задачи компании или команды. Такая настройка «под себя» повышает эффективность обучения в несколько раз по сравнению с массовыми продуктами. В программировании циклы можно объяснять на примере решения задач про погоду и игры, а можно с самого начала решать задачи, моделирующие деятельность сетевого инженера. Например, на нашем курсе по Python я использую кейсы из практики «Инфосистемы Джет»: работу с сетевым оборудованием по SNMP, по REST API, анализ конфигов сетевого оборудования, построение таблиц IP-адресов. Это повышает прикладную полезность курса и сильно подстегивает мотивацию студентов. Они практически с первых дней понимают пользу осваиваемого навыка. И возможность вот так адаптировать общий навык к работе в конкретной компании или отрасли мне кажется ключевым фактором, определяющим необходимость запуска тематического внутреннего обучения.
Необходимость выбирать из множества онлайн-курсов и учебников может на старте тормозить людей, ведь надо выбирать подходящий источник из тысяч доступных, самому выстраивать процесс обучения и контролировать результаты. В случае внутреннего курса от них требуется лишь записаться на занятие, прийти на него и дальше двигаться по структурированному и уже проложенному другими пути из точки А в точку Б. И даже в этом случае необходимы личная мотивация и усилия, чтобы записаться, регулярно посещать занятия, делать лабораторные и совмещать всё это с загрузкой по проектам, с чем не все справляются.
Внутреннее обучение сильно ускоряет распространение навыка в компании и способствует росту экспертизы команды. Люди делятся впечатлениями от курса, мотивируют записываться других, помогают друг другу. Курс Python создавался под конкретные потребности нашего центра, но очень быстро вышел за его пределы. За эти годы я обучал не только сетевых инженеров, но и тестировщиков, сисадминов, специалистов по серверам, начинающих DevOps-инженеров и др. Мы в центре даже не ожидали, что наш узкоспециализированный курс будет так широко востребован. В этом году курс уже был трижды прочитан, а в листе ожидания еще 20+ человек. Я стараюсь обучать группы не более 12 человек, но оптимальное число студентов в одном потоке, на мой взгляд, — восемь. В таком составе преподаватель способен отследить прогресс каждого, помочь разобрать ошибки и дать персональную обратную связь.
Как и чему я учу сетевых инженеров
Кратковременные обучения в ИТ длятся в среднем 40 часов — это некий стандарт индустрии. Вендорские курсы не исключение: чаще всего они проходят в течение пяти дней по восемь часов. Треть этого времени отдается теории, остальное — практике.
Я ориентировался на это же количество часов, но разделил его на две недели. Каждый рабочий день мы занимаемся по четыре часа, чтобы не выдергивать полностью людей из процессов. Схема показала себя как жизнеспособная и удобная, и в эти сроки мы успеваем освоить все запланированное.
Научить человека программировать за две недели — это в определенной степени авантюра, но на положительный результат, конечно, влияет то, что все мои студенты — не люди с улицы. Одним приходилось уже что-то писать на языках программирования, другие представляют себе, как устроен компьютер — поэтому за 10 дней курса получается создать у наших инженеров более-менее целостное представление о программировании.
![](https://habrastorage.org/getpro/habr/upload_files/4c2/23f/504/4c223f50499bd4e8604d7017df6ee503.png)
В рамках курса мы рассматриваем все основные синтаксические конструкции Python (кроме async, метаклассов и множественного наследования): что-то подробно разбираем, что-то лишь упоминаем. На каждую конструкцию я стараюсь подобрать пример, который можно показать «интерактивно» — в командной строке или в Jupyter Notebook. Сложные непривычные конструкции — вроде yield и декораторов — разбираем сразу с использованием отладчика. А на лабораторных работах стараемся сделать так, чтобы студенты «руками» несколько раз реализовали самые важные синтаксические конструкции: цикл, ветвление и функцию. Для тех, кто хорошо справился, добавляются еще генератор и декоратор.
Для лабораторных работ я стараюсь подбирать такие задания, сделав которые, студент получит результат и сможет применить инструмент сразу в работе. Мы на первом же занятии заводим аккаунты на GitHub тем, у кого до этого его не было. Студенты выкладывают туда все результаты, и у меня есть скрипт, который их анализирует. Но я еще обязательно смотрю сам, и дальше в личном порядке стараюсь разобрать с человеком на примере его кода, какие практики программирования хороши, а какие не очень, где сделано оптимально, а где лучше было бы сделать иначе.
Главная проблема курсов по программированию
Большинство массовых курсов по Python (да и по другим языкам тоже) на самом деле не про программирование. Они сосредотачиваются на изучении библиотек этого языка. Выбор библиотек определяется субъективными предпочтениями автора курса. На мой взгляд, важнее дать студентам понимание принципов, положенных в основу языка, к которому уже должны прилагаться практические навыки — например, умение использовать библиотеки.
С другой стороны, важно не уйти в крайность, когда в качестве задач используют слишком абстрактные и оторванные от реальной жизни примеры. Еще для такого прикладного курса важно найти требуемый баланс между сложностью и простотой учебного материала: не скатиться в примитивность и не провалиться в неоправданную сложность, превратив все в «олимпиадное» программирование, которое хорошо в других ситуациях.
У проектирования собственного курса есть значимое преимущество — ты можешь не повторять какие-то тиражируемые без конца неудачные паттерны. Например, во многих коммерческих образовательных программах отсутствует общетеоретическая часть о программировании. С моей же точки зрения, это самое важное в обучении языкам. Поэтому я стараюсь делать так, чтобы курс был не только о Python, но и о программировании вообще: как программы исполняются компьютером, как вообще принято писать код, что такое репозиторий и для чего всё это нужно.
Если человек получает набор разрозненных фактов и инструментов без понимания базовой концепции, то мы не оставляем шанса сформироваться системному мышлению. В дальнейшем, на практике, это приводит к тому, что человек не способен решить задачу, если ее условия сильно отличаются от учебных. В сети доступно множество качественных ресурсов, на которых человек может найти и скопировать нужный ему для решения задачи фрагмент кода. Но если что-то после этого копирования пойдет не так, человек без системного представления процессов не сможет разобраться в проблеме. Поэтому преподавателю нужно инвестировать время и усилия в то, чтобы студент мог выстроить системное представление о программировании и уже новые инструменты встраивал в эту систему. На мой взгляд, рациональнее это делать на самых первых этапах обучения. За две недели, естественно, сформировать такое комплексное и системное представление невозможно, но заложить некоторые основы для развития в правильном направлении — вполне.
Поэтому мы начинаем с того, что такое программа, код, данные и структуры данных, а также:
разбираемся, что такое интерпретатор, отладчик, репозиторий, среда разработки;
изучаем, как выполняются программы, как представляются данные и как оно в целом внутри компьютера устроено;
пытаемся понять, как из простых программ и элементарных структур данных создаются сложные программные комплексы.
Во второй части курса мы занимаемся более прикладными вещами — меньше учим сам язык и больше пробуем с его помощью решать задачи: организовать обмен по сети, написать маленький веб-сервер, извлечь какую-то информацию с оборудования или, наоборот, записать какую-то информацию на оборудование.
![](https://habrastorage.org/getpro/habr/upload_files/9fc/0b9/f3a/9fc0b9f3a4dafcfcb1c543bbb0af7aa4.png)
Об опасности рядового программиста
Программист, не понимающий сути программирования, опасен для себя и окружающих, особенно при современных подходах в программировании, когда простыми действиями легко можно создавать (и разрушать!) очень сложные структуры. И если не управлять этой сложностью, она имеет тенденцию быстро расти, и программист уже не может с ней справиться. Поэтому важно учить и учиться самим тщательно продумывать и делить задачи на части, выполнять их и тестировать, что получилось. Также важно донести до новичков понимание, что программный код пишется не для компьютера, потому что компьютеру более-менее всеё равно, какой код исполнять, а прежде всего — для самого себя и для других разработчиков. Потому что очень просто написать код, на который смотришь через день-два и вообще не понимаешь, что ты такое написал и как это может работать. Неосторожными действиями можно очень резко нарастить сложность, с которой будет невозможно справиться.
Особенно остро последствия таких действий проявляются в промышленном программировании, когда мы имеем дело с системами, которые создавались в течение многих человеко-часов большими командами. Каждый участник такой проектной команды понимал и делал задачу «в меру своей испорченности», внося дополнительную системную сложность и баги. Если еще всё это плохо задокументировано, то задача поддержки такой системы становится очень трудной. Тем, кто продолжит её развивать, придется тратить часы и дни, чтобы разобраться, что и зачем написали предшественники. Чтобы сократить эти ненужные издержки и проблемы, нужно уже в самом начале обучения формировать комплексное представление у человека о том, как его действия влияют на систему.
![](https://habrastorage.org/getpro/habr/upload_files/ac3/8b9/202/ac38b92026444018aab8fc0eaf6de781.png)
Это, конечно, актуально именно для курсов, где целенаправленно готовят разработчиков, но и даже после курса прикладного программирования для непрограммистов, как наш, выпускники должны понимать свои возможности и ограничения. И если программирование «зашло», то представлять, в каком направлении и как дальше развиваться.
Что я использовал для других, а вы можете применить для себя
После того, как принято решение о запуске внутреннего курса, следующий важный вопрос — как и на основе чего составить программу. Мы ориентировались на наши повседневные потребности в проектах. Но есть и более универсальные источники, которые мы в том числе использовали в подготовке. Приведу список, который могу рекомендовать сетевым инженерам для самостоятельного изучения:
Марк Лутц «Изучаем Python». Классический англоязычный труд, который регулярно переиздается на русском языке. Из него я взял описание Python как языка.
Курс Наташи Самойленко «Python для сетевых инженеров». У Наташи есть YouTube-канал и множество коммерческих продуктов на эту тему: учебник и курсы. Это уже совсем близко к нашим целям, но подача теории здесь не совсем соответствует моим представлениям об идеале. А вот практическая часть хороша: речь идет именно о тех библиотеках и возможностях языка, которые востребованы в работе инженеров.
Андрей Столяров «Программирование — введение в профессию». Автор работал у нас в «Инфосистемы Джет», долгое время преподавал на кафедре алгоритмических языков факультета вычислительной математики и кибернетики МГУ. Это фундаментальный трехтомный труд, из которого я очень много взял с точки зрения систематизации знаний у моих студентов. Он содержит объяснение основ программирования и обеспечивает понимание того, как программы создаются и как они должны создаваться, что такое хорошо и что такое плохо в программировании. Справедливости ради стоит отметить, что автор язык Python не любит и считает, что учить программировать на нем нельзя, потому что потом получаются специалисты с испорченной психикой и для промышленного программирования непригодные. Мы не стремимся подготовить за две недели разработчика для Enterprise — у нас более скромные и прикладные задачи, для которых Python хорошо подходит. Но труд Андрея Столярова вовсе не для изучающих конкретный язык, а для всех, кто пишет или собирается писать программы длиннее ста строк.
Как обучаться самому
Для начала можно посмотреть несколько роликов на YouTube, поставить Python и попробовать по этим роликам сделать простые вещи.
Как только чему-то научились, можно начать читать книгу Марка Лутца.
Как только прочитали и осмыслили, что в ней есть, надо продолжать писать код. Желательно такой, который будет решать ваши реальные задачи, а лучше — задачи вашей команды. Для этого сетевым инженерам и пригодится курс и другие ресурсы Наташи Самойленко.
Можно потренироваться на задачах и упражнениях (например, на checkio.org), чтобы уверенно освоить синтаксис языка и базовые алгоритмы. На этом этапе также полезно посмотреть вокруг — какие еще есть языки, кроме Python.
Если научились писать программы длиной хотя бы в пару сотен строк, стоит начать читать монографию Столярова. В самостоятельном обучении также нужно не пропустить эту часть с пониманием базовых принципов программирования — ведь именно она, а не знание отдельных функций, сделает из вас программиста.
Максим Клочков
Руководитель группы проектирования решений по передаче данных Центра сетевых решений
«Инфосистемы Джет»
Комментарии (17)
inkvizitor68sl
25.07.2022 16:22Хорошо, конечно, но почему это на хабре, а не в вашей местной этушке?
Ради списка из трёх книг/курсов и одной ссылки на checkio?mklochkov Автор
25.07.2022 16:28В нашей местной... в чём, простите? Расшифруйте, пожалуйста :)
inkvizitor68sl
25.07.2022 16:29Внутреннем "хабре" для сотрудников, если вкратце -)
mklochkov Автор
25.07.2022 17:08Статья — попытка начать дискуссию на тему «почему инженер/админ/связист боится/не хочет написать нужный ему по работе кусок кода» и как ему можно помочь (захотеть). Вернее, вынести наши внутренние обсуждения на эти темы на более широкую аудиторию. Готовы об этом поговорить?
inkvizitor68sl
25.07.2022 17:15+1Потому что инженера/админа/связиста заставляют "написать" на строго определённом ЯП, принятом в компании, соблюдая code-style (обычно - достаточно сложный), принятый в компании, используя либы, написанные в компании взамен общедоступных, а на баше/powershell и в ансибл писать запретили ? -)
mklochkov Автор
25.07.2022 17:20Ну точно не про нашу компанию, и не про наше подразделение. У нас скорее другая проблема — когда молодой и очень старательный инженер в текстовом редакторе перепиливает 100500 правил ACL из формата, условно, cisco, в формат, условно, iptables, и пользуется максимум поиском/заменой. Хотя никто не запрещает ни bash, ни awk, ни регулярные выражения, ни perl, ни python.
inkvizitor68sl
25.07.2022 17:44Хорошо вам -)
Только курсы-то у вас всё равно по python.
А лично моя практика показывает, что решая ops-задачи на python, тратишь 10% времени на логику приложения/скрипта, а остальные 90% - на, собственно, сам python (приведение типов данных к одному, try/except и вот это вот всё).
Это, конечно, не отменяет того, что некоторые (подчёркиваю - некоторые) задачи нужно сразу автоматизировать на python и не тратить время на троллейбус из буханки (например, вебморда и обработка данных от пользователей - шеллы сразу идут лесом), но вот пихать его везде подряд (а уж тем более - начинать с него обучение как первому языку для опса) - весьма затейливая идея, которая быстро вызывает отвращение к любым ЯП. Особенно если использовать python вместо awk-а.mklochkov Автор
25.07.2022 17:55Давайте воспользуемся принципом «критикуешь — предлагай». К питону как к первому языку у меня тоже масса вопросов, но на чём ещё учить?
В вузах сейчас учат в основном сразу на несуществующем языке «С/С++» (ибо «индустрия требует»), и ребята приходят к нам уже с психотравмой и стойким отвращением к написанию кода.
Идти по пути, предлагаемому Столяровым — методически правильно, но на это нужен плюс-минус год.
Какие ещё есть варианты?inkvizitor68sl
25.07.2022 18:27+1Ну давайте прямо к вашим задачам.
в текстовом редакторе перепиливает 100500 правил ACL из формата
Этим стоит начать с awk, sed и так далее. А потом поучить shell - настолько, чтобы понимать, что [ - это команда, и вместо неё в if можно использовать любую другую (в том числе и сабшелл ()).
положить кучу устройств
Этим нужно показать ansible и запуск по стейджам.
При том показать не только то, что ansible умеет пакетики ставить и файлики подкладывать, но и что он, например, почти полностью может настроить zabbix (что даёт какой-никакой monitoring as a code) и настраивать микротики. А там уже постепенно переходить к jinja-шаблонам/циклам.
Ансибл вообще великолепный инструмент, который одновременно прививает мышление "everything as a code" с одной стороны, а с другой стороны не ломает паттерны мышления сходу людям, которые мыслят как классические опсы. Главное, не забыть им рассказать, почему ансибл не декларативен на самом деле в 90% случаев.
несуществующем языке «С/С++»
Этим (если они хотят продолжить!) можно и нужно показать golang. Можно, конечно, ещё rust, но где они потом работу искать будут - вопрос интересный. Можно и python, впрочем - но, опять же, если хотят.
Но безапялицонно показывать людям python как первый инструмент для автоматизации ops-работы - плохой путь. Это полноценный ЯП, который требует определённого мышления и достаточно глубоких знаний - и не все, кто пришёл в ops, хотят идти этим путём. А то потом очень смешно смотреть на sys.exec('curl', '...') в коде бывает, когда это из под палки идёт.
Лет 10 назад, впрочем, был перл - его так и не заменили, но забросили. А зря.
mklochkov Автор
25.07.2022 19:42Про shell и ansible — всё так и есть, а дальше возникают вопросы
можно и нужно показать golang. ... безапялицонно показывать людям python как первый инструмент для автоматизации ops-работы - плохой путь. Это полноценный ЯП
golang я не знаю (видел издали, слышал хорошие отзывы, но ни строчки кода на нём не написал), впечатления от него — это хороший, полнофункциональный язык, особенно для того чтобы быстро и качественно написать backend-часть веб-приложения.
Почему вы его противопоставляете питону, называя питон «полноценным ЯП»? Чем golang менее «полноценен»?
inkvizitor68sl
25.07.2022 20:21а дальше возникают вопросы
А дальше возникать вопросов не должно, дальше - другая профессия, как её ни назови, освоить которую на "курсах" не выйдет.
Почему вы его противопоставляете питону
Я противопоставляю шелл питону, а не golang -)
Нельзя научиться нормально программировать на каких-то курсах, посвящая этому пару часов в неделю. Чтобы писать и на golang, и на python, и на любом другом полноценном ЯП - нужно знать много базовых вещей - типы данных, алгоритмы, ООП, внутренняя логика ЯП и остальное.
Можно ли это выучить за, допустим, 100 академических часов? Нет.
А дальше 2 варианта - либо человек сидит и использует только стандартные заученные конструкции в коде и не может ничего толком написать (зачем ему тогда пайтон, если конструкции в ансибле запомнить проще?), либо - сидит и страдает, пытаясь реализовать простые вещи, которые знают "настоящие" программисты, используя свой скудный набор знаний - и тратит туеву прорву времени на элементарные программы, начиная ненавидеть сам процесс всё больше и больше.
mklochkov Автор
25.07.2022 21:36На «каких-то курсах» научиться «нормально» нельзя ничему — здесь задача осуществить bootstrap и показать направление, куда двигаться (это вообще любых курсов касается).
Верно и обратное — те сотрудники, которым можно показать направление, и они сами начинают в том направлении идти, быстрее всех прогрессируют, и очень ценятся работодателями.
А дальше 2 варианта - либо человек сидит и использует только стандартные
заученные конструкции в коде и не может ничего толком написать (зачем
ему тогда пайтон, если конструкции в ансибле запомнить проще?)Это вообще самый сложный вопрос подготовки (и самоподготовки) любого специалиста — как сделать так, чтобы знания сложились в систему. Здесь нет однозначного ответа (за годы преподавательского опыта я его так и не нашел). Мне кажется, что нужные нейронные связи будущий специалист может сформировать только сам — пробуя, ошибаясь, размышляя, и берясь за всё более сложные задачи. Это стресс, это боль, но пойти по «простому» пути (годами использовать стандартные конструкции для решения стандартных задач) — тоже невесело, и ценность такого специалиста будет со временем падать.
inkvizitor68sl
26.07.2022 13:58+1Это вообще самый сложный вопрос подготовки (и самоподготовки) любого специалиста — как сделать так, чтобы знания сложились в систему
Нужно превратить этот вопрос в "как позвать на курсы тех, кому оно надо", вот и всё.
Что, конечно, противоречит общей тенденции "давайте не делать нормальные инструменты, пущай на питоне пользователи напишут", но зато очень продуктивно в перспективе в большом опс-отделе - заинтересованные люди будут писать автоматику, остальные люди будут ей пользоваться.ценность такого специалиста будет со временем падать.
Ценность сотрудника, который несколько часов пишет 5 строк на питоне тоже не сильно растёт - он при этом дропает ту работу, которую мог хорошо и быстро сделать. Не говоря уже о том, что обязаловка с ЯП бьёт по синдрому самозванца даже тех, кто хорошо справляется с той работой, на которую его вообще-то говоря нанимали.
mklochkov Автор
26.07.2022 14:48Нужно превратить этот вопрос в "как позвать на курсы тех, кому оно надо"
Можно поставить вопрос ещё шире — например, «как принять на работу тех, кто будет хорошо работать». Пока наша концепция (для начинающих специалистов) — чтобы был интерес к тому, чем мы занимаемся (и к ИТ в принципе). Остальному можно научить и научиться.
inkvizitor68sl
26.07.2022 16:57Так вы нанимаете на работу людей для одной работы, а потом предлагаете учить им совершенно другую работу -)
Если у вас задача сделать из своих джунов программистов, чтобы они сменили профессию и перестали заниматься опсом - это один вопрос.
Если вам нужно растить опсов, чтобы они оставались опсами - то лучше поучить их другим вещам.Людей, которые, будучи джуном в одной профессии, смогут успешно осваивать вторую, не забив на первую - исчезающе мало
Emelian
Это все, конечно, хорошо, но годиться разве что только вашим «сетевым инженерам». Концепции обучения могут быть разными, хотя, обычно, наиболее предпочитаемой является собственно придуманная. Поэтому, люди, с самостоятельным типом мышления, всегда желают идти своим путем. А для «пассивно» мыслящих, любой выход за границы курса означает только одно: «Мы этого не проходили!».
Ради интереса, могу высказать свою точку зрения, хотя следовать ей не обязательно.
Мое мнение, фундаментальные науки, вроде математики, надо учить в ВУЗах, у классных преподавателей, которых будешь вспоминать годами. А науки «второго уровня», вроде иностранных языков, программирования и т.п., надо учить самостоятельно, за исключением разве что спецконтор, где требования могут быть на порядок выше.
Исходить нужно из класса решаемых задач. Когда учащийся плохо себе представляет, зачем ему нужен очередной «язык» (иностранный или программирования), но есть желание потратить на это время на каких-нибудь курсах, особенно, за счет фирмы, то «почему бы и да», пусть учится, само по себе, в этом ничего плохого нет.
Однако, активно мыслящие специалисты, предпочитают учить себя сами. Возьмем тот же Питон. Главный вопрос – это основное предназначение данного языка. Кто-то считает его универсальным языком программирования, я же полагаю, что это язык для обработки и подготовки данных. Здесь ему равных нет. Естественно, применять его можно и за этими пределами, для построения GUI и даже игр. Но, как по мне, есть более удобные средства для этого.
Например, с помощью Питона (и FFmpeg) можно создавать обучающие видео, по тому же иностранному языку (примеры на my.mail.ru/mail/emmerald/video/_myvideo ), а если написать на С++ обучающую программу, то и данные для нее (см. scholium.webservis.ru ).
Непосредственно курсов программирования, обучающих этому не найти, но сам язык достаточно прост, чтобы выучить его самостоятельно и затем решить поставленную перед собой задачу. Понятно, что другим это не надо, поэтому соответствующих курсов организовывать не нужно, достаточно написать пару статей на данную тему.
А по обучению иностранном языкам, очень удобно использовать идею: «запоминание руками + интерактивный звук», как по, мне это очень практичная идея. Работаешь на уровне отдельной фразы, набираешь ее руками, прослушиваешь сколько угодно раз и проговариваешь ее вслед, чтобы, в конечном счете, посмотреть и понять всё видео с двуязычными субтитрами, а затем и оригинальный ролик. Вот как раз для подготовки подобных данных Питон – незаменимая вещь.
mklochkov Автор
Спасибо за развернутый комментарий. Да, мы с помощью курса пытались решить именно наши задачи. Как получилось — лучше расскажут сами участники обучения (а также те, с кем они вместе работают).
По поводу деления наук на «первый и второй уровни» — спорное утверждение. Хорошая вузовская программа предусматривает теорию (лекции, семинары) и практику (лабы, курсовые). Алгоритмы, дискретная математика, теория формальных языков, реляционная алгебра — это теория. А написание кода на конкретном языке — это, конечно же, практика.
В наших условиях мы, конечно же, можем дать в основном практику. Теорию — только «по верхам», в расчете, что кто-то заинтересуется и пойдет читать книжки.