Фундамент знаний для программиста

Обновлено: 05.05.2024

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

Приводить сотни всевозможных материалов для программистов-самоучек мы не будем, а лишь попытаемся ответить на два главных вопроса:

  • Какие дисциплины следует изучать и почему?
  • Какие из доступных ресурсов, книг, серий лекций для конкретной дисциплины имеет смысл посмотреть?

В качестве ответа приведём список материалов, опубликованный Озаном Онай (Ozan Onay) и Майлзом Бёрном (Myles Byrne) — инструкторами в школе компьютерных наук Брэдфилда в Сан-Франциско. Данная подборка литературы и курсов основана на личном опыте обучения сотен программистов-самоучек.

Зачем изучать компьютерные науки?

Существует два типа программистов: те, кто владеют компьютерными науками достаточно хорошо, чтобы совершать инновации, и те, кто вроде как что-то могут благодаря знанию пары-тройки высокоуровневых инструментов.

И те и другие называют себя программистами или инженерами программного обеспечения и имеют примерно одинаковые доходы в начале своей карьеры. Однако первые в итоге становятся более высокооплачиваемыми специалистами. Причём абсолютно неважно, работают они над известными, дорогими и большими коммерческими проектами или над инновационными open-source проектами различной сложности. Они становятся лидерами в своей области и привносят нечто большее и более качественное на рынок.

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

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

Дисциплины

Программирование

Лучшая книга:

Структура и интерпретация компьютерных программ

Львиная доля студентов Computer Science начинают с «вводных курсов» по программированию. Однако такие курсы будут полезны не только новичкам, но и вполне себе специалистам, которые по какой-либо причине пропустили некоторые базовые для программирования вещи.

Мы рекомендуем взять во внимание классическую «Структуру и интерпретацию компьютерных программ». Прочтите как минимум три главы приведенной выше книги, выполняя упражнения для практики. Для тех, кому данная книга кажется слишком сложной, рекомендуется «How to design programs». Тем же, кому она наоборот кажется слишком лёгкой, следует обратить внимание на «Concepts, Techniques, and Models of Computer Programming».

Можно также послушать лекции университета MIT по данной теме. Как альтернативу мы рекомендуем прослушать лекции Брайана Харви из университета Беркли, особенно, если для вас это в новинку.

Для дополнительной практики возьмите на заметку ресурс Exercism: на нём можно найти сотни интересных задачек по программированию, которые помогут вам в освоении синтаксиса разных языков программирования и прокачают ваше логическое мышление, которое необходимо программисту, как воздух.

Архитектура ЭВМ

Лучшая книга:

Цифровая схемотехника и архитектура компьютера

Лучшая серия лекций: Berkeley CS 61C

Архитектура ЭВМ, также иногда называемая «компьютерными системами» или «организацией компьютера» — достаточно важная тема, описывающая работу аппаратного слоя, который лежит на уровень ниже, чем слой программного обеспечения. Пожалуй, самая недооцененная область среди инженеров-самоучек.

The elements of Computing Systems — амбициозная книга, которая даёт понимание того, как работает компьютер. Каждая глава — строение одной маленькой детали большой системы: от написания логики на HGL (языке описания аппаратуры) через центральный процессор к созданию тетриса.

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

Не ищите простого объяснения сложных вещей в этой книге — автор заходит издалека. Если конкретнее, то в книге, например, почти полностью отсутствуют два очень важных концепта в современной архитектуре ЭВМ — вычислительный конвейер и иерархия памяти.

Как только вы почувствуете себя в своей тарелке, читая эту книгу, смело переходите на Computer Organization And Design, отличный текст, который стал своего рода классикой. Также обратите внимание на курс CS61C, лекции которого доступны онлайн.

Алгоритмы и структуры данных

Лучшая книга:

Обложка книги «Алгоритмы Руководство По Разработке»

Алгоритмы Руководство По Разработке

Мы полностью согласны с народной мудростью, которая гласит, что знание алгоритмов и структур данных — один из важнейших аспектов изучения компьютерных наук. К тому же, это отличный способ потренироваться в способности решать разного рода задачи, которые пригодятся в любой области компьютерных наук.

Есть сотни книг для изучения алгоритмов, но наш фаворит — «Алгоритмы Руководство по разработке» от Стивена Скиена. Наш выбор пал именно на неё, потому что автор определенно любит то, что он делает и хочет донести свои знания до читателя.

Для тех же, кто предпочитает лекции в формате видео, Скиена предлагает свой онлайн-курс. Также следует обратить внимание на курс Тима Рафгардена, доступного на Lagunita (сервис от университета Стэнфорда) или на Coursera. Материал обоих авторов очень полезен и информативен и кому из них уделить внимание — решать вам.

Мы практикуемся, решая задачи на Leetcode, потому что их задачи кажутся нам наиболее интересными. К тому же у каждой задачи есть ветка обсуждения и прикрепленное решение для самопроверки. Стоит отметить, что подобного рода задачи могут являться вопросами на интервью и решение их может сыграть вам на руку в будущем трудоустройстве. Для проверки своего знания алгоритмов решите 100 случайных задач на Leetcode.

В завершение, мы настоятельно рекомендуем How to solve it — великолепный материал для практики решения задач. Подходит как тем, кто изучает компьютерные науки, так и математикам.

Математика для компьютерных наук

Лучшая книга:

Mathematics for Computer Science

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

В основе большая часть математики для компьютерных наук — дискретная математика, где слово «дискретная» — прямая противоположность слову «непрерывная» и, грубо говоря, является сборником интересных тем в прикладной математике, за пределами математического анализа. Немного расплывчато, согласны. Впрочем, это не так важно: можно поставить себе цель изучить базовую логику, комбинаторику, теорию вероятности, теорию графов, основы криптографии. Линейная алгебра не менее прочего заслуживает вашего внимания, особенно для изучения компьютерной графики или машинного обучения.

Хорошим началом изучения дискретной математики является сборник лекций от László Lovász. Профессор проделал хорошую работу, чтобы сделать математику понятной и интуитивной, так что его работы куда больше подойдут новичкам, чем формальные математические тексты.

Для большего погружения советуем Mathematics for Computer Science — записи с лекций по одноименному курсу MIT, которые по объёму тянут на полноценную книгу. Видео данных лекций, кстати, тоже в свободном доступе.

Для линейной алгебры мы предлагаем начать с плейлиста Основы линейной алгебры.

Операционные системы

Лучшая книга:

Operating Systems: Three Easy Pieces

Лучшая серия лекций: Berkeley CS 162

Operating System Concepts и Modern Operating Systems — классика в вопросе операционных систем. Обе довольно часто подвергались критике в основном за то, что не являются 1000-страничными быстроустаревающими энциклопедиями, новое издание которых приходится покупать каждые пару лет.

Существует ещё одна книга по операционным системам, которую мы также очень рекомендуем к ознакомлению. Three Easy Pieces: структура повествования книги делает её легкой к восприятию, а задания помогут закрепить полученные знания.

После прочтения указанных выше книг имеет смысл пройтись по конкретным операционным системам и прочесть следующее: A commentary on the unix operating system, The design and implementation of the freeBSD operating systems и Mac OS internals.

Идеальный способ закрепить полученные знания — это прочесть код небольшого ядра и внести в него свои изменения. Как вариант можно взять XV6 — современную реализацию 6 версии Unix для архитектуры x86, написанную на ANSI C. В приведённой выше Three Easy Pieces есть раздел с заданиями с XV6, полный интересных идей для потенциальных проектов.

Компьютерные сети

Лучшая книга:

Обложка книги «Computer Networking: A Top-Down Approach»

Computer Networking: A Top-Down Approach

Лучшая серия лекции: Stanford CS 144

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

Наш фаворит в этом вопросе — Computer Networking: A Top-Down Approach. Небольшие проекты и задания для практики на протяжении всего материала весьма интересны и стоят вашего внимания. Также следует обратить внимание на Wireshark labs, любезно предоставленные автором книги.

Для тех же, кто предпочитает просмотр лекций чтению книг, мы рекомендуем серию лекций от университета Стэнфорд Stanford CS 144.

Базы данных

Лучшая книга:

Обложка книги «Readings in Database Systems»

Readings in Database Systems

Изучение баз данных требует куда большего упорства, чем нужно для других тем, так как базы данных —относительно новая область компьютерных наук (с 1970-ых). Её основы скрыты от нас по вполне себе понятным коммерческим причинам. К тому же многие потенциальные авторы книг по базам данных предпочли сами стать разработчиками и основали свои компании.

Учитывая приведенные выше обстоятельства, мы настоятельно рекомендуем новичкам избегать книжек и начинать прямиком с записей CS186 весны 2015 от Джо Геллерштейна из университета Беркли. После данного курса уже можно переходить к книжкам.

Одна из них — это Architecture of a Database System от того же профессора из того же университета. Книга даст читателю углубленный взгляд на реляционные базы данных и послужит отличным скелетом для будущих знаний в этой области.

Readings in Database Systems, также известная как красная книга по базам данных (никто не вымирает), представляет собой сборник публикаций по данной теме. Для тех, кто осилил CS186, эта книга может стать следующей остановкой.

Если вы настаиваете на том, чтобы начинать изучение баз данных по книжкам, то советуем обратить внимание на Database management systems.

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

Под конец, моделирование данных — один из самых пренебрегаемых аспектов в изучении баз данных. Здесь нашим фаворитом является Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World.

Языки и компиляторы

Лучшая книга:

Compilers: Principles, Techniques and Tools

Большинство программистов изучают языки программирования, в то время как специалисты компьютерных наук пытаются понять, как эти языки работают. Эти знания позволяют им опережать своих коллег по карьерной лестнице и быстрее схватывать новый материал.

Классикой в данном вопросе является Compilers: Principles, Techniques and Tools. К сожалению, этот материал больше подходит учителям, нежели самоучкам. Однако книга отлично подойдёт для непоследовательного чтения, для выхватывания отдельных кусков из материала и изучения по ним. К тому же, если у вас будет учитель, это лишь ускорит ваше обучение.

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

Потенциальной альтернативой этой книге может стать Language Implementation Patterns. Она написана с упором на инженеров, которые собираются практиковаться на языках вроде DSL.

В качестве проекта для закрепления материала можно написать свой компилятор для простенького языка вроде COOL. Те, кому данный проект кажется невыполнимым, могут начать с чего-то вроде Make a Lisp.

Распределённые системы

Лучшая книга:

Обложка книги «Distributed Systems, 3rd Edition by Maarten van Steen»

Distributed Systems, 3rd Edition by Maarten van Steen

Число компьютеров и их разнообразие увеличилось за последние несколько десятков лет. Если раньше крупные компании закупали огромные сервера для обеспечения работы каких-либо программ, то сегодня нам кажется очевидным тот факт, что даже самые незначительные программы работают на нескольких компьютерах одновременно. Распределённые системы — наука о том, как это обеспечить.

Книга, которую мы хотим посоветовать, — Distributed Systems, третье издание которой служит прекрасным дополнением всем предыдущим. Учитывая то, что распределенные системы — область, которая достаточно часто меняется, нет уникальной книги, которая проведёт вас по этому тернистому пути. Приведённая же выше книга, по нашему мнению, наиболее близка к этому идеалу.

Можно также обратить внимание на серию лекций MIT 6.824, но, к сожалению, качество записи звука оставляет желать лучшего.

Не имеет значения, какую книгу или сторонний ресурс вы выбрали для изучения распределённых систем, погружение в эту область компьютерных наук требует от студента чтения большого количества литературы. Здесь вы можете найти список полезных книг.

Часто задаваемые вопросы

Что насчет искусственного интеллекта и графики?

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

  • ИИ: пройдите введение в ИИ от университета Беркли и выполните проект Pacman. Прочтите великолепную книгу от Рассела и Новрига Artificial Intelligence: A Modern Approach;
  • Машинное обучение: пройдите этот курс на Coursera и убедитесь, что действительно понимаете смысл повествования и основы машинного обучения, прежде чем переходить на Deep Learning;
  • Графика: ознакомьтесь с серией лекций из университета Беркли CS184 и прочтите книгу Computer Graphics: Principles and Practice.

Насколько важно строго следовать порядку, приведенному в статье?

На самом деле, все 9 дисциплин достаточно часто пересекаются. К примеру, возьмите дискретную математику и алгоритмы: изучение математики поможет вам в освоении алгоритмов. Знание алгоритмов, в свою очередь, даст стимул погрузиться в дискретную математику. В идеальном сценарии программист достаточно часто повторяет данный материал в своей карьере.

По существу наша последовательность сконструирована таким образом, чтобы помочь вам начать. Если у вас есть непреодолимое желание следовать другой последовательности, мы не настаиваем. Однако мы считаем, что освоить архитектуру ЭВМ нужно перед освоением операционных систем и баз данных, а компьютерные сети и операционные системы перед распределёнными системами.

Что общего у данного списка с Open Source Society или FreeCodeCamp?

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

Касательно FreeCodeCamp, данный ресурс сконцентрирован на программировании, а не на компьютерных науках.

А где же язык X?

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

Почему вы до сих пор рекомендуете книжку с драконами (Compilers: Principles, Techniques and Tools)?

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

Теория и 100 алгоритмических задач, которые ты сможешь решить сам

Владение алгоритмами и структурами данных — ключевой навык для любого разработчика. Грамотно выбранный алгоритм делает ваш код более надёжным, лаконичным и качественным. А хорошее прохождение собеседования по алгоритмам открывает двери в крупнейшие IT-компании мира.

Внутри курса — девять самых важных тем, лекции в удобном видео-формате и практическая часть, состоящая из 100 задач с подробными разборами.

Практика есть в каждом уроке. Наша цель — сделать так, чтобы вы смогли решить все 100 задач самостоятельно. Кураторы курса будут поддерживать каждого ученика до тех пор, пока он с этим не справится. Для всех задач готовы подробные разборы, в которых мы объясняем идею решения и показываем код.

Проходить курс вы будете на платформе Stepik. Помимо этого мы добавим вас в чат с наставниками и единомышленниками — там вы сможете обсуждать решения, задавать вопросы и просто приобретете много полезных и классных знакомств.

Возможно, вы уже пробовали устроиться в крупную IT-компанию, но не смогли пройти собеседования. А может быть, это ваш первый опыт. В любом случае, лучший способ подготовиться — решить много задач. Можем сделать это вместе.

Если вы хотите работать в FAANG, но никогда не занимались алгоритмами, мы вам поможем. Двоичные деревья и связные списки перестанут быть просто сложными словосочетаниями.

Сменить сферу и стать разработчиком — возможно. Правда для этого нужно выучить не только языки программирования, но и алгоритмы. Наш курс поможет именно с этим. Для прохождения курса важно уметь программировать на одном из языков программирования: C++, Java, Python.

— Разработчик с опытом программирования 20 лет
— Двукратный участник финала ACM ICPC (2007, 2008). Участник олимпиад TopCoder, Codeforces
— Автор онлайн-специализации «Искусство разработки на современном C++» на Coursera
— Спикер IT-конференций С++ Russia, SECR, Yac/e, CoreHard

Серебряный призёр международной олимпиады по информатике, бронзовый медалист Финала ICPC, студент НИУ ВШЭ, сотрудник компании Aim Tech.

Готовит сложные задачи, пишет к ним разборы


Бронзовый медалист Финала ICPC, сотрудник компании Near.

Сидит перед камерой, рассказывает про кучу и алгоритмы на графах


Студент ФКН НИУ ВШЭ.

Пишет для вас самые понятные разборы задач и подсказки


Двукратный чемпион мира ICPC, сотрудник компании Яндекс.

Готовит материалы лекций, пишет код, рисует слайды


Говорит, как должна стоять камера, а потом монтирует видео

1. Асимптотические оценки

Теория
Изучаем, как оценивать эффективность алгоритмов и сравнивать их между собой.

Практика
6 тренировочных задач, 10 контрольных задач, разборы задач.

2. Алгоритмы поиска

Теория
Изучаем линейный поиск, изучаем двоичный поиск.


Практика
8 тренировочных задач, 7 контрольных задач, разборы задач, эталонная реализация двоичного поиска.

3. Метод двух указателей

Теория
Изучаем метод двух указателей и класс задач, где он применим.


Практика
2 тренировочные задачи, 8 контрольных задач, разборы задач.

Теория
Односвязный список, стек, двусвязный список, очередь, понятие амортизированной сложности, дек.

Практика
7 тренировочных задач, 13 контрольных задач, разборы задач, эталонные реализации всех рассмотренных структур данных.

5. Алгоритмы сортировки

Теория
Квадратичные сортировки, сортировка слияниями, быстрая сортировка, задача нахождения K-й порядковой статистики, сортировка за линейное время.

Практика
1 тренировочная задача, 13 контрольных задач, разборы задач, эталонные реализации всех рассмотренных алгоритмов.

Теория
Изучаем устройство и операции, которые можно выполнять с кучей.

Практика
26 тренировочных заданий, 5 контрольных задач, разборы задач, эталонная реализация кучи.

7. Алгоритмы на графах

Теория
Поиск в глубину, поиск в ширину, поиск циклов, топологическая сортировка.

Практика
10 тренировочных заданий, 6 контрольных задач, разборы задач, эталонные реализации рассмотренных алгоритмов.

Теория
Основное свойство двоичного дерева поиска, операции поиска, вставки, удаления, обходы двоичных деревьев поиска.

Практика
13 контрольных задач, эталонные реализации всех операций.

9. Декартовы деревья

Теория
Основное свойство декартового дерева,
операции вставки, удаления и поиска.


Практика
Эталонные реализации всех операций.

Теория
Индексация по данным, понятие хеширования, понятие коллизии, методы разрешения коллизий.

Практика
7 контрольных задач, разборы задач, эталонные реализации хеш-таблицы.

Теория
Решаем задачи, в которых понадобятся все полученные ранее знания и навыки.

Практика
10 задач, разборы задач.

Доступ к материалам курса 1 месяц

Доступ к 2 темам из 10

Вы решите 10 задач по программированию

Сертификат по окончанию курса

Помощь куратора в прохождении курса

Личная поддержка Ильи Шишкова

Гарантия готовности к coding-interwiew в FAANG и получения рекомендации на прохождение собеседования в одной из этих компаний


Доступ к материалам курса 4 месяца

Доступ ко всем темам курса

Вы решите 100 задач по программированию

Сертификат по окончанию курса

Помощь куратора в прохождении курса

Личная поддержка Ильи Шишкова

Гарантия готовности к coding-interwiew в FAANG и получения рекомендации на прохождение собеседования в одной из этих компаний

Доступ к материалам курса 6 месяцев

Доступ ко всем темам курса

Вы решите 100 задач по программированию

Сертификат по окончанию курса

Помощь куратора в прохождении курса

Личная поддержка Ильи Шишкова

Гарантия готовности к coding-interview в FAANG и получения рекомендации на прохождение собеседования в одной из этих компаний

Мне кажется, я получил ощутимую пользу от курса, надеюсь в не очень далеком будущем на собеседованиях проверю. Задачи в основном были интересные, трудные, творческие. В двух модулях нет подсказок, мне так было интереснее решать. Я пришел на курс после того, как решил задач 350 и все равно было трудно. Тратил на курс часов 20 в неделю, прошел за 2.5 месяца (не решал модуль про Декартовы деревья, утомился, решу позже). До этого прошел Яндекс.Практикум Алгоритмы, порешал в ШАД helper. Этот курс понравился больше всего. Рад был в таком формате (лекции + эталонные решения) пообщаться с титулованными, гуманными лекторами.

К несомненным достоинствам курса следует отнести отличную структурированность материала. Авторам удалось рассмотреть как абстрактные конструкции, которые облегчают решение алгоритмических задач (Абстрактные Типы Данных) - так и их аналоги в наиболее востребованных языках программирования. Огромную помощь при изучении оказывает наличие подсказок для сложных задач и очень подробный разбор и представление авторских решений, из которого я лично узнал много нестандартных подходов для вроде бы известных концепций. Лекционный материал не только освещает подходы к анализу алгоритмических проблем - но и дает направления для дальнейшего самостоятельного изучения - а это , наверное именно то, чего не достает многим аналогичным курсам. Очень жаль, что не хватило места и времени для двух очень важных блоков - работы со строками и динамического программирования, раздел графовых алгоритмов также выглядит несколько скомкано. Задачи в рамках курса подобраны самой разнообразной сложности - от довольно простых, до тех, которые не то что на собеседовании - на олимпиадах не всякого уровня увидишь. Также хочу отметить дружелюбную поддержку авторов и разработчиков и адекватную и быструю реакцию на возникающие вопросы. В целом, по моему мнению, курс является одним из наиболее сбалансированных и продуманных в российском сегменте интернета. Прохождение его доставило мне огромное удовольствие, наряду с многими - зачастую неожиданными открытиями и знаниями. Спасибо авторам. Мои рекомендации )Мне кажется, я получил ощутимую пользу от курса, надеюсь в не очень далеком будущем на собеседованиях проверю. Задачи в основном были интересные, трудные, творческие. В двух модулях нет подсказок, мне так было интереснее решать. Я пришел на курс после того, как решил задач 350 и все равно было трудно. Тратил на курс часов 20 в неделю, прошел за 2.5 месяца (не решал модуль про Декартовы деревья, утомился, решу позже). До этого прошел Яндекс.Практикум Алгоритмы, порешал в ШАД helper. Этот курс понравился больше всего. Рад был в таком формате (лекции + эталонные решения) пообщаться с титулованными, гуманными лекторами.

Курс по алгоритмам без мусора, только самое необходимое, чтобы пройти алгоритмическую секцию собеседования.

Я начинающий разработчик, курс очень помог структруировать знания и получить весь необходимый фундамент. Для сомневающихся, советую откинуть сомнения и засесть за него, особенно кто самоучка. Немало сложных задач, так что советую выделить прилично свободного времени.

Фото: Patricia de Melo Moreira / Bloomberg

Программирование — это процесс создания программ (программного обеспечения). Для этого программисты пишут исходный код на одном из языков программирования.

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

Одним из лучших языков для начинающих является Python. Этот популярный язык общего назначения хорош лаконичностью и простотой синтаксиса, его активно используют в IT-компаниях России и мира.

Другими популярными языками считаются Java и C. Они сложнее, особенно для новичков, но владение ими обеспечивает лучшее понимание того, что вы делаете и что происходит с вашей программой. Вместе с языком Pascal язык С обычно изучается в вузе на профильных факультетах.

Использование других языков программирования зависит от цели деятельности. Например, в качестве серверных языков популярны php, Java, ruby. Из клиентских языков наиболее перспективен Java Script. Для разработки сложных высоконагруженных проектов требуется C++. На этом же языке пишутся игры. Еще одна перспективная сфера — разработка приложений для мобильных устройств. Тут используют Java, Objective-C, Swift. Любой опытный программист знает несколько языков, однако код на работе он пишет только на одном из них.

Нужно ли программисту знать математику и английский?

Да. Любому программисту необходимо знать английский язык и математику. Вся важная документация и качественные курсы опубликованы на английском. Знание математики требуется не настолько категорично. Но уверенное владение математикой обеспечивает четкое понимание создаваемого кода, осознанность каждого шага и позволяет прикидывать в голове эффективность алгоритмов.

Какой язык программирования учить, чтобы делать сайты?

Евгений Кучерявый, автор блога онлайн-университета SkillBox, рассказал, чем занимаются веб-разработчики и какие языки им непременно нужно знать.

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

1. Обучение HTML

В первую очередь начинающий frontend-разработчик должен освоить HTML — язык гипертекстовой разметки. Это базовый инструмент, который позволяет вынести на страницу все основные элементы, будь то фотографии, таблицы или текст.

2. Обучение CSS

Внешне написанная на HTML интернет-страница будет напоминать простейший текстовый документ. Чтобы «оживить» его, используется каскадная таблица стилей или CSS. Она меняет не структуру страницы, а ее внешний вид: шрифты, расположение элементов, тени и цвета. Другими словами, если HTML используется для описания логической структуры страницы, язык CSS отвечает за графические элементы и прописывается в отдельном файле.

3. Обучение JavaScript

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

Красивая оболочка сайта не имеет смысла без начинки: видеоролики, гиперссылки и картинки должны быть связаны с сервером, базой данных, с другими интернет-сайтами. Программно-аппаратную работу сервиса берут на себя backend-разработчики. Они же отвечают за информационную безопасность (защиту от хакеров) и следят за нагрузкой на сервер (чтобы страница не «висла» из-за наплыва посетителей).

1. Обучение PHP

Базовый инструмент backend-разработчика — язык программирования PHP. Он нужен, чтобы связать видимую пользователю страницу с сервером, где хранятся какие-либо данные. Например, чтобы не выкладывать на веб-сайт по одной фотографии при помощи HTML, можно запустить скрипт, автоматически подгружающий туда условную галерею, лежащую на сервере. Язык PHP настолько сильно упрощает работу по созданию сайта, что изучать его SkillBox рекомендует и frontend-разработчикам.

2. Обучение SQL

Аббревиатура SQL расшифровывается как «структурированный язык запросов». В отличие с PHP, который нужен для связи сайта с сервером, языки SQL позволяют управлять уже самими базами данных. Сейчас существует множество подобных языков, самые распространенные из которых — это MySQL, MSSQL, PostgreSQL и прочие.

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

А какие еще бывают программисты?

  • 1С-программист, в непосредственные задачи которого входит оптимизация готовой системы 1С и ее настройка непосредственно под каждое предприятие.
  • Инженер-программист, который чаще всего занят в сфере разработки программного обеспечения для автоматизации производства, он же обычно программирует бытовую технику.
  • Game Developer, который специализируется на создании компьютерных игр. Геймдевелоперы заняты в полном цикле жизни видеоигры: создание, тестирование, доработка, поддержка, обновления, модификация и т.д.
  • Android- и iOS-разработчики, которые занимаются созданием игр, программного обеспечения, интерфейсов и обновлений для устройств, созданных под брендом Apple, или Android-устройств.
  • Системный программист, в задачи которого кроме разработки программных модулей и их интеграции входит адаптация и модификация программных продуктов под конкретную систему, исходя из ее логики и задач. Он же может заниматься разработкой баз данных и их администрированием.
  • Передовым направлением в области программирования считается сфера Data Science. Она объединяет искусственный интеллект и данные, умение прогнозировать на основе статистических данных.

Куда пойти учиться на программиста?

Если есть возможность поступить в вуз, то лучше выбрать один из ведущих: МГУ, МИФИ, ВШЭ, СПБГУ, МФТИ, МГТУ им. Баумана, МАИ, ИТМО и т.д. Речь идет, естественно, о профильных факультетах. Выпускники этих университетов лидируют в рейтинге портала Superjob, составленного по критерию уровня стартовых зарплат программистов.

Фото:Jonathan Borba / Unsplash

Можно ли научиться программированию на онлайн-тренингах и курсах?

Можно. Начальные навыки программирования помогут приобрести такие популярные платформы, как Яндекс.Практикум, Сodecademy, Skillbox, GeekBrains, HTML Academy. После прохождения подобных курсов человеку становится легче понять, в сторону какого направления двигаться в профессиональном развитии.

Многие ведущие мировые вузы открывают курсы в онлайн. Например, курсы MIT можно найти на платформе Coursera.

Как освоить программирование самостоятельно?

Освоение программирования на 80% предполагает самостоятельную работу. Почти все необходимые материалы есть в интернете. Самое главное: мотивация. Лучше всего подходить к изучению комплексно, например, совмещая онлайн-курсы, официальную документацию к языкам, лекции, статьи, книги. При этом не следует распространяться на несколько языков сразу, лучше начать с самых простых.

Можно изучать, играя: некоторые обучающие сайты сами являются играми, например, Code Combat и CodinGame.

На GitHub можно найти огромную коллекцию бесплатных книг по программированию. Также доступен корпус электронных книг, охватывающий 24 языка программирования.

В сообществе программистов также много людей, готовых помочь следующему поколению программистов. Hack.pledge — сайт, который поможет найти наставника.

Кроме того, можно подписаться на тематические каналы в Telegram, например: канал для новичков в Python, сообщество веб- и Java Script-разработчиков, канал разработчиков Ruby и Ruby on Rails и другие.

В программировании актуален принцип «практика важнее теории». Освоить большой объем информации по языкам сразу не получится, поэтому намного лучше посвящать больше времени оттачиванию полученных умений.

Где найти самоучитель по программированию?

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

Что такое метод Франклина и как он может помочь в обучении программированию?

Это способ, позволяющий систематизировать информацию из лекций и самоучителей.

Его можно описать следующими ступенями:

  1. Читайте книгу. Когда в книге попадется образец кода, прочитайте его, сделайте заметки, которые могут помочь вам вспомнить эту информацию в будущем.
  2. Закройте книгу.
  3. Попробуйте набрать код, воссоздав его как можно ближе к оригиналу.
  4. Сравните свой код с оригиналом, исправьте ошибки, повторите пункты 1−3, пока не начнет получаться оригинальный код из книги.

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

Кстати, его можно применять не только при обучении программированию.

Нужен ли диплом и опыт работы после обучения веб программированию с нуля?

Считается, что высокие инженерные или исследовательские должности без высшего образования недостижимы. Также диплом необходим тем специалистам, которые захотят работать за границей. При этом многие российские HR-специалисты говорят, что при приеме на работу смотрят, в основном, не на строку «образование» в резюме программиста, а на реальный опыт работы. Кроме того, перед собеседованием или во время него претенденту, скорее всего, предложат выполнить тестовое задание.

С чего программисту начать поиск работы?

Анна Смирнова, менеджер по трудоустройству на программе «Веб-разработчик» в «Яндекс.Практикуме», советует четко определить свои намерения и цель, взвесить все риски и понять, сколько у вас есть времени на поиск работы и какие усилия вы готовы предпринять. Пример четко сформулированной цели — трудоустроиться за четыре месяца на позицию младшего разработчика в продуктовую компанию с полноценной командой разработки и закрепленным наставником.

Далее стоит продумать стратегию поиска. Стандартный подход — изучение вакансий на сайтах по поиску работы, в LinkedIn и телеграм-каналах. Но есть и другой вариант — нетворкинг. А именно, посещение митапов, профильных конференций и курсов, что поможет вам завести новые знакомства и искать возможности уже через них. Этот путь более тернистый в начале, но дает больший эффект, потому что вы задействуете «теплые» контакты.

Затем нужно подготовить резюме, портфолио и сопроводительные письма. Именно они создают первое впечатление о кандидате.

Как составить резюме, если нет опыта?

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

Еще один важный пункт — заполнение навыков. Например, на HeadHunter они работают как теги, по которым рекрутеры ищут кандидатов. Поэтому лучше описать максимальное количество технологий, которые вы изучали или с которыми приходилось работать, а не только базовые JavaScript, HTML и CSS.

Где брать проекты для портфолио?

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

Автор выделил 5 столпов программирования, на которые должна опираться эффективная программа обучения. Эти азы помогут новичку освоить необходимую для успешного развития базу.

5 столпов программирования

Столп № 1: разработка через тестирование

Разработка через тестирование или TDD (от англ. test driven development) – эффективная технология, к которой большинство новичков не готово.

Речь не о том, чтобы начинающие разработчики писали тесты. Это слишком много для тех, кто только осваивает типы данных, функции и объекты. Но новичкам нужно обязательно учиться работать с тестами.

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

Студенту нужно просто написать код и оценить результаты тестирования. Условно говоря, если загорается зеленая лампочка, все в порядке. Если горит красная, курсант должен вернуться к коду. Кстати, так работают многие популярные платформы для обучения программированию, например, FreeCodeCamp.

интерфейс freecodecamp помогает освоить фундаментальные основы программирования

Если студенты изучают Spring Web Flow, автор делает упражнения и тестирует результаты на платформе Spring. При этом студентам не нужно разбираться в Spring. Для эффективного обучения программированию им достаточно выполнить упражнение и нажать кнопку «Запустить проверку».

Конечно, учащимся нужно уметь пользоваться отладчиком и работать в REPL-среде. Умение анализировать код во время запуска и пользоваться средой для экспериментов – важные условия эффективного использования TDD.

Начинающим программистам важно сначала научиться азам TDD, а потом писать код. Менять сформировавшиеся привычки сложнее, чем нарабатывать новые. При правильном подходе к обучению программисты будут ненавидеть проекты без TDD, так как разработка через тестирование защищает от ошибок.

Столп № 2: базовые знания и умения первичны

Автор статьи неоднократно слышал, как новичкам рекомендуют начинать сразу с фреймворков, пропуская азы программирования. Это как посадить нового водителя за штурвал болида «Формулы-1» и предложить особо не беспокоиться. Советчики забывают, что начинающий водитель не всегда отличает тормоз от газа.

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

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

Новичкам очень важно освоить базовые понятия и инструменты программирования. Если это условие не соблюдается, код всегда будет казаться студенту китайской грамотой.

К сожалению, на популярных курсах базовая информация часто рассматривается поверхностно. Проблема в том, что преподаватели забывают, что когда-то тоже осваивали эти несколько столпов программирования. Базовые вещи теперь кажутся им элементарными и не заслуживающими внимания. В похожую ситуацию попадают профессиональные водители. Им сложно понять, что новичкам приходится думать, как тормозить или поворачивать.

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

Столп № 3: библиотеки и фреймворки

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

Важно запомнить: хороший разработчик знает, какую библиотеку использовать в той или иной ситуации. Это экономит уйму времени и защищает от огромного количества ошибок.

Чтобы научиться работать с библиотеками, нужно попробовать решить простые задачи из базовых курсов с помощью популярных инструментов типа Moment.js или Apache Commons. Это поможет начинающему разработчику понять важность библиотек.

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

Столп № 4: наставник(и)

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

Преподаватель быстро исправил ошибки, которые автор просто не замечал. Также учитель привил автору мышление, которое позволило развиваться самостоятельно.

В данном случае программирование не отличается от музыки. Если кто-то решит учиться разработке с нуля самостоятельно, он столкнется с проблемами. Конечно, научиться программировать самостоятельно можно. Но учиться с наставником намного эффективнее и быстрее.

Новичку нужен наставник или учитель. Более того, между новичком и учителем должны быть доверительные отношения. Наставник устанавливает правила, а ученик должен слепо и без раздумий их соблюдать. Конечно, учитель может объяснить установленные правила. Но в начале обучения это не имеет смысла, так как новичок просто не может их понять. Сначала он должен изучить несколько столпов программирования.

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

Наставничество не должно превращаться в односторонний монолог. Учитель должен искать ключи к каждому студенту, следить за прогрессом, проверять упражнения. Только наставник может определить, когда новичок готов перейти на следующий уровень и осваивать новые темы.

Столп № 5: вызовы и мотивация

«Давайте сделаем свой Фейсбук с музыкой и видео». Это не план огромной корпорации с миллиардным бюджетом. Это реальный рекламный слоган, который должен привлечь учеников на курсы программирования. Если принять это всерьез, можно попасть в мир иллюзий. Курсанты без чувства юмора могут решить, что через несколько месяцев они действительно смогут сделать второй «Фейсбук».

Преподаватели и организаторы курсов должны ставить амбициозные цели, чтобы мотивировать студентов. Но лучше выбирать что-то более реалистичное, сфокусированное на решении конкретных и достижимых результатов.

Если студент не сможет сделать новый «Фейсбук» после окончания курсов, наступит разочарование. Демотивированный новичок практически не имеет шансов на успех, так как программированию невозможно научиться без внутренней мотивации и страсти.

Поэтому начинающим разработчикам нужно объяснять, что стать профессионалом можно. Но для этого надо иметь крепкую задницу. Только так получится часами сидеть за монитором и делать упражнения.

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

Новички должны быть подготовлены к реальной работе программиста. Поэтому они должны уметь получать удовольствие от скучных упражнений. Более того, объясните им, что программисту приходится ошибаться, исправлять ошибки, переписывать код заново. Это часть разработки.

Финальный совет поможет освоить 5 столпов программирования

Помните, никто не может стать профессиональным программистом за две недели, два месяца и даже за год. Чтобы стать разработчиком, нужно постоянно практиковаться и сохранять терпение.

Преподаватели не должны давать нереальные обещания. А новичкам не стоит верить в рекламные слоганы. Программистом стать можно. Но для этого придется буквально пахать и осваивать азы программирования.

К своему 20-летнему юбилею работы программистом автор попытался перечислить основные руководящие принципы, которые формировались на протяжении всей его карьеры.

✏️ 20 универсальных советов для программиста на все времена

Я программирую с 1999 года, и в этом году исполнилось 20 лет, как я начал писать код. Моим первым языком был Basic, но вскоре я перешел на Pascal и C, а затем изучил объектно-ориентированное программирование (ООП) на Delphi и C++. В 2006 году я начал изучать Java, а в 2011 году – JavaScript. Я работал в компаниях различного профиля – от робототехники, финансовых и медицинских технологий до средств массовой информации и телекоммуникаций.

Временами я занимал различные должности: исследователь, технический директор, TPM (менеджер по техническому продукту), преподаватель, системный архитектор и TL (технический руководитель), но при этом я всегда занимался программированием. Я работал и над продуктами, которыми пользовались миллионы людей, и над продуктами, которые провалились до того, как были выпущены. Я консультировал людей и у меня даже был свой стартап. Я потратил много времени на проекты с открытым, закрытым и внутренним (собственный код, разработанный внутри компании) исходным кодом. Я работал с крошечными микроконтроллерами, с мобильными и настольными приложениями для облачных серверов и впоследствии без серверов.

К своему 20-летнему юбилею работы программистом я попытался перечислить основные принципы, которые были накоплены за эти годы в качестве руководящих принципов на протяжении всей моей карьеры:

1. Используйте с умом различные программные средства

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

2. Вы не пишете код для машин, вы пишете его для своих коллег

Вы не пишете код для машин, вы пишете его для своих коллег, для себя в будущем (если только это не одноразовый проект или вы пишете на ассемблере), а также для джуниоров, не забывайте об этом.

3. Эффективно общайтесь и активно сотрудничайте

Любой значимый и ценный кусочек программного обеспечения является результатом совместной работы. Эффективно общайтесь и активно сотрудничайте. Доверяйте другим и завоевывайте их доверие. Уважайте людей больше, чем код. Подавайте пример. Превратите своих последователей в лидеров.

4. Разделяй и властвуй

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

5. Критикуйте себя

6. Риск — это деловое решение

Безопасность имеет несколько уровней, каждый уровень необходимо оценивать как отдельно, так и по отношению к целому. Риск — это деловое решение, имеющее прямое отношение к уязвимости и вероятности ее возникновения. У каждого продукта/организации свое отношение к риску, на который они готовы пойти ради получения выгоды. Часто UX, безопасность, производительность конкурируют между собой.

7. Научитесь отпускать

Поймите, что у каждого кода есть жизненный цикл, который заканчивается. Иногда он умирает в младенчестве до запуска. Умейте отпускать такие ситуации. Знайте разницу между 4 категориями функций и умело вкладывайте свое время и энергию:

8. Люди отделены от вещей, которые они создают

Не привязывайте свою личность к своему коду. Не привязывайте чью-либо личность к их коду. Поймите, что люди отделены от вещей, которые они создают. Не принимайте критику кода на свой счет, но будьте очень осторожны, критикуя чужой код.

9. Отставание от графика

Отставание по графику похож на фаст-фуд. Иногда это приемлемо, но если вы к этому привыкнете, это убьет продукт быстрее, чем вы думаете (и болезненным образом).

10. Приоритеты

При принятии решений при прочих равных следуйте следующему правилу приоритетов: Безопасность → Надежность → Удобство использования (доступность и UX) → Обслуживаемость → Простота (опыт разработчика/DX) → Краткость (длина кода) → Финансы → Производительность . Но не следуйте этому правилу слепо, потому что все зависит от характера продукта. Как и в любой профессии, чем больше опыта вы нарабатываете, тем лучше вы находите баланс для каждой конкретной ситуации. Например, при разработке игрового движка наивысший приоритет имеет производительность, но при создании банковского приложения безопасность является наиболее важным фактором.

11. Копипаста

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

12. Не пишите код только для хорошего развития событий

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

13. Не используйте зависимости

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

14. Хайп

Держитесь подальше от hype-driven development. Но учитесь всему, чему можете. Пусть у вас всегда в портфолио будут pet-проекты.

15. Выходите из своей зоны комфорта

Выходите из своей зоны комфорта. Учитесь каждый день. Учите тому, что вы изучаете. Если вы мастер, вы не учитесь. Откройте для себя другие языки, технологии, культуру и оставайтесь любопытными.

16. Документация

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

17. Пишите понятные функции

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

18. Разберитесь в предметной области, прежде чем начинать программировать

Никогда не приступайте к программированию (разработке решения), если вы полностью не понимаете проблему. Вполне нормально тратить больше времени на понимание и чтение документации, чем на ввод кода. Разберитесь в предметной области, прежде чем начинать программировать. Проблема подобна лабиринту. Вам нужно постепенно проходить цикл «код-тест-улучшение» и исследовать проблемные места, пока не дойдете до конца.

19. Не решайте проблему, которой не существует

Не занимайтесь спекулятивным программированием. Делайте код расширяемым только в том случае, если есть уверенность, что он будет расширяться. Скорее всего, к тому времени, когда он будет расширен, определение проблемы будет выглядеть иначе, чем когда вы писали код. Не переусердствуйте: сосредоточьтесь на решении существующей проблемы и грамотном внедрении эффективного решения.

20. Слушайте. Вдохновляйте. Учите. Делитесь

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

Я не претендую на авторитет в области разработки программного обеспечения. Это всего лишь мудрость, которую я приобрел на своем пути. Я уверен, что этот список будет совершеннее еще через 20 лет.

Читайте также: