Перевод Статьи Бьярна Страуструпа «Чему Мы Должны Учить Новых Разработчиков Программного Обеспечения?» Почему?

Опубликовано в январском номере журнала Communications of ACM. небольшая статья дяди Страуструпа о проблемах преподавания информатики.

Статья далеко не спорная и, конечно, сильно ориентированная на американское общество, но интересная и вполне актуальная для нас.

Предлагаю перевод (несколько художественный, но близкий к оригиналу) вашему вниманию и обсуждению, если вы хотите его улучшить - добро пожаловать здесь



Чему и почему следует учить молодых программистов.

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

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



В чем проблема.

Во многих местах существует разрыв между тем, что нужно промышленности, и тем, чему программистов учат в университетах.

Например: Знаменитый профессор информатики с гордостью: «Мы не учим программированию, мы учим информатике».

Менеджер отрасли: «Они не могут запрограммировать самое элементарное!» Во многих случаях правы оба, и не только на первый взгляд. Не дело университета выпускать средних программистов, но и промышленности нужны не только «мыслители высокого уровня с широким кругозором» и «ученые».

Другой профессор информатики: «Я никогда не программирую».

Другой менеджер: «Мы не берем на работу выпускников компьютерных наук.

Легче научить физика программировать, чем преподавать физику выпускникам этого факультета».

Они оба в чем-то правы, но в идеальном мире они оба были бы в корне неправы.

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

Я, конечно, не имею в виду тех физиков, которые много сил тратят на информатику — такой набор качеств был бы для меня идеален.

Профессор информатики (о студенте): «Он получил работу в промышленности».

Другой профессор информатики: «Жаль, потому что он подавал большие надежды».

Эта несогласованность лежит в основе многих проблем и усложняет попытки их устранения.

Промышленность хочет, чтобы выпускники компьютерных наук занимались программированием, по крайней мере, на ранних этапах своей карьеры.

Часто им приходится работать с давно зарекомендовавшими себя источниками какой-либо распределенной или встроенной системы с высокими требованиями к надежности.

Однако многие выпускники практически не имеют знаний и навыков в разработке программного обеспечения, за исключением некоторых любительских развлечений.

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

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

системы кодируются с абсолютным пренебрежением к одним и тем же алгоритмам, данным и структуре кода.

В результате получается вялый и плохо поддерживаемый беспорядок.

Для многих «программирование» стало странным сочетанием бессовестного взлома и использования чужих библиотек (при наличии лишь смутного представления о том, что на самом деле происходит).

Понятия «поддержка» и «качество кода» обычно забываются или не до конца понимаются.

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



Но в последнее время мой компьютер почему-то не зависает.
Сейчас модно жаловаться на программное обеспечение, но за последнее десятилетие многие программы улучшились, как и в предыдущие десятилетия.

К сожалению, за улучшения мы платим огромную цену человеческими и машинными ресурсами.

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

Сама структура кода иногда менялась, но не всегда в лучшую сторону.

Часто многоуровневое программное обеспечение и сложные зависимости мешают программисту, даже если он гений, полностью понять систему.

Это не сулит нам ничего хорошего, потому что мы не понимаем и даже не можем измерить критические аспекты наших систем.

Конечно, есть инженеры, которые сопротивляются искушению создавать раздутые, плохо понятные системы.

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

Они заслуживают похвалы за свои усилия по превращению разработки программного обеспечения в зрелый и надежный набор принципов, инструментов и технологий.

К сожалению, их меньшинство, и раздутое программное обеспечение доминирует в чувствах и мыслях многих людей.

Точно так же есть преподаватели, которые борются с разрывом между теорией и производственной практикой.

И они тоже заслуживают поддержки и благодарности.

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

Однако общая картина совсем не впечатляет. Пара проектов или стажировок — хорошее начало, но они не заменят полноценный подход к сбалансированному учебному плану.

Предпочтение «информатики» ярлыку «разработка программного обеспечения» или «информационные технологии» может указывать на разницу во взглядах, но проблемы имеют неприятную тенденцию вновь появляться в новых обличиях и после смены обстановки.

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

Я воспринимаю это как промышленного исследователя и менеджера (24 года в AT&T Bell Laboratories, 7 из них в качестве руководителя отдела), который провел последние 6 лет в университете (на факультете компьютерных наук инженерного факультета).

Я много путешествую и каждый год провожу серьезные дискуссии с техническими и управленческими людьми из нескольких десятков компаний, в основном из США.

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



Разрыв между теорией и практикой
Что мы делаем? Промышленность предпочла бы нанимать «разработчиков», полностью обученных новейшим инструментам и технологиям, в то время как высшая цель науки — выпускать лучших ученых в больших количествах.

Для того чтобы мы могли добиться прогресса, эти идеалы должны быть лучше согласованы.

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

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

Отдельно отмечу проблему масштабирования.

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

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

Понимая это, многие организации упрощают инструменты, технологии, языки и рабочие процедуры, чтобы свести к минимуму зависимость от опыта разработчиков.

Это просто пустая трата человеческого таланта и труда, поскольку она сводит всех к наименьшему общему знаменателю.

Отрасль хочет полагаться на проверенные временем инструменты и технологии, но в то же время склонна мечтать о серебряных пулях, волшебных пузырях, убийственных приложениях и так далее.

Она хочет иметь возможность работать со сменными программистами минимальной квалификации во главе со «архитекторами», которые слишком серьезны, чтобы заботиться о таких мелочах, как качество кода.

Это приводит к чрезмерному консерватизму в выборе основных инструментов (таких как языки программирования и операционные системы) и к монокультурности (для минимизации затрат на обучение и внедрение).

В свою очередь, это приводит к появлению огромных проприетарных инфраструктур, несовместимых друг с другом.

Чтобы позволить разработчикам писать приложения, необходимо что-то помимо базовых инструментов, в то время как поставщики платформ хотят каким-то образом связать разработчиков, несмотря на общность основных инструментов.

Системы вознаграждения вознаграждают как грандиозные корпоративные схемы, так и краткосрочные результаты.

Конечным результатом являются как затраты, так и количество неудачных новых проектов.

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

в вакууме.

Проприетарные инструменты для работы с огромными объемами исходного кода, написанные в архаичном стиле, в эту модель не вписываются.

Как и промышленность, наука изобретает соответствующие схемы стимулирования.

Все это прекрасно сочетается с постоянным улучшением неуспевающих курсов по четко определенным научным предметам.

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

Всегда найдется кто-то, кто считает, что если бы индустрия платила программистам достойную зарплату, то проблем не было бы.

Это может иметь смысл, но просто платить больше за ту же работу мало поможет, когда отрасли действительно нужны лучшие разработчики.

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

Это отталкивает наиболее компетентных людей из этой области и никоим образом не стимулирует студентов к изучению этой науки.

Чтобы разорвать этот порочный круг, из университетов должно выйти больше выпускников с адекватными навыками, а промышленность должна внедрить инструменты, методы и процессы, которые смогут использовать эти навыки.



Мечты о профессионализме.

"Информатика" ( Computer Science, в этом тексте до сих пор переводится как «информатика» — мое примечание ) — ужасный и вводящий в заблуждение термин.

В основном речь идет не о компьютерах и не о науке.

Скорее, речь идет об использовании компьютеров и способах работы и мышления, включающих вычисления («алгоритмическое и вычислительное мышление»).

Он сочетает в себе некоторые аспекты науки, математики и техники, часто с использованием компьютеров.

Практически для всех людей, которые этим занимаются, информатика является прикладной областью.

«Чистая информатика», отделенная от прикладного использования, обычно бесплодна.

В чем разница между двумя людьми, создающими приложение, один из которых разбирается в информатике, а другой является профессионалом в какой-то другой области, например, в медицине или физике? Первый должен свободно владеть фундаментальными принципами, «ядром» информатики.

Что оно может включать в себя? Большая часть установленных курсовых работ по информатике — алгоритмы, структуры данных, машинные архитектуры, принципы программирования, немного математики (в основном для логического и численного мышления) и компьютерных систем (операционные системы, например, или СУБД).

Чтобы собрать воедино все эти знания и получить представление о том, как работать над большими проблемами, каждый студент должен принять участие в нескольких групповых проектах (это можно назвать элементарной программной инженерией).

Главное, чтобы был баланс между теорией и практикой.

Информатика – это не только принципы и теоремы и не только глупое программирование.

Очевидно, что это ядро гораздо более ориентировано на компьютеры, чем информатика в целом.

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

Но этого недостаточно.

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

Опытные педагоги могут воскликнуть: «Но это невозможно! Какой студент сможет научиться всему этому за четыре года? Они правы: чем-то приходится жертвовать.

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

Те, кто планирует и дальше заниматься научной деятельностью, как всегда, будут стремиться получить степень кандидата.

Многие профессора скажут: «У меня нет времени программировать!» Однако я считаю, что профессора, обучающие студентов, которые хотят стать профессиональными разработчиками, должны находить время для программирования, а учебные заведения должны найти средства для вознаграждения таких профессоров.

Основная цель информатики должна состоять в том, чтобы помочь создавать более совершенные системы.

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

Я использую слово «профессионал».

Оно имеет множество смыслов и значений.

В таких отраслях, как медицина и машиностроение, это предполагает лицензирование.

Лицензирование – очень деликатная и эмоциональная тема.

Но наша цивилизация зависит от программного обеспечения.

Разумно ли, что кто-то может изменить критически важный фрагмент кода исключительно на основании своего вкуса и корпоративной политики? Даже если так, будет ли это разумно через 50 лет? Разумно ли, что программное обеспечение, от которого зависят миллионы людей, не имеет гарантии? Настоящая проблема заключается в том, что профессионализм, подтвержденный лицензией, зависит от наличия большой массы общедоступных знаний, инструментов и технологий.

Лицензированный инженер может подтвердить, что здание было построено с использованием общепринятых материалов и технологий.

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

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

Что может сделать промышленность, чтобы сократить этот разрыв? Дать характеристику «промышленности» и «промышленным потребностям» гораздо сложнее, чем говорить о науке.

Ведь научные учреждения имеют достаточно стандартные структуры и подходы к достижению своих целей.

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

Поэтому я не могу даже начать прописывать лекарство.

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

Промышленный менеджер: «Если хочешь выжить, никому не показывай свои технические способности» Организация не может оставаться успешной без корпоративной памяти и инфраструктуры для поиска и развития новых талантов.

Более тесное взаимодействие с учеными, заинтересованными в разработке программного обеспечения, может быть продуктивным для обеих сторон.

Совместные исследования и упор на долгосрочное обучение, выходящее за рамки простых учебных курсов, могут сыграть в этом важную роль.



Заключение.

Мы должны стать лучше.

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

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

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

Это могло бы идти рука об руку с долгосрочной поддержкой технических экспертов из академических кругов и промышленности.

Теги: #образование #информатика #перевод #страуструп #Чулан

Вместе с данным постом часто просматривают: