Всё чаще слышны споры о том, нужно ли высшее образование программисту, и, учитывая, что поток мнений на эту вне всякого сомнения острую тему не иссякает, я решил высказать свои мысли. Как мне кажется, всеобщее разочарование в учёбе связано с многочисленными процессами и изменениями, происходящими в профессии и нуждается в серьёзном изучении. Ниже я рассмотрю наиболее распространённые заблуждения, мифы и основные причины явления.
Туда ли вы зашли?
Ещё раз напомню: Университет – не ПТУ, в нем изучают устройство гвоздей, а не учат их забивать. Вузы выпускают учёных и инженеров, а не обслуживающий персонал. Также нельзя забывать, что программистов у нас в стране выпускают математические факультеты, и официально они считаются математиками, хотя в последнее время и появились именно программистские направления, с ориетацией на промышленное программирование.
В вузе учат в первую очередь фундаментальным знаниям, тем, которые не устареют через несколько лет к вашему выпуску. Американский биолог из Национальных Институтов Здоровья написал мне: «Times change but fundamentals do not change» – времена меняются, а основы остаются. Именно поэтому лучше выбирать общие направления обучения и стараться брать максимальное число курсов по выбору, именно поэтому в американских вузах у физиков столько, на взгляд многих, «ненужных» курсов, таких как биология, химия или литература, вместо специализированных. Карл Саган, учившийся на астронома, упоминает в своей книге, что у них были лабораторные работы по генетике и эксперименты по проверке гипотезы абиогенеза. Не говоря уже о том, что в США можно кроме основной (major) получить еще несколько (minor) специальностей. Так что при выборе из теории эволюции и программирования Java – выберите лучше первое, возможно, когда-нибудь эти знания пригодятся в вашей карьере или жизни. Язык вы всё равно изучите, а специально интересоваться историей нашей планеты вряд ли станете. Ведь сужать свой кругозор всегда легче, чем расширять его.
Не следует считать, что в зарубежных вузах ситуация принципиально отличается. В результате многих лет параллельной эволюции во всём мире сложились схожие требования к специалистам. Вы совершенно правы в том, что вас будут учить иначе, но ошибаетесь в том, что вас будут учить иному. В вузах разных стран отличаются образовательные процессы, названия и объём курсов, качество практики и уровень вовлечённости учащихся в реальную науку, но теоретический минимум, лежащий в основе, везде примерно схожий. Происходит это не столько в результате унификации, сколько по объективным причинам: законы природы инвариантны во всех странах. Поэтому специалист из одной страны может работать во всём мире.
Кто такие программисты
Чтобы проиллюстрировать важность проблемы, я обращусь к аналогии. Представьте, что вы спросили, какая профессия у некоего человека, и вам ответили, что он строитель. Не имея никакой иной информации, сможете ли вы сказать, чем он занимается? Он может быть архитектором с художественным образованием, инженером, прорабом, квалифицированным рабочим или уборщиком строительного мусора. Не говоря уже, что во многих перечисленных направлениях есть свои специализации. И всё равно его бы назвали строителем, но, очевидно, что это разные строители. Чтобы сколотить собачью будку, не нужно специальное образование, а вот небоскрёб без него не возвести. Однако тех, кто занимается первым, обычно строителями не считают. Программистами же сейчас называют кого угодно. Математик, занимающийся алгоритмами; разработчик навигационных программ в НАСА; эксперт в ассемблере, изучающий вирусы; школьник, верстающий HTML страницы – всё это программисты. Так что прежде чем ответить на вопрос: нужно ли программисту образование, вам следует уточнить – какому именно. Возможно, в вашем конкретном случае образование действительно не нужно.
Нравится нам это или нет, но мечты Стругатских о мире младших научных сотрудников рухнули. Большинство же людей не собирается быть учёными или инженерами, и им нужно не университетское, а среднее специальное образование, которому учат в образовательном учреждении, называемом сейчас на европейский манер колледжем. Потому что, как правило, их желания и потребности не соответствуют целям вузов, а уровень предлагаемой им работы мало связан с наукой или инженерий. В этом нет ничего ужасного, так как во все времена в любой сфере инженеров всегда было меньше, чем рабочих. И в самой рабочей профессии, если она вам нравится, нет ничего унизительного, но при этом не нужно называть себя инженером. Вместо этого нужно честно признаться самому себе, кем вы хотите стать и не требовать от вузов быть тем, чем они не являются.
Семь раз отмерь
У каждой специальности есть свой минимальный набор обязательных знаний. У информатики и программирования такой основой служат математические курсы; так что вопрос: «нужно ли программисту образование?», обычно превращается в «нужна ли программисту математика?» или «нужно ли программисту так много математики?» Учитывая, что программист в классическом смысле – это инженер, вопрос можно сформулировать и иначе: «нужно ли образование инженеру?» Споров на этот счёт обычно не возникает. Проблема разве что вот в чём: не все хотят быть учёными и инженерами. Если предел ваших мечтаний – успешная игра в App Store, а не проектирование искусственного интеллекта, криптографического алгоритма или программ трёхмерной анимации, вы можете смело минуя вуз приступить к её выполнению, но и в этом случае знания не испортят вам карьеру. В вузах не знают, кем вы себя видите через много лет и чем планируете заниматься – не говоря уже о том, что вы сами в семнадцать лет можете ещё этого не знать. Считается, что лучше заранее научить вас всем основам, чем упустить что-то важное. Кроме того, основные курсы, как правило, взаимозависимы и нельзя просто взять и изъять некоторые из них. И их главная цель – не научить вас всему на свете, что в принципе невозможно, а предоставить вам примерную карту современных научных и инженерных знаний, чтобы при столкновении с неизвестным, вы смогли принять верное решение, в каком направлении идти.
Вернёмся к математике. Практически все книги по алгоритмам требуют от читателя некоторой математической культуры. А алгоритмы и структуры данных – как сказал Никлаус Вирт – являются программами, и не умея работать с ними, нельзя называться программистом. Причём это не обязательно умение разрабатывать свои алгоритмы, намного чаще нужно изменять чужие, приспосабливая их к частным случаям, но также и умение доказывать их корректность и применимость в различных условиях, и умение анализировать их поведение в некоторых ситуациях. Математика активно применяется таких областях как криптография, графика, распознавание образов, работа с видео, звуком и изображениями, математическое моделирование реальных процессов. В таком, казалось бы, приземлённом системном программировании без серьёзных математических знаний невозможно написание компиляторов, планировщиков и файловых систем.
Математика является тем каркасом, на который нанизываются все прочие знания. Увы, многие начинают осваивать профессию с конца. Программист, изучивший языки программирования, инструменты разработки, различные технологии и паттерны, но не освоивший математические основы, напоминает художника, научившегося в совершенстве разбираться в красках и кистях, освоившего множество приёмов, но при этом не знающего композиции, перспективы, анатомии и прочих основ. У него может быть много гениальных мыслей, но выразить их он не сможет, и всё, на что ему остаётся рассчитывать – это работа ассистентом или раскрашивание чужих картин. Изредка незнание основ формирует новые стили, как, например, в случае с Ван Гогом (к его чести нужно сказать, что он осознавал свои проблемы и брал уроки живописи у профессионалов), но чаще становится препятствием в творчестве. И если в искусстве это ещё можно оправдать тем, что автор так видит, то в промышленности неправильный алгоритм генерации случайных чисел, приведший к тому, что миллионы долларов честных налогоплательщиков промахнулись мимо цели, не оправдан ничем.
При этом нельзя забывать, что для большинства программистов математика является скорее инструментом, чем наукой, и преподавать её нужно именно так, особенно первые курсы, всякий раз объясняя студентам, зачем им это нужно.
Что же касается гуманитарных и прочих непрофильных курсов, то их важность подчёркивается не только тем, что любому человеку желательно быть культурных и образованным, но ещё и тем, что человеческий разум крайне непредсказуем и порой черпает вдохновение из самых разных источников. Мой учитель русского языка рассказала мне историю ещё советских времён, как в одном авиационном вузе решили сэкономить и перестали читать курсы литературы. И что бы вы думали? Вскоре уровень выпускаемых инженеров снизился. Литературу пришлось вернуть. Так что курсы эти нужны. К сожалению, их часто ужасно преподают, что отнюдь не прибавляют им популярности; но мы же с вами говорим о самой идее, верно?
Так что если вы не используете знания, полученные в вузе, то проблемы скорее всего не в них, а в вашей работе, которая не позволяет вам реализоваться. Глупо винить свой вуз в неправильных знаниях, если человек учился проектировать алгоритмы шифрования, а работает менеджером в строительной фирме.
Зачем нужны вузы?
Хорошо, скажете вы, но чем регулярное образование лучше самообразования? В конце концов программирование не генетическая инженерия – лаборатории не нужны, а всю теорию можно выучить самому. В самом деле: учебные программы вузов известны, многие курсы открыты, любую книгу можно купить, взять в библиотеке или прочесть в Сети. Однако, не всё так просто, как кажется. Математику, в отличие от технологий и языков программирования, самому изучить очень нелегко. Вы можете и не знать, что делаете что-то не так, пока вам об этом не скажут. Огромное значение имеет и личное общение, например, можно несколько часов слушать лекцию и ничего не понять, а в перерыве узнать у преподавателя ответы на все вопросы. Некоторым программистам всё же нужны лаборатории и условия, например, тем, кто хочет программировать микропроцессоры с уникальной архитектурой, суперкомпьютеры, промышленных роботов или спутники.
Учёба в вузе – это ещё и возможность пройти практику в компаниях и организациях, в которые иначе бы вас не пустили. Это возможность заниматься наукой, писать статьи и участвовать в конференциях, что является условием работы в исследовательских лабораториях многих компаний, например, Samsung. Практически все серьёзные технологии были разработаны в университетах, а некоторые, в частности, знаменитый LLVM, вообще выросли из студенческих проектов. Известные компании были основаны учёными и выпускниками в стенах вузов: Silicon Graphics, Sun Microsystems, Yahoo, Adobe и многие иные.
Last but not least без формального образования, причём профильного, вам будут закрыты двери многих организаций, в прочих же вам придётся всякий раз доказывать свой профессионализм и быть намного лучше конкурентов, так как при прочих равных, за ними будет преимущество. Также без него практически нереально получить рабочую визу в приличные страны.
Кстати, требование «какого-нибудь» образования без указания профиля – во многом российское изобретение, так как во всех просмотренных мной англоязычных вакансиях всегда указывают желаемую степень, направление или приравниваемый к ним опыт.
Когда стучат снизу
Проблема имеет глобальный характер, но наиболее остро проявляется именно в программировании. И вот почему. Снижение входного порога сыграло с профессией злую шутку. Изначально все инструменты разработки писались опытными программистами, чтобы упростить свою жизнь. Эти технологии приносят пользу лишь в случае, если вы понимаете какие процессы в них происходят. Таким образом они позволяют вам написать большее количество программ за меньшее время, но их качество зависит исключительно от ваших знаний и умений, так как инструменты разработки ещё не умеют мыслить и принимать осознанные решения за вас. Затем кто-то решил, что упрощение программирования привлечёт в профессию больше специалистов, многие даже мечтали о временах, когда все люди, вне зависимости от своих способностей смогут писать программы. Бойтесь своих желаний. Увы, сейчас они во многом стали реальностью, и совсем не так, как предполагалось в семидесятые годы. Распространение дешёвой техники и легкость разработки привели к тому, что на рынок хлынул поток низкоквалифицированных программистов. А предложение, как выяснил ещё в прошлом веке Сирил Норктот Паркинсон, рождает спрос. Но мало написать программу, её ещё нужно распространять. Появление множества онлайн магазинов программ как раз предоставило такую возможность всем желающим. Открывшие их Google, Apple, Microsoft и прочие компании заинтересованы прежде всего в как можно большем числе программ для своих платформ, и они же выпускают инструменты разработки к ним. В таких условиях инструменты ещё сильнее упростились, что в конечном счёте привело к ещё большему снижению начального уровня программистов.
Итогом всего этого стала иллюзия легкости программирования, отношение к нему, как к чему-то несерьёзному, не требующему специальных знаний и образования, причём такое мнение сложилось не только у самих работников, но и, что много хуже, у неискушённых заказчиков и работодателей. Многие видели объявления с внушительным списком необходимых навыков, языков, библиотек и технологий, многочисленных обязанностей – исключая разве что курьерские услуги – которых с лихвой хватило бы на несколько вакансий, и скромной, если не сказать смешной зарплатой.
Это сложно себе представить в таких отраслях, как, например, авиастроение, так как там, где ценой оказываются человеческие жизни, очень тщательно подходят к выбору персонала и используют многочисленные фильтры, чтобы отсеять некомпетентных инженеров. Никому не нужны миллионные выплаты страховок, лишение лицензий и потеря репутации. Так, авиаконструктор может быть или хорошим, или никаким, потому что плохого никто не пустит к самолёту, какую бы низкую зарплату он не просил. Совсем иначе в программировании, в котором нет нижней границы, и всякий программист, какого бы низкого уровня он не был, не останется без работы. Факт, что наша цивилизация все ещё жива, говорит лишь о том, что большая часть выполняемой ими работы не является критически важной, и не то чтобы никому не нужна, но без неё легко можно было обойтись, а проблемы в ней не приводят к катастрофе. Представьте, что все компьютерные игры в мире внезапно прекратили свою работу, является ли это катастрофой? Разумеется, нет. Безусловно, это глобальная проблема, но уж никак не катастрофа. А если та же участь постигнет авиалайнеры, результаты будут трагичными. Конечно, и в программировании есть связанная с риском серьёзная и ответственная работа с жёстким отсевом, но её намного меньше.
Гарантии и реальная жизнь
Разумеется, сказанное не означает, что само наличие образования или знание математики превратит всякого в программиста мирового уровня. Всем известно, что большинство выпускников вузов не работают по своему направлению. И я лично знаю немало математиков, пишущих ужасные программы. В конце концов у вас может не быть способностей к программированию. Я вообще против использования упрощённых критериев. В жизни важно всё: и образование, и знания, и оценки, и научная работа, и практика, и ваше желание.
Многие воспринимают слова о социальном лифте слишком упрощённо, в реальности же вуз является скорее социальной лестницей, и чтобы прийти к желаемому, вам нужно идти самим. Образование не гарантирует вам хорошую работу, если вы сами не приложили усилий. И если вы во время учёбы не участвовали ни в каких проектах и начали искать работу лишь после выпуска, значит программирование вам не интересно.
Как же они?
Билл Гейтс, Марк Цукерберг, Ларри Эллисон. Читая истории успеха известных людей, многие неокрепшие умы мыслят так: «если они смогли, значит и я смогу». Возможно. Но имейте в виду, что успех – понятие многогранное: одно дело стать успешным маркетологом и совсем иное – выдающимся программистом. Тем не менее не секрет, что некоторые всемирно известные программисты не имеют образования, но, примеряя их жизни на себя, помните, что они представляют собой редкие счастливые исключения среди множества неудачников. Если кто-то выпрыгнул из окна и остался жив, это не значит, что вам не стоит использовать лестницу. Аналогично не нужно (весьма распространённая ошибка) путать бумагу с образованием: то, что они не закончили обучение, ещё не значит, что они вовсе не учились. Практически все они проучились несколько семестров, прослушали первые курсы и получили некоторые знания, а, например, Стив Возняк через много лет всё-таки вернулся и завершил свою учёбу. Не меньшее значение имеют их интеллектуальные способности и характер: как правило, все они яркие, умные, талантливые и в чём-то гениальные личности, с самого начала знающие, что им нужно, целеустремлённые, занимающиеся исключительно тем, что им нравится, и обладающие феноменальной работоспособностью. Они не спрашивали чужого мнения и не навязывали своего. И всё же некоторые из них, например, Джон Кармак, жалеют, что в юности считали себя самыми умными и ничему не учились.
Если вы такой же как они, я искренне желаю вам успехов, противном случае не лучше ли использовать проверенные пути?
Автор: arielf