Можно ли стать хорошим программистом без знания математики и алгоритмов? Этот вопрос обсудили пользователи сайта Quora. А KV.by решили собрать для своих читателей самые интересные ответы.
Джиакомбо Сорби, программист-самоучка
Нет, хороший программист постоянно в курсе последних новинок и стремится каждый день узнавать что-то новое.
Это не тот случай, когда вы, например, хотите стать классным специалистом по латинскому языку (не в обиду будет сказано тем людям, кто зарабатывает себе на жизнь латинским языком), и в какой-то момент вы достигаете высокого уровня мастерства в своем предмете и можете сказать себе «я наконец-то это сделал!».
IT-сфера развивается с поразительной скоростью, и, если вы с самого начала ограничиваете себя, то в долгосрочной перспективе это обойдется вам дороже.
Что касается технических навыков, то тут все зависит от того, чем вы хотите заниматься. Для того, чтобы быть хорошим веб-разработчиком, вам необходимо обладать минимальными знаниями в математике и алгоритмах. Но, если вы хотите работать полноценным разработчиком в составе сложных проектов, то и требования будут соответствующие.
При этом учитывайте, что вы не должны знать в совершенстве даже самые сложные алгоритмы. Тут скорее вопрос в распознавании моделей, поэтому вы находите проблему А или задание Б, при этом вы знаете, что для работы вам понадобится алгоритм поиска кратчайшего пути, или же алгоритм вычисления расстояния Левенштейна. Но вы всегда можете найти конкретный код или более конкретную информацию о нем.
Попробуйте кодить, соревнуясь с другими. Так вы сможете не только усвоить основы программирования, но и, вполне возможно, развлечетесь. Я полагаю, что у меня, к примеру, были хорошие знания в математике, но очень много интересного и нового я узнал в таких проектах, как Project Euler (внимание: этот проект не для новичков) или CodeWars ( более дружелюбное по отношению к нубам сообщество).
Вестон Бикрофт, специалист в сфере программного обеспечения, математики, философии, когнитивной науки
В сфере IT, как и в любой другой, существует правило, согласно которому теория и практика связаны между собой, а именно, теория вызывает желание использовать ее на практике, практика закрепляет теорию, и так по кругу. Я бы посоветовал перед началом проекта убедиться, что вы обладаете всей необходимой теорией для работы над ним. С практической точки зрения, теория очень поможет вам во время работы, поэтому я немного углублюсь в эту тему.
Первое: алгоритмы. Не волнуйтесь сильно на их счет. Существует достаточно теоретического материала касательно этой темы, как описывающего их природу, так и затрагивающего то, сколько ресурсов понадобится для выполнения того или иного алгоритма. Если вас что-то из этого заинтересует, то, конечно, ознакомьтесь с этим. Теория вряд ли сильно повлияет на ваши профессиональные качества как программиста. Что действительно вам пригодится касательно алгоритмов, так это практика. Просто продолжайте их писать, наблюдать за тем, что из написанного вами работает, а что нет, смотрите, что пишут другие люди, делайте выводы, опять пишите сами и так далее.
Второе: математика. Насчет этого говорить сложнее, потому что термин «математика» может относиться ко многим вещам. Я не думаю, что какие-то определенные знания в математике могут сильно повлиять на ваши способности в качестве программиста. На мой взгляд, здесь есть только одно исключение: теория языков программирования (Programming language theory).
Тонкий момент касательно математики заключается в том, что, с одной стороны, у вас нет необходимости в знаниях касательно определенных областей этого предмета (кроме теории языков программирования), а с другой стороны, вам очень необходимо четкое понимание характера этой науки и того, как мыслят математики. Ибо программирование – это и есть математика!
Его «природа» берет свои корни в математике и лингвистике. Поэтому, если вы хотите получить теоретическую подпитку, то я бы на вашем месте попытался достичь максимально четкого понимания того, что происходит во время того, как вы программируете. Попытки достичь этого понимания могут занять годы – вполне возможно, что вы будете заняты этим в течение всей вашей карьеры. Возвращайтесь к этому вопросу тогда, когда сможете или когда будете чувствовать в этом необходимость, но никогда не позволяйте своему неведению не дать вам программировать.
Я бы рекомендовал следующие первые шаги в теории программирования: узнайте немного о том, каким образом компьютерная техника выполняет программы, затем изучите основы теории компиляторов. Долгое время я считал компиляторы лишь дополнительными инструментами, которые нам лишь приходилось использовать, но на самом деле, понимание их работы крайне важно для общего понимания того, как функционируют сами программы. Если вы успешно усвоите базовые знания, то они станут картой, которая позволит с одного взгляда на новый объект понять, что происходит вокруг вас.
Кроме того, я бы порекомендовал начать с размышления над такими понятиями, как абстракция, генерализация, параметризация, языковая среда, реорганизация кода (перепроектирование ПО). Эти понятия тесно связаны с рабочим процессом. Каждое из них, подкрепленное теорией, примерами и собственным опытом, может дать вам многогранное понимание процесса программирования. Если и есть что-то, с чем, по моему мнению, способность к программированию и связана, так это с четким пониманием этих понятий и их связи с процессом написания ПО.
Филлипе Де Лима Арканьё
Нет. Чтобы объяснить свою позицию, я предположу, что у вас совсем нет опыта в программировании, и для объяснения попытаюсь использовать аналогию.
Скажем, вы со своим ребенком хотите построить небольшой игрушечный домик. Вы покупаете конструктор Лего и вдвоем строите из кирпичиков что-то, что по окончанию работы выглядело бы как домик. Вы, как и ваш ребенок, счастливы. Некоторое время игрушечный домик стоит в целости и сохранности, ведь он построен из легких и прочных кирпичиков.
А теперь предположим, что вы хотите построить реальный дом, такой, в котором вы бы смогли бы жить вы и ваша семья. Согласись ли бы вы жить в подобном доме, построенном безо всяких инженерных знаний? Готов поспорить, что большинство здравомыслящих людей так бы не поступило.
Программирование без хорошего знания алгоритмов и математики похоже на строительство вот такого вот дома из конструктора. Со временем вы можете набить руку в этом. Приобретая все больше опыта, вы, может быть, даже начнете замечать, что определенные соединения деталей могут вести к лучшим результатам. Несмотря на все это, вы вряд ли сможете заявить что-то наподобие «эта конструкция может выдержать N кг» или «этот дом достаточно безопасен, чтобы в нем жить».
Хуже того, вместе со сложностью проекта будет возрастать и разница между тем, в каких случаях можно использовать каждый отдельный подход. Вполне возможно, что строительство небольшой будки по технологии, схожей со строительством из лего-деталей, еще может сработать, но маловероятно, что огромный мост, построенный по той же технологии, будет держаться. Точно также и в программировании: более простые задания, такие как, например, создание небольшого веб-сайта, будут вполне по силам команде программистов, не сильно разбирающихся в математике и алгоритмах, в то время, как работа с такими гигантами, как Amazon или Google, вряд ли будет возможна.
Идея о том, что математика и алгоритмы не столь важны для программирования, достаточно часто встречается среди старшекурсников и даже опытных программистов. Я и сам так думал раньше. А потом я поступил в колледж и начал изучать алгоритмы, математику, теорию вероятности и многое другое.
В конечном итоге, сейчас я могу написать код за значительно меньшее время. Кроме того, сейчас я могу написать код для таких заданий, о которых понятия не имел раньше. Я также могу проанализировать код, чтобы четко понимать, каким образом он будет выполняться. Короче говоря, сейчас я во многом разбираюсь намного лучше, чем это было раньше.
Понимание того, какой алгоритм в какой ситуации использовать, это очень ценный навык, но главная цель, ради которой стоит изучить эту тему, так это чтобы научиться правильно думать и решать возникающие проблемы.
Мальком Теас, обучался программированию
Программирование – это не просто написание кода, это точное понимание того, какой именно код писать. Если вы не хотите изучать алгоритмы и математику, то ваша карьера всегда будет ограничена.
Если вкратце, то можно изучить язык программирования без углубленного знания алгоритмов и математики, но вы никогда не станете хорошим разработчиком программного обеспечения, если вы не будете знать, что писать в вашем коде и как именно это делать.
Барри Роунтри, специалист в области информатики
Знание алгоритмов имеет очень мало общего с навыками программирования. Как сказал кто-то из великих: "Когда сомневаешься, используй грубую силу." Давайте разберемся, что же это значит.
Хороший программист знает, как выполнить алгоритм сортировки на языке Python. Отличный программист знает, что кто-то умнее его уже ввел сортировку в этот язык, и верит, что готовая сортировка будет работать достаточно хорошо в большинстве случаев.
Хороший программист пытается выбрать наилучший алгоритм с точки зрения производительности. Отличный программист выбирает простейший подходящий в этой ситуации алгоритм и оптимизирует код позже в том случае, если производительность является главной целью (что далеко не всегда так), если изменение алгоритма существенно повысит общую производительность (что почти никогда не случается), если улучшение производительности оправдывает те средства, которые будут потрачены на внесение изменений (сколько долларов стоит 5% улучшение общей производительности?).
Хороший программист знает, что он потратит 98 дней в году на отладку и 2 дня в году на оптимизацию производительности. Отличный программист изменит это соотношение в сторону оптимизации, выбирая более простые алгоритмы, которые проще понимать и отлаживать.
Если провести аналогию, то вам нет необходимости понимать язык ассемблера, кроме того случая, когда вы занимаетесь разработкой операционной системы или кодом компилятора. Точно также вам необязательно глубокое понимание алгоритмов, кроме тех случаев, когда вы работаете с математической библиотекой.
Мария Королева, редактор журнала Hypergrid Business
Это зависит от того, какой именно деятельностью в сфере программирования вы хотели бы заниматься. Вы можете заняться дизайном пользовательского интерфейса, развитием игровой динамики или отображением корпоративных данных в структурах баз данных.
Однажды мне пришлось использовать тригонометрию при создании графических приложений. Несмотря на то, что я уверена, что все это должно пригодиться в специализированных сферах программирования. Но, когда я работала программистом, мне никогда не приходилось использовать вычисления, линейную алгебру или дифференциальные уравнения.
Вам понадобится арифметика, но на этом все.
Но «алгоритм» – это синоним к понятию «компьютерная программа», поэтому нет, вы не сможете программировать без знания алгоритмов!
С другой стороны, несмотря на то, что логическое мышление несомненно помогает в работе, не все люди вокруг вас будут обладать им. Поэтому, если вы сильны в несколько другой области, такой как, например, дизайн, коммуникации или менеджмент, вы могли бы стать крайне ценным дополнением к команде разработчиков.
Комментарии
Гааа! "Вести" опять разрабатывают "золотую жилу", тупо ставя переводы бесполезных субъективных ответов на риторические вопросы. Ой, отвечу и я. :)
Разумеется, можно!
Ведь можно же играть на музинструментах, не зная нот. Можно также не уметь пользоваться ножом и вилкой или, будучи байдарочником, не уметь плавать. Можно! Но лучше знать и уметь -- иногда даже очень НЕОБХОДИМО. Хотя бы, чтобы не предстать кретином в соответствующем обществе.
А если почтенную публику интересует вопрос, без чего нельзя стать хорошим программистом, то вот моё имхо: БЕЗ РАЗВИТОГО АБСТРАКТНОГО МЫШЛЕНИЯ -- ни-ни. Можно лишь стать клепальщиком шаблонных сайтов за среднебелорусскую зарплату. Да и то, если повезёт. :)
Кого волнуют сегодня все эти высокие материи. 1. Налабать заказец, 2. найти новый до того как прожрешь всё со старого. Всё, goto 1. Каждый, кто занимается тут математикой, или блаженный, или скоро уедет, т.е. пользы стране с него никакой. Я бы даже сказал, что вот эти вот занятия искусственным интеллектом, математикой, алгоритмами - они скорее вредны. Они заставляют людей задумываться о том, что жизнь - это не только менеджер с кнутом и пряником над их головами, и что у проекта есть обратная сторона (т.е. он кому-то там где-то далеко может даже быть нужен). И это ведет к разброду и шатанию, что для исполнителя очень, очень вредно.