Найти в Дзене
Physics.Math.Code

Что нужно знать программисту?

Оглавление

Фундаментальные знания

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

Введение в комбинаторику и оптимизацию.

Хотя бы поверхностное знание теории графов, методов оптимизации, дерева поиска и поиска графов. Перечисление и исчисляемость объектов, метод "звёзд и полос". Большая часть из списка поможет в совершенствовании основных (уже выработанных) навыков в программировании.

Подборка книг по дискретной математике Виленкин Н.Я., Виленкин А.Н., Виленкин П.А. Комбинаторика. Вентцель Е.С. Теория вероятностей [1969] Вентцель Е.С. Задачи и упражнения по теории вероятностей [2003] Теория вероятностей и случайных процессов Габор Секей. Парадоксы в теории вероятностей и математической статистике Элементарный курс теории вероятностей. Стохастические процессы и финансовая математика [2014, pdf] Подборка книг по теории вероятности, случайным алгоритмам, вероятностям вычислений для компьютерных инженеров Компьютерная математика. Математика для программиста Яблонский С.В. Введение в дискретную математику [2003] Р. Хаггарти - Дискретная математика для программистов Основы дискретной математики(видеоуроки)

Линейная алгебра.

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

Математика в техническом университете [22 книги][1996-2009 , DJVU, RU] Серия - Справочная математическая библиотека (29 выпусков) [RU, djvu/pdf, 1961-1991] В.И. Смирнов. Курс высшей математики в пяти томах. Труд получил высшую премию бывшего СССР. Конспект лекций по высшей математике

Статистика и вероятность.

Теорема Байеса, различные модели вероятности и случаи их применения. Цепь Маркова, её отношения с комбинаторикой и некоторыми методами исчисления. Ковариантность и отношения между переменными. Оценивание, интервалы и критерии значимости тоже будут полезны.

Функции и математическая индукция.

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

Несколько книг по логике и критическому мышлению. Лекции по математической логике и теории алгоритмов (4-е изд.) Верещагин Н. К., Шень А. [2012] Гельфанд С.И., Гервер М.Л. и др. Задачи по элементарной математике. Последовательности. Комбинаторика. Пределы DJVU

Сложные алгоритмы.

Разбиение сложных алгоритмов на более простые. Решив все простые алгоритмы, найдёте решение для главного. Сюда же можно отнести и логику, которая как раз включает в себя разбиение сложных проблем на более мелкие и простые задачи, принятие решений и умение выделить главное.
Роберт Седжвик - Фундаментальные алгоритмы на C++ (5 частей)
Подборка книг по теме: Алгоритмы [20 книг]

Инструменты.

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

Аппаратное обеспечение.

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

Серия - « Классика Computer Science » (26 книг + CD) / Издательство «Питер» [2002-2016] Электроника и микропроцессорная техника, Гусев В.Г., [2013] Цифровая схемотехника и архитектура компьютера [2016, PDF] Подборка книг "Электроника" 106 книг [2011] [DJVU] [PDF]

10 способов стать хорошим программистом

Хороший программист — это тот, кто смотрит в обе стороны, переходя дорогу с односторонним движением. (c) Даг Линдер

1. Учите основы

Понимание основ — это ключ к успеху в любой индустрии и любой профессии. До тех пор, пока вы недостаточно хорошо знаете основы, вы не сможете стать хорошим программистом. Знание азов позволит вам разрабатывать и реализовывать лучшие решения наилучшим способом. Если вы ощущаете пробелы в своих знаниях, будь то основы computer science, или концепции языка, на котором вы пишете, то никогда не поздно вернуться назад и повторить забытое.

2. Задавайте вопросы (как? почему?), когда пишете код

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

3. Учите других — учитесь сами

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

4. Пишите простой, понятный, но в то же время логичный код

Как и в других областях, формула KISS (Keep it simple and short — делай короче и проще) работает и в программировании. Пишите логичный код и избегайте усложнений. Иногда люди пишут сложный код только для того, чтобы доказать, что они умеют писать такой код. Мой опыт подсказывает, что простой и логичный код всегда работает хорошо, приносит меньше проблем и лучше поддается расширению. Вспоминается отличная фраза:

Хороший код — это лучшая документация. Каждый раз, когда вы захотите добавить комментарий, спросите себя: «Как я могу улучшить этот код, чтобы он не требовал комментирования?» (c) Стив МакКоннелл
Подборка «must read» книг

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

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

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

6. Будьте первым, кто проанализирует и оценит ваш код

Хотя это трудно, но попробуйте «сломать» ваш код до того, как это сделает кто-то другой. Со временем вы научитесь писать почти безошибочный код. Всегда проводите подробную и беспристрастную оценку своего кода. И никогда не бойтесь спрашивать, что другие думают о вашем коде. Работайте с хорошими программистами и прислушивайтесь к их мнению — это поможет вам стать хорошим программистом.

7. Не пугайтесь быстрой смены технологий

За все время работы в области IT, я встречал множество людей, которых не устраивала их работа, и людей, которые меняли место работы, чтобы работать с новейшими технологиями. В таком стремлении нет ничего плохого, однако ошибка в «новейших технологиях». Каждый день появляются новые инструменты, API и фреймворки, призванные сделать разработку быстрой и простой. И эта тенденция не снизится. Однако следует понять одну вещь: фундаментальные знания и основы меняются значительно медленнее, чем фреймворки, новые инструменты и API. Можно провести аналогию с морем, на поверхности которого находятся быстрые течения, однако на глубине вода спокойна и она составляет большую часть объема. Поэтому держитесь «на глубине», поближе к основам. В мире Java приложений уровня enterprise существует много веб-фреймворков, а новые выходят каждые две недели. Однако основы клиент-серверной архитектуры, шаблона MVS (Model View Separation), фильтров/сервлетов/JSP, упаковки ресурсов, обработки XML и т.д. остаются неизменны. Поэтому лучше потратьте время на изучение этих основ, нежели на изучение вечно меняющихся фреймворков. Поверьте, зная основы, изучить новые API и фрейморки будет куда легче.

8. «Костыли»* долго не работают

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

9. Читайте документацию

Хорошие программисты читают много документации. Это могут быть спецификации, JSR, API, документы, туториалы и т.д. Чтение документации позволит вам понимать основы, и вы будете решать задачи наилучшим способом.

10. Чужой код тоже может чему-то научить

Я работал с двумя отличными программистами, которые постоянно в своих IDE держали исходники чужих проектов на Java, и обращались к ним каждый день. Они делали это не только из желания узнать, как работают базовые вещи, но и из желания научиться писать хорошие программы. Чтение исходных кодов известного open source проекта, или кодов, написанных вашим ведущим программистом, может помочь вам писать код лучше.

И последнее: не сравнивайте себя с другими

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

Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку.
(c) Мартин Фаулер

20 советов : Как стать лучшим программистом 20+ онлайн ресурсов для изучения программирования в 2017 6 проблем современного программирования, которые делают жизнь новичка невыносимой Как самостоятельно стать web-программистом с нуля Как гуманитарию стать программистом? Где учиться программисту: 19 онлайн-курсов.

Где вы еще можете найти много полезных статей, книг, видеоуроков по физике, математике и программированию? В нашей группе : Physics.Math.Code.Books

Telegram-чат, в котором можно спросить помощи у программистов, физиков, математиков: https://t.me/math_code

Спасибо, что дочитали статью до конца! Если вам нравится такие заметки, то оставьте комментарий, лайк или любую другую обратную связь :)

Наша библиотека в telegram (много книг для физиков, математиков и программистов) : https://t.me/physics_lib

Еще много полезного и интересного вы сможете найти на наших ресурсах:

Physics.Math.Code в контакте (VK)

Physics.Math.Code в telegram

Physics.Math.Code в YouTube

Репетитор IT mentor в VK

Репетитор IT mentor в Instagram

Репетитор IT mentor в Яндекс.Дзен