Продолжая поднятую здесь недавно тему – насколько всё то, чем мы занимаемся, программирование, и насколько наша работа связана с полученным образованием – затронувшую, судя по всему, сердца и умы посетителей Dev.by. В данном случае в посте американского программиста-блоггера Алана Скоркина поднимается вопрос о том, насколько нужна математическая подготовка успешному разработчику.
Вам не нужна математика, чтобы быть хорошим разработчиком, но необходима, чтобы стать отличным
Некоторое время назад меня стали посещать мысли о математике. Видите ли, я занимаюсь программированием уже довольно продолжительное время, и если быть до конца честным, я так пока и не нашёл применения математике в своей работе. Мне пришлось выучить и узнать довольно много различных вещей: фрэймворки, всевозможные тулы, процессы, а также получить необходимые коммуникационные навыки, освоить одну за другой библиотеки и многое другое, но нигде мне математика так и не понадобилась. В этом, разумеется, нет ничего удивительного, в наши времена тотальной web’изации большая часть программистов занимается в той или иной форме CRUD разработкой (create-read-update-delete). Вы занимаетесь веб-консалтингом или работаете в небольшой компании – вы делаете сайты; вы работаете на крупную корпорацию – в основном вы тоже делаете сайты; вы фрилансер – вы делаете сайты. Я, конечно, несколько обобщаю, но уж простите, просто слегка утомился.
Не поймите меня неправильно, это может действительно быть захватывающим и увлекательным занятием – предоставлять людям солюшены для решения каких-то проблем и общаться с интересными людьми в процессе, и мне всё это действительно нравится в течение моих рабочих часов. Но тогда мысль о создании какого-нибудь своего проекта-сайта в личное время кажется все менее интересной и привлекательной, и ты начинаешь искать что-то новое. Собственно однажды это со мной и произошло. Кто-то в таких случаях увлекается передовыми технологиями и всякими там графическими ухищрениями – элегантное визуальное отражение собственных идей и усилий всегда притягивает своей наглядностью и материалистичностью. Но я был не таким. Нет, мне нравится, конечно, красивый интерфейс и всё такое, но не то чтобы меня это приводило в восторг. А вот когда пришлось столкнуться с определёнными проблемами в реализации поиска, я заинтересовался-воодушевился и решил копнуть, что называется, поглубже. С каждым взмахом метафорической лопаты я поражался, насколько мои знания математики подзабылись, а я сам в этом плане деградировал. Примерно то же самое чувствуешь, когда годами не ездишь на велосипеде и толком забываешь, как правильно крутить педали.
Расширяя горизонты
Более углубленное погружение в реализацию поиска открыло передо мной всё богатство интересных проблем программирования/компьютерных вычислений – обучение машин (идеи, связанные с нейросетевыми вычислениями, эволюционными и генетическими алгоритмами, нечёткими множествами и др.), обработка естественного языка и другие задачи из сферы ИИ, анализ алгоритмов, в конце концов. И теперь я везде видел математику, ещё острее чувствовал недостаток своих знаний. Я пришел к осознанию того, что если вы хотите делать действительно классные и интересные вещи с компьютерами, то нужно иметь достойный уровень знаний в математике. Ведь кроме всего вышеназванного есть еще много сфер для ее применения – это и криптография, искусственный интеллект в играх, алгоритмы сжатия, генетические алгоритмы, 3D графика и т.д. Вы должны разбираться в математике в данных областях, чтобы самому писать функции и библиотеки, а не просто использовать их – быть производителем, а не потребителем, если уж выражаться языком операционных систем. И даже если у вас нет никакого желания самому писать все эти штуки, куда больше удовлетворения от программирования приносит то, что вы понимаете механизм работы, а не просто вставляете очередной кубик, надеясь, что он там каким-то ещё фигом будет работать.
Большинство разработчиков скажет, что им особо так никогда и не понадобилась математика в их работе (как и я парой абзацев выше :)). Но, поразмыслив немного, я пришёл к следующему выводу: ситуация с математикой в программировании представляет собой проблему, обратную известной проблеме мотивации Маслоу. Ну, вы её, наверное, знаете – если у вас в руке молоток, всё выглядит как гвоздь. Это, сами понимаете, метафора – если у вас есть какой-то предпочтительный инструмент – вы будете всегда его использовать, даже несмотря на то, что существуют куда более удобные для данного типа задач инструменты. Математика в нашем случае молоток Маслоу наоборот – мы знаем, что он существует, но не знаем, как его использовать, поэтому даже когда мы встречаем проблему, с которой лучше всего бы справился молоток, мы всё-таки не принимаем его во внимание. Моему деду для всего хватало отвёртки, она вполне подходила и моему отцу – кому тогда вообще нужен этот самый молоток? Фишка в том, что математики все боятся, и программисты в данном случае совсем не исключение. Как бы вам не казалось иначе, но они тоже боятся. Таким образом, мы сами себе выкапываем яму, каждый раз рассуждая: «не то чтобы нам в данном случае не нужна математика, просто мы толком не знаем её, и даже если знаем – не в курсе, как её применить». И так вы стараетесь каждый раз избегать столкновения с математикой и через какой-то промежуток времени уже совсем её забываете. Самореализуещееся пророчество сбылось: уговорили себя, что не знаете и вам не надо, – вот и не знаете.
Ещё пара мыслей в данном контексте на тему, близкую всем нам – развитие существующих и приобретение новых навыков. Как корпоративные девелоперы мы стремимся быть разработчиками «общего типа» - достаточно неплохо разбираться в большинстве вопросов по специальности и специализироваться в паре-тройке вещей. Однако на самом деле вот в чём состоит эта специализация: мы просто выбираем пару фреймворков и язык программирования, который нам кажется удобным и производительным. Но очевидно, что любой фреймворк (язык несколько в меньшей степени) имеет весьма ограниченный срок годности. Если вы сейчас строите карьеру Hibernate, Struts или Rails эксперта (Struts ребята должно быть действительно сейчас заволновались:)), через несколько лет вам придется промыть себе мозг от прежних знаний и повторить все заново с приходом нового фреймворка, который станет очередным модным трендом. Вполне возможно, что подобное вложение ваших усилий в какой-то актуальный фреймворк на данном этапе - это лучший вариант инвестиций для успешного развития карьеры, а может и нет. Математика, с другой стороны, не собирается уходить в ближайшее время. Все, что мы делаем в нашей области, строится на чётких базовых математических принципах (алгоритмы и структуры данных, к примеру), так что время, проведенное за поддержанием и развитием своих знаний по математике, скорее всего никогда не будет потраченным зря. И ещё раз, возвращаясь к реальному пониманию пользы математики, – смысл не в том, чтобы наизусть выучить какие-то принципы, а в том, что знание математики помогает лучше понимать то, что вы делаете, создавая программы. Как говорил Стив Йегг (Steve Yegge), мы даже не представляем, насколько то, что мы делаем как программисты, является математикой.
В чём разница?
Если вы мне не верите, вот вам ещё один довод. Большинство из общепризнанных авторитетов в области программирования также являются прекрасными математиками - Дональд Кнут, Эдсгер В. Дейкстра, Ноам Хомски, Питер Норвиг. Но, опять-таки, эти ребята были не совсем разработчиками, а скорее именно учёными в области компьютерных наук, так что это не в счет, не так ли? Да, но может не стоит так говорить, пока прок от наших тысяч строк кода не достигнет хотя бы 10 процентов от того, что сделали эти люди. Конечно, вы можете быть известны в популярной среде, и не являясь учёным. Каждый, наверное, слышал о Гевине Кинге (автор Hibernate) или DHH (David Heinemeier Hansson – датский программист, создатель Ruby on Rail). В принципе это верно, но, с другой стороны, знает ли этих ребят кто-то за пределами их ниш программирования? В любом случае, «слышали о» и общепризнанный авторитет - это несколько разные понятия, при всём моём уважении к Гевину и Дэвиду. Какое это всё имеет отношение к теме? Может и не имеет, но всё же раз мы взялись рассуждать, то почему бы и нет.
Мир с каждым днём заполняется всё большим количеством данных, и если раньше у нас была роскошь работать с относительно небольшими их порциями, то сейчас программы, которые мы пишем, должны эффективно работать с огромными массивами данных. Особенного это касается корпоративного программирования. Это значит, что у вас будет всё меньше и меньше шансов просто сложить что-то как попало, пнуть и посмотреть, как полетело – с такими объёмами данных всё просто схлопнется или зависнет, прежде чем вы узнаете что-то полезное. Мой прогноз – анализ алгоритмов станет куда важнее для обычного программиста, который уже отвык от непосредственного кодирования со всеми этими фреймворками, чем это было раньше. А чтобы быть достойным алгоритмистом – вам, я полагаю, будут просто необходимы знания по математике.
В общем, я решил немного подтянуть/вспомнить свои навыки по математике. У меня и так хватает книг, которые необходимо прочитать, и кода, который надо написать, но я всё равно постараюсь уделить часть своего времени на занятия по математике. Это как с физкультурой: лучше регулярно хоть понемногу, чуть не делать упражнения совсем (опять фактически цитирую Стива Йегга).
Так что математика хороша для всего и нужна всем? Трудно сказать заранее, я вполне счастлив тем, чем занимаюсь сейчас, как вероятно и вы, но это всё вопрос потенциала и самореализации. В конце концов, если вы девелопер корпоративного мира с его стандартами и определёнными правилами, вам математика особо и не нужна. Если вы счастливы всю карьеру разрабатывать enterprise CRUD приложения в рабочие часы, а в свободное время кататься на кайте или параплане (или что там модно сейчас у спортивных гиков), то вам стоит потратить своё время на Spring, Hibernate или там какой-нибудь Visual Studio. Я не говорю, что ваш потенциал в данном случае ограничен – вы можете стать мегаценным специалистом и вполне вероятно станете. Но если вы стремитесь к разнообразию в вашей карьере и хотите иметь возможность попробовать свои силы практически в любой сфере деятельности, связанной с кодированием (от поиска и извлечения информации откуда-либо до взлома ядра Linux), если вы хотите быть одновременно и разработчиком, и программистом, и ученым, – вы должны убедиться, что ваши математические навыки на уровне (ну и да, кататься на кайте вам это также не помешает :). Короче, если вы разбираетесь в математике, ни одни двери в мире разработки ПО для вас не закрыты, если же нет – всё, что вы будете делать, это будет CRUD.Источник: skorks.com
С++, несмотря на свой солидный возраст, остается одним из основных языков программирования, который применется очень широко: от разработки ПО до создания игр. В сети много ресурсов, которые помогут освоить этот язык. Советуем обратить внимаение на подборку команды Digitaldefynd, котрую мы дополнили. В ней как платные, так и бесплатные ресурсы для людей с разным уровнем подготовки и знаний С++.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.