Математическое программирование
Содержание:
- Полезная литература для развития
- Вы любите решать нестандартные задачи
- Что почитать?
- Павел Чистов, руководитель отдела обучения компании «Инфостарт»:
- Вузы программирования в России
- Какой язык программирования выбрать?
- Программирование ближе к математике или к иностранному языку
- Ярослав Никонов, аналитик департамента разработки программного обеспечения компании «Аэроклуб ИТ»:
- Важные советы
- Андрей Хромышев, старший программист-разработчик ПО компании Acronis:
- Роман Моисеенко, технический директор и сооснователь Мерката:
- Мифы профессии
- Роман Моисеенко, технический директор и сооснователь Мерката:
- Какая математика нужна программистам
- Усталость от математики
- Константин Третьяков, руководитель отдела сопровождения санкт-петербургского филиала компании «1С-Рарус»:
- Александр Баталов, технический директор Zavento:
Полезная литература для развития
Книги, которые советуют прочитать тренера Тренинг-центра ISsoft:
- Стив МакКонел «Совершенный код. Мастер-класс». Книга по разработке ПО, охватывающая ВСЕ аспекты создания программ. Рекомендуем прочитать ее всем, не зависимо от языка и платформы, которую вы выбрали.
- Томас Кормен, Чарльз Лейзерсон и др. «Алгоритмы. Построение и анализ». Для профессионала эта книга — настольный справочник, а для студента — отличный учебник. Фундаментальный труд известных специалистов в области информатики достоин занять место на вашей полке.
- Род Стивенс «Алгоритмы. Теория и практическое применение». Небольшая по объему альтернатива, книга без «пугающей» математики.
- Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес «Приемы объектно-ориентированного проектирования. Паттерны проектирования». Классическая книга по объектно-ориентированной разработке. Авторы излагают принципы использования паттернов проектирования и приводят их каталог.
- Чед Фаулер «Программист-фанатик». Яркое увлекательное руководство, которое поможет быстро сделать карьеру в индустрии разработки ПО. Сборник практических советов и рекомендаций, касающихся ситуаций, с которыми сталкивается любой разработчик.
Надеемся, что вы любите писать код и потратите много времени на то, чтобы стать хорошим программистом. Если вам нужна помощь в обучении, ждем вас в Тренинг-центре ISsoft.
Вы любите решать нестандартные задачи
«Не стоит забывать и о том, что программирование в большой мере творческая профессия. Несмотря на всю четкость алгоритмов и следованию гайдлайнам (правила программирования на каком-либо языке), специалисту этой профессии очень часто приходится придумывать гармоничные решения для реализации нестандартных задач. Стоит учесть, что речь идет о специалистах, разрабатывающих современные программные продукты для широкого круга пользователей, потому как в некоторых областях есть специфика, которая требует четкого следования определенным правилам и где нет места творческому подходу — например, низкоуровневое программирование на языках, близких к базовым» — объясняет Воротников Денис, ведущий веб-программист Mercaux Inc.
Что почитать?
Онлайн-медиа — здесь обсуждаются нишевые события и более узкие темы.
- Google Developers — надежный первоисточник, из которого можно узнавать актуальные новости о продуктах компании.
- I Programmer — портал для программистов. Новости обо всех направлениях от UX до робототехники и всех языках программирования.
- Smashing Magazine — статьи о веб-дизайне: разбор кода, свежие кейсы, советы по трудоустройству и общению с клиентами.
- Хабр — универсальный русскоязычный ресурс, где можно найти гайды, обсуждения, код-ревью и кейсы от разработчиков разных компаний от IT-гигантов до небольших digital-агентств.
- Вастрик — авторский инди-блог про IT и выживание в мире технологий. Тексты про машинное обучение, блокчейн, VR, вычислительную фотографию, машинный перевод и многое другое.
- For Web — блог в Twitter с полезными материалами для фронтендеров: свежие статьи, доклады и инструменты от сибирского разработчика Андрея Романова.
Искать решение своей проблемы и задавать вопросы стоит на англоязычных форумах, как специализированных, так и не очень. Есть два популярных варианта:
- Reddit — популярный форум на все темы подряд, на котором часто сидят опытные разработчики, выкладывают свои кейсы и комментируют другие публикации. Найти их можно по тегу «programming».
- Stack Overflow — закрытый клуб для программистов без рецептов и котиков. Здесь можно запросить у опытных коллег code review, комментировать публикации и давать им оценку.
- CyberForum — форум программистов, системных администраторов, где помогают в решении задач по программированию.
- Game Dev — форум, на котором разбирают создание игр и все, что с ним связано.
Павел Чистов, руководитель отдела обучения компании «Инфостарт»:
Для будущих программистов важны комбинаторика, алгоритмирование, статистика и матанализ. В целом нельзя сказать, что изучение математики является гарантированно залогом к пониманию алгоритмов и построению алгоритмического мышления, но без нее, крайне тяжело развить эти навыки.
Для разного уровня программирования полезны свои разделы математики. Для низкоуровневого программирования, для 3D моделирования, для задаче-ориентированного программирования — будут полезны свои разделы. Кому геометрия, кому дискретная математика. К примеру, без знаний линейной алгебры и статистики невозможно программировать в области шифрования.
Даже без математики: профессия «Веб-разработчик».Освоить востребованную профессию в Data Science можно всего за полтора года на курсах GeekBrains. После учёбы вы сможете работать по специальностям Data Scientist, Data Analyst, Machine Learning, Engineer Computer Vision-специалист или NLP-специалист.
Вузы программирования в России
В России есть вузы программирования, которые предоставляют возможность обучаться этой специальности. Однако будем откровенны качество образования, которое предлагают университеты программирования в России, немного отстает от того, что предлагают европейские и американские университеты. Кстати, многие из них предлагают даже бесплатное образование. Да, там обучение будет на английском, но тем и лучше, потому что программисту без английского придется очень нелегко. Плюс зарубежный университет повышает шансы остаться «там» жить — это актуально для тех, кто планирует переезд. Поэтому если есть возможность, особенно финансовая, то можно присмотреться к «тем» учебным заведениям.
Допустим, нет возможности обучаться в зарубежных учреждениях, тогда остановимся на отечественных учебных заведениях и выберем, в какой вуз лучше поступить на программиста.
Какой язык программирования выбрать?
Это зависит от того, чем вы хотите заниматься:
Для тех, кто никогда не имел дела с кодом, лучше всего подходит Python. Его используют и в Data Science и машинном обучении, для создания скриптов в 3D-редакторах и, разумеется, в веб-разработке.
Google использует Python для ранжирования поисковой выдачи, также на нем работают YouTube, Dropbox и Reddit. Еще на этом языке написан фреймворк Django — универсальный инструмент для веб-разработчиков, который отвечает за создание внешнего интерфейса и работу на сервере.
Курс
Fullstack-разработчик на Python с нуля
Научитесь программировать на Python и Javascript и получите востребованную профессию за 15 месяцев. Дополнительная скидка 5% по промокоду BLOG.
Узнать больше
Если вы хотите идти в веб-разработку — определитесь, что вам больше интересно: backend или frontend. Вот, что нужно освоить для каждой специальности:
Frontend
HTML и CSS — это языки разметки, с помощью которых элементы сайта в браузере встают на нужные места.
Javascript — язык, который добавляет сайту динамику: анимацию нажатия кнопок, движение карточек продуктов, отправку уведомления.
Python — универсальный язык, который подходит для frontend-разработки, а также backend и других интересных задач.
Кроме этого, понадобится базовое знание основ веб-технологий. Например, нужно знать, как работает протокол http или зачем необходимо шифрование данных.
Научиться всему этому можно здесь.
Backend
Go — язык для backend с простым синтаксисом. Подходит для крупных проектов и высоконагруженных приложений, таких как YouTube или Ozon.
PHP — простой в освоении язык, подходит только для backend, но специалисты советуют обратить внимание на более современные инструменты. Java — универсальный язык, который используется уже более 20 лет
Код, написанный на Java, работает одинаково на разных устройствах, что является его базовым преимуществом
Java — универсальный язык, который используется уже более 20 лет. Код, написанный на Java, работает одинаково на разных устройствах, что является его базовым преимуществом.
Научиться этому можно здесь.
Начинающим разработчикам мобильных приложений стоит определиться, с какой операционной системой они будут работать, потому что код для iOS и Android пишется на разных языках.
iOS
Objective-C — язык программирования Apple, который используется в первую очередь для MacOS. Приложения для iOS раньше тоже писали на нем, но теперь мобильные разработчики используют в основном Swift.
Swift — понятный и логичный язык, который отражает главные качества iOS — функциональность и производительность.
Освоить навыки можно здесь.
Android
Java — кроссплатформенный язык для создания мобильных и серверных приложений. На нем также можно писать backend для сайтов.
Kotlin — язык, альтернативный Java, большую часть нового кода сейчас стараются писать именно на нем. Но Java стоит знать для того, чтобы ориентироваться в уже написанном коде, а благодаря совместимости языков код на Kotlin и Java можно миксовать в одном проекте.
Освоить профессию можно здесь.
Курс
Android-разработчик с нуля
Вы освоите программирование и главные навыки мобильного разработчика, подготовитесь к трудоустройству и уже после первых 8 месяцев обучения сможете начать работать по новой специальности. Дополнительная скидка 5% по промокоду BLOG.
Узнать больше
В геймдеве выбор языка зависит от уровня проектов и платформ, с которыми вы хотите работать:
C++ — потребуется, если вы планируете создавать крупные AAA-проекты с фотореалистичной графикой для PlayStation и Xbox. В этом случае обойтись простыми в изучении базовыми языками точно не получится. Подробная статья о С++.
C# (Си-шарп) — язык для движка Unity, разработанный компанией Microsoft. Он особенно популярен в России и считается более простым в освоении, чем C++. Изначально на нем создавались проекты эксклюзивно для ПК, но сейчас код, написанный на C#, можно портировать на Android, iOS, Xbox и другие платформы.
Курс
Разработчик игр с нуля
Научитесь создавать игры на самом востребованном движке Unity и станьте востребованными специалистом. Дополнительная скидка 5% по промокоду BLOG.
Узнать больше
Программирование ближе к математике или к иностранному языку
С одной стороны, программирование у многих людей ассоциируется с математикой. Считается, что айтишник хорош в точных науках. С другой, мы же говорим язык программирования», а не система программирования», например. Значит это что-то похожее на изучение английского. Какой из двух тезисов ближе к правде?
Скорее второй, чем первый. У компьютерных языков тоже есть своя лексика и грамматика. Они более точные и логичные, чем любой человеческий язык. По сути мы можем сравнить изучение языка программирования с изучением английского, и это не будет прям грубым сравнением. Нужно выучить слова (функции), грамматику (логику и правила написания кода), устойчивые фразы (часто используемые фрагменты кода). Можно даже сказать, что русскоговорящему выучить Python или JavaScript, к примеру, проще, чем арабский или корейский язык. А может даже проще, чем любимый нами английский.
А что с математикой? Она тоже нужна. Условный математический склад ума значительно упростит вам работу с кодом. Умение мыслить категориями из технических наук пригодится не столько в изучении языка, сколько в его применении. Вам будет проще представить в голове, как реализовать задуманное.
Если речь идет о базах данных, блокчейне, искусственном интеллекте или других сложных штуках, то тут уже без математики совсем никак. Причем речь идет не о школьном курсе, а о самой настоящей высшей математике. Для рядовых же задач достаточно базовых знаний.
А вот что касается английского, то он пригодится в любом случае. Код пишется на английском, комментарии к нему и техническое задание зачастую тоже. Без английского в IT вам будет намного сложнее, но об этом позже.
Можно ли стать айтишником с нуля
Конечно можно, ведь все когда-то начинали с нуля. Запаситесь терпением и мотивацией и начните осваивать новую профессию. Ваша предыдущая специальность и образование большой роли не играют. Программистом с нуля может стать как инженер, так и учитель младших классов. Препятствием может стать разве что возраст. Найти первую работу в IT после 23-25 будет сложнее, чем более молодом возрасте.
Ярослав Никонов, аналитик департамента разработки программного обеспечения компании «Аэроклуб ИТ»:
Даже тем программистам, которые не принимают непосредственного участия в разработке программ для научных и математических нужд, знания по математике могут пригодиться как минимум для уменьшения объема хранимых данных или прогнозирования.
Я бы советовал в первую очередь обратить внимание на дискретную математику и математическую статистику. Например, при написании баз данных или построении поисковых систем не обойтись без знаний дискретной математики
Она же пригодится в логистике и построении маршрутов. Data mining в свою очередь требует владения математической статистикой, как и биржевой сектор, где большинство игроков — боты, при написании которых также требуются знания по матстатистике, как и при любом прогнозировании.
Разберу пример из моего недавнего проекта в компании «Аэроклуб». Задача состояла в построении дешёвых или быстрых маршрутов из города А в город Б, используя перелёты и ж/д поездки. С одной стороны, задача выглядит довольно простой, ведь мы можем построить ориентированный граф, где вершинами являются города, а ребра — перелётом или ж/д переездом, где вес ребра — это стоимость или время. Далее можно воспользоваться алгоритмом поиска кратчайшего пути, например, алгоритмом Дейкстры. Но есть несколько сложностей:
- Цены не статичны и могут отличаться в зависимости от дат.
- Хранить данные о ценах на каждую дату за год практически невозможно (за сутки осуществляется более миллиона перелетов).
- Получить данные о ценах по всем направлениям на заданную дату очень долгая процедура (измеряется в 10-ах минут, и пользователь обычно не готов столько ждать).
- Нужен не самый дешевый маршрут, а несколько дешевых маршрутов (т.к. пользователь хочет увидеть несколько вариантов и выбрать тот, которым ему будет комфортнее добираться).
Проблема, описанная в 3 пункте, не решается известными алгоритмами быстрого поиска кратчайшего пути, так как практически все они ищут один путь, а нам необходимы несколько. На помощь в таких случаях может прийти теория графов — один из разделов дискретной математики, и хорошее логическое мышление. Проблемы под пунктами 1, 2 и 3 можно решить математической статистикой.
Поскольку мы не можем хранить довольно большой объем данных, необходимо его сократить. Каким образом можно сократить данные? Скажем, хранить только одну стоимость за сутки из города А в город Б, но при этом эта цена должна быть правдоподобной по сравнению с ценами перелетов из других городов, т.е., если цены из А в Б дешевле цен из А1 в Б1, то и единственная цена должна быть дешевле.
Для решения этой проблемы можно прибегнуть к простому способу хранения минимальных или средних цен за сутки. Хотя и это далеко не всегда правильный выход, так как может быть ровно один перелёт стоимостью в 1000 рублей и 10 перелётов стоимостью в 5000 рублей, таким образом получаем минимальная цену — 1000 рублей, а среднюю — чуть менее 5000. Минимальная цена очевидно слишком сильно отличается от средней. А поскольку маршруты строятся не на реальных ценах в данный момент, то мест на дешевый тариф может не остаться, и маршрут не окажется дешевым, как планировалось изначально.
Правильный выход при подсчете цены за сутки из пункта А в пункт Б должен быть относительным, и строиться относительно цен из других пунктов. Для таких оценок помогает математическая статистика. Построив относительные цены по разным направлениям за сутки, мы решаем проблемы пунктов 1, 2 и 3 и расставляем ровно один вес на каждое ребро, соединяющее вершины графа (города). А используя дискретную математику (теорию графов) можем построить эффективный алгоритм поиска нескольких дешевых (быстрых) маршрутов из пункта А в пункт Б.
Важные советы
Не переживайте, если у вас что-то будет не получаться, либо вы что-то не поймете сразу. Это нормально. Для этого несколько раз просмотрите изучаемый материал или обратитесь к другому источнику.
Занимайтесь решением трудных задач. Не забывайте о практике. Именно таким способом можно понять тему. Если решение задачи не поддается, то отдохните и потом вернитесь к ней снова.
Изучайте математику каждый день. Уделяйте ей хотя бы час. Это должно войти у вас в привычку.
Помните об отдыхе, но не слишком им увлекайтесь.
Главное – не зазубрить материал, а понять его. Вы должны понимать математику, чтобы правильно анализировать ситуацию, применять нужные формулы и теоремы. При самостоятельном изучении спрашивайте себя, почему нужно сделать так или так. И ищите ответы. При работе с преподавателем направляйте вопросы ему. Переход к следующей теме осуществляйте только в том случае, когда вы уверены, что предыдущая отработана на практике и усвоена вами на 100%.
Займитесь поиском наставника. С этим могут возникнуть трудности, но если у вас получится, то они будут оправданы. Он всегда подскажет и подбодрит вас.
Меняйте ресурсы и площадки при изучении математики
Среди них важно отыскать тот, который вам подойдет лучше всего.
Помните, если у вас есть желание, то 50% успеха вам уже гарантировано. Для остальных 50% от вас требуется должный подход и рвение. И тогда все у вас получится.
Андрей Хромышев, старший программист-разработчик ПО компании Acronis:
Я думаю, здесь будет вполне уместна цитата великого Эдсгера Дейкстра: «Программирование — не набор пассов и заклинаний, не шаманство, не танцы с бубном, а математическая дисциплина. А всякая дисциплина, если она претендует на нечто большее, чем на внешний эффект, должна строиться на прочном фундаменте». Таким фундаментом для Дейкстры является математическая логика, а точнее — исчисление предикатов.
В большинстве случаев современному прикладному программисту нет необходимости иметь огромный багаж знаний по матанализу, статистике, линейной алгебре и прочим дисциплинам, но математическую логику знать практически необходимо — хотя бы ради того, чтобы понимать принципы работы и логически мыслить. Также справедливо утверждение, что программист с математической подготовкой пишет код лучше, понятнее, структурнее.
Стоит отметить, что многое зависит от задач, над которыми трудится программист: кто-то программирует сигнальные процессоры, а кто-то специфическое ПО для работы с ДНК.
В завершении скажу так: чем профессиональнее становится разработчик, тем «глубже» он идёт в предметную область, а в ней, безусловно, существует ряд инженерных решений, основанных на применении математического аппарата.
Роман Моисеенко, технический директор и сооснователь Мерката:
Что касается ресурсов, к которым стоит обратиться в случае, когда нужных знаний нет или они просто позабыты за давностью лет, то скорее это не учебники, а Google и Хабр. Как правило, задача стоит не в самообразовании или восполнении недостающих знаний, а в вспоминании конкретного материала или нахождении наиболее эффективного математического инструмента для решения конкретной задачи. И вот на Хабре зачастую встречаются очень хорошие статьи по применению той или иной математики к решению конкретных задач, а особенно ценны комменты, где порой идет очень живое обсуждение плюсов и минусов описанного подхода.
Мифы профессии
А если программист ещё и геймер… Всегда можно найти пару 😉
Программисты гребут деньги лопатой. Нет. С одной стороны, заработные платы в ИТ-сфере действительно выше других отраслей и, как показала эта чумачечая весна, ИТ ещё и более защищена, приспособлена к активной удалённой работе. Однако чтобы пройти путь до зарплаты выше рынка, нужно получить более низкую зарплату, а иногда так даже пройти бесплатную стажировку — не ради денег, а ради знаний, навыков и связей. На высоких позициях заработные платы действительно могут достигать 500 тыс. рублей в месяц, и к этому нужно стремиться. Но если вы на первом своём собеседовании на должность программиста пренебрежительно закидываете ногу за ногу и просите «сотню на руки» в столице или «сороковник» в регионах, вы проиграли. Лучше устроиться, показать результат и попросить повышение: эффективным программистам редко отказывают.
Программисты часто болеют. Увы, отчасти это правда. Сидячая работа, руки на мышке и клавиатуре, ненормированные режимы сна и питания зачастую играют злую шутку и вместе с опытом и карьерным ростом приходят лишний вес, одышка, сахарный диабет, гипертония, заболевания ЖКТ, заболевания опорно-двигательной системы, туннельный синдром и даже психические расстройства. Но это случается только с теми, кто полностью погружается в работу и забывает о себе
Регулярный спорт, правильное и регулярное питание, перерывы (не перекуры и не перекусы!), грамотно организованное рабочее место, подобранные добавки и витамины, активное общение с коллегами, сообществом, друзьями и семьёй, чтение — полезные привычки, которые сохранят ваше здоровье и, что немаловажно, обеспечат отличное функционирование мозга.
Программист имеет низкий потолок в карьере. Нет, любой программист имеет возможности горизонтального и вертикального роста
Программист может расти как внутри программирования, так и в управлении разработкой до тимлида, CTO, CIO и т.д. При наличии хорошей идеи талантливый программист и хороший управленец может открыть своё дело и расширить горизонт навыков на максимальную величину.
Программистов заменят роботы. Буду краток. А кто роботов будет программировать? 😉
Роман Моисеенко, технический директор и сооснователь Мерката:
Мы устроили опрос разработчиков в нашей компании и они отметили, что очень пригодилась комбинаторика и комбинаторные алгоритмы, в основном — при оптимизации различных алгоритмов, работающих с перестановками, сочетаниями, размещениями, разбиением на подмножества, обходы графов, а также при оценке сложности того или иного алгоритма.
Также в прикладной разработке местами полезна тригонометрия. Из менее популярных, но все же полезных разделов — это теория множеств при работе со сложными массивами, числовые ряды, дифференциальное и интегральное счисление, статистика, однако их применение довольно специфично и сильно зависит от продуктов, которые разрабатывает компания.
Какая математика нужна программистам
Работа программистом требует познаний в нескольких математических разделах, которые не каждый человек даже слышал. Но благодаря опыту разобраться с ними не составит труда в будущем.
- статистика и комбинаторика – основу этого раздела проходят в старших классах. Для каждого программиста must have;
- логика и дискретная математика; раздел посвящен основам теории числе, множеств, база изучается в школе;
- математический анализ – самостоятельно изучить раздел, который нужен для работы в Computer Science, довольно трудно;
- теория алгоритмов, чтобы разобраться с эти разделом, нужно хорошо знать математику в целом. Знания раздела необходимы для анализа алгоритмов – основных понятий в программировании;
- линейная алгебра поможет развить абстрактное мышление. Программистам в сфере графики, разработки игр и виртуальной реальности без нее никуда.
Усталость от математики
Последние четыре года в школе я занимался физикой, математикой и олимпиадным программированием и со временем от всего этого немного подустал. И когда я поступал в Вышку через олимпиаду, я выбрал бизнес-информатику: мне показалось, что это неплохая возможность сменить направление и при этом продолжать заниматься программированием.
Но на бизнес-информатике упор больше делался на базы данных, аналитику и экономику — дисциплины, которые не слишком сильно меня занимали. Через четыре года я решил вернуться к истокам и попробовать поступить в совместную магистратуру факультета компьютерных наук и Школы анализа данных Яндекса.
Константин Третьяков, руководитель отдела сопровождения санкт-петербургского филиала компании «1С-Рарус»:
Самые лучшие программисты — те, кто понимают, насколько ограничены их возможности. Совершенствование во многом достигается опытом, но самообразование тоже должно быть. Причем это не только книги и курсы — например, практикующему программисту очень помогает общение на форумах. Иногда именно там можно найти решение сложной задачи и взять его на вооружение.
Тем, кто, как я, решил связать свою деятельность с 1С, я рекомендовал бы начать с изучения возможностей платформы, прочесть книгу М. Радченко «Практическое пособие разработчика», а также воспользоваться материалами ресурса «курсы-по-1с.рф». Добавлю, что в среде 1С понадобится минимум 3-5 лет, чтобы выйти на приличный уровень, и программирование здесь далеко не единственный необходимый навык.
Александр Баталов, технический директор Zavento:
Если вы планируете заниматься графикой, то, скорее всего, вам пригодятся дифференциальные уравнения и геометрия. Если моделированием естественных процессов (например, в области энергетики), то нужны: математический анализ, дифференциальные уравнения, математическая физика и вычислительная математика. Если финансовой сферой, то необходимо разбираться в теории вероятности и математической статистике, а также математической логике, алгебре, теории чисел и вычислительной математике. Для создания игр пригодятся все разделы математики, так как там есть и отрисовка графики, и моделирование физических процессов, ну и, конечно же, создание искусственного интеллекта.
Лично в моем опыте больше всего пригодились математический анализ, дифференциальные уравнения и вычислительная математика.