что нужно для начинающего программиста
Программирование для начинающих: как стартовать и куда двигаться?
Бывает, что человек, совсем не связанный с IT, проникается интригующей красотой этой сферы и ставит себе задачу постепенно освоить программирование с нуля. И тут он зачастую просто теряется, не понимая, с чего начать, и нуждаясь в хорошем фундаменте и системном подходе.
Я, будучи недавно в такой же ситуации, гуглила, искала мануалов на Хабре (кое-что нашла: Десять советов начинающим программистам, Начинающему программисту про стартапы и не только…), но в итоге всё же была вынуждена обратиться за советом к одному хорошему человеку, который составил для меня вот такой план. С разрешения этого человека размещаю данный план на Хабре – вдруг он пригодится и кому-то ещё. (Тем более, что перечисленные книги относятся к «золотому фонду» литературы в данной сфере и проверены временем.)
UPD: Новичкам советую обратить внимание на комментарии — там активно и аргументированно корректируется этот план.
Нортон «Программно-аппаратная организация IBM PC»
Эта книга, несмотря на свою давность, относятся к тем, что пока отнюдь не устарели. Как новичок подтверждаю – повествование вполне понятно и для почти полного чайника в IT.
Гук «Аппаратные средства IBM PC»
А эту книгу стоит прочитать «поверх» – она расскажет о том, как дела в данной сфере обстоят сейчас.
Морс, Алберт «Архитектура микропроцессора 80286»
Почему тут берётся за основу именно микропроцессор 80286 – станет понятно по изучении трудов первого этапа.
Гук «Аппаратные интерфейсы ПК»
Гук «Интерфейсы устройств хранения»
Этап III. Операционные системы
Таненбаум «Архитектура компьютера»
Колисниченко, Аллен «Linux: полное руководство»
От общей теории переходим к изучению конкретной операционной системы – на примере Linux.
Немет, Снайдер, Хейн «Руководство администратора Linux»
Этап IV. Собственно программирование
Керниган, Ричи «Язык программирования С»
Почему первым для освоения выбран именно язык Си? Как мне рассказали знающие товарищи, он поможет достичь правильного «программистского мышления», чего было бы сложно достичь, начиная изучение, скажем, с Паскаля. Кроме того, язык Си по-прежнему используется в наши дни и подходит как для прикладного, так и для системного программирования.
Кнут «Искусство программирования»:
Том 1. Основные алгоритмы
Том 2. Получисленные алгоритмы
Том 3. Сортировка и поиск
Бентли «Жемчужины программирования»
Зачем осваивать эти труды? Как уже отмечали на Хабре – «наверное, нигде больше, чем в айти, не изобретается такое огромное количество велосипедов». Данные книги помогут этого избежать – и попутно будут прививать умение писать не просто код, а хороший код.
Ну а для затравки можно прочесть небольшой цикл лекций «Культура программирования» (автор – А. Бабий). Он помогает начинающим программистам понять, что их деятельность не будет проходить в вакууме, а неизбежно включит взаимодействие с другими программистами, с заказчиками и пользователями (а также включит необходимость копаться потом в своих собственных или в чужих программах).
Закономерный вопрос новичка: сколько времени займёт изучение всего этого? По прогнозам моего советчика, у человека, который может тратить на изучение программирования только вечера и выходные, на прочтение и осмысление литературы первых трёх этапов уйдёт полгода-год. На четвёртый этап тоже даётся год – чтение должно сопровождаться практикой по самостоятельному составлению программ. Как получится на самом деле – время покажет.
Буду крайне благодарна за ваши советы и уточнения.
Как начать программировать?
Для кого эта статья?
В первую очередь для тех, кто интересуется программированием, но не знает как к нему подступиться.Ведь это неизвестность, которая всегда пугает.
Ко мне периодически обращаются юноши, которые горят желанием программировать, но теряются. Действительно, есть много такого, что хочется создать своими руками. Много разного. Чаще всего молодёжь хочет написать крутейшую игру, которая будет работать на слаааабенькой видеокарте 🙂 Мне приходится их разочаровывать. Дело в том, оптимизация программы не менее сложная работа, чем её написание. целые команды профессионалов работают над этим. И наивно полагать,сто один разработчик,который только начал изучать азы программирования окажется более эффективным в этой задаче. Задача «крутая игра на слабом железе» возникает от невозможности позволить себе дорогую видеокарту. Обычно такую задачу ставят себе старшеклассники, либо студенты начальных курсов институтов.
Один из моих студентов со временем понял, что заниматься WEB программированием (не путать с вёрсткой) намного интереснее. А крутую видеокарту можно купить на нормальную зарплату программиста, без особого ущемления других своих потребностей.
Платформы
Итак, первым шагом определяем, что именно хочется программировать. В какое именно устройство вложить свой мозг и для чего это нужно именно Вам (может, просто для высокой зарплаты).
Основных направлений не так уж много:
Мобильные приложения (Android, iOS)
Виртуальная и дополненная реальность AR/VR
Мультимедиа (Фото, видео и звук)
Встроенные системы и IoT(типа, Arduino, STM32, AVR, ESP и т.п.)
Наверняка есть ещё направления. Более экзотические. Или комбинации из перечисленных. Например, дополненная реальность в мобильных приложениях.
Выбирайте, с какими устройствами Вы хотите работать и переходим к следующему шагу.
Инструменты и технологии
Лёгкий старт
Для того, чтобы новичку придать начальное ускорение в каждом развитом технологическом решении (платформа + инструмент) есть примеры готовых приложений, которые можно просто собрать и запустить на выполнение. Посмотреть как оно работает. Поизучать какие изменение в тексте программы как влияет на исполнение приложения. Есть так же образцы кода, которые можно скопировать в своё приложение. На жаргоне программистов это называется «скопипастить» от слов Copy + Paste Правда, они могут не всегда работать 🙂
Живое сотрудничество
Тайные смыслы
Почему так сложно? Потому, что современное программирование давно и далеко ушло от своих истоков. Наработано огромное количество технологий, библиотек, компонетов и прочего кода, который хочется использовать повторно. На жаргоне это называется Reuse (реюз) Встают практические задачи совместно использовать один компонент с другим, одновременно использовать разные компоненты, в одном приложении или системе использовать различные технологии одновременно. Такая задача называется интеграцией. Сборкой чего-то целого из частей. И программисты часто сталкиваются с проблемой совместимости этих самых частей. возникают ошибки, конфликты сборки и исполнения, различия систем понятий. Чтобы разрешить проблемы нужно глубоко вникать в детали и подробности. Глубже и глубже. Делать предположения, проверять их. Затем тестировать. В общем, это целый мир. «Зазеркалье»
Хотите туда? Интересно? Тогда дерзайте.
Эта статья не претендует на введение в специальность.
Она была написана постольку, поскольку вопросы задаются и я на них отвечаю.
Семь вещей, которые нужно знать начинающему программисту
Если вы недавно в мире профессиональных разработчиков, вы могли слышать о вещах, которым не учат в университете или на курсах.
Выпускник ли, начинающий карьеру разработчика, или человек, переходящий к программированию из другой сферы, остановись и прочти эти семь советов для начинающих программистов от тех, кто занимается этим уже много лет.
Загляните под капот
Знание языка программирования — основа разработки программного обеспечения. Но не менее важно понимать, что скрывается у языка под капотом.
Пит Балл, инженер поддержки в Acquia, сказал: «Многие языки абстрагированы от того, что происходит на уровне системы, и эта абстракция полезна, поскольку позволяет разработчикам быстрее разрабатывать. Но когда вы натыкаетесь на грабли, действительно неприятный баг, нужно понять, что же происходит внутри. Совершенно необходимо тогда уметь заглянуть внутрь процесса, посмотреть системные вызовы и понять, как кусок кода взаимодействует с остальной системой».
Точно так же говорит Роберт Дуглас, вице-президент отдела удовлетворенности клиентов Platform.sh: «Когда я начинал программировать, были вещи, которые я действительно не понимал. Три примера таких вещей — файловые системы, сеть и то, как данные хранятся в памяти. Это значит, что я не обязательно понимал цели некоторых программ, с которыми сталкивался».
Знайте инструменты командной строки
Есть шанс, что как разработчик, вы большую часть времени будете писать код в красивом редакторе или IDE. Однако знание разных утилит командной строки может облегчить вам жизнь.
Ветеран с двадцатилетним опытом, пожелавший остаться анонимным, сказал: «Иногда вы оказываетесь перед машиной с ограниченным набором инструментов и задачей, которую надо сделать прямо сейчас. Знайте командную строку, как пять пальцев; инструменты, такие как find, comm, diff, vi/vim, sed, awk; умейте писать небольшие скрипты прямо в командной строке, чтобы найти файл, который надо подправить прямо сейчас, потому что продакшн сломан, а Джо, который полез своими ручонками не туда, — в отпуске на Фиджи».
Балл, использовавший инструменты Microsoft, а теперь перебирающийся на Linux, соглашается: «Я узнал о командной строке и утилитах *nix все, что возможно. Я могу вспомнить код, который писал год назад, и как я проводил дни или недели, работая над тем, что решается однострочником на grep+awk».
Дебаггер — ваш друг
Как разработчик, вы проведете кучу времени, отлавливая баги. Дейв Вэйрон, биотехнолог-программист в Novartis, выделяет преимущества дебаггера, несмотря на затраты времени на его освоение.
«Учитесь пользоваться дебаггером!», — говорит он. «Потратьте день-два на его настройку. Если вы не видите ожидаемого результата, просто отладьте его: установите точки останова и аккуратно продвигайтесь по коду, особенно по коду сторонних библиотек. Это лишит вас дней разочарования, более того: вы научитесь новому, просто читая чей-то код».
Научитесь писать тесты
Некоторые разработчики уверены в критической важности модульного тестирования, которое подразумевает написание небольших тестов, проверяющих, делает ли код то, что задумал разработчик. Среди этих людей — Ричард Хэндлофф, разработчик баз данных в Strategic Power Systems. Он пишет: «Думаю, что лучший совет, который я могу дать начинающему разработчику — научиться писать хорошие тесты как можно раньше».
Планируйте самообучение
С быстрым изменением технологий меняются системы, языки и инструменты, используемые программистами.
Адам Вульф, мобильный разработчик и основатель Milestone Made, предполагает, что новые разработчики должны быть готовы к изменениям и быть на гребне волны. «Прямо сейчас я хочу сказать, что вы должны быть готовы осваивать новый стек технологий примерно каждые четыре года. Хорошие базовые знания всегда будут актуальны, но инструменты и технологии, которые вы будете использовать каждый день, будут меняться не реже, чем с названной частотой».
«Проекты больше не пишутся на одном языке и стеке технологий», сказал анонимный разработчик. «Вы никогда не ограничитесь работой только с одной технологией в одном проекте. Привыкайте к переходу из проекта в проект и от одних языков и технологий к другим».
Кооперируйтесь
Несмотря на то, что обычно разработчики работают обособленно, им приходится взаимодействовать с другими людьми. Бен Миллер, CTO Sinclair Digital Ventures, подчеркнул важность готовности к командной работе для вашей карьеры: «Большие проекты — это куча движущихся деталей, собранных вместе, и то, как они соединяются и разделяют проблемы, создаст невероятные инженерные сложности, если вы не будете осторожны», пишет он.
«Прежде чем браться за улучшение одного алгоритма, соберитесь с командой и убедитесь, что нет способа разделить проблему на всех, сделав ее проще. Разработка — командная игра!».
Подтверждая важность командных навыков, Вейрон говорит: «Если вы не можете понять самостоятельно, как работает этот интерфейс, попросите помощи. То, что вы считаете свою работу шедевром, не делает ее шедевром. Как в колледже, у других людей в комнате те же вопросы или вопросы, на которые только вы можете ответить. Разрабатывайте отношения с коллегами. Часто просто озвучивание проблемы вызывает озарение».
Анонимный источник, разделяющий мнение о важности командной игры, говорит: «Соберитесь и делайте что говорят, даже если это вас утомляет. Но осторожно: вы рискуете застрять так надолго».
Разрабатывайте для себя вне работы
Миллер дает достаточно интересный совет, который не кажется очевидным на первый взгляд. «Разработка для себя — путь к повышению», — говорит он. «Найдите простое решение проблемы, сделайте код понятным и легко модифицируемым, и вам подкинут еще больше работы. Со временем у вас даже будут просить совета» — объясняет он. «Короче говоря, стремление к спокойной безопасной работе затормозит карьеру».
Перевел: Андрей Никифоров
___
Полезные материалы для начинающих разработчиков от образовательного IT-портала GeekBrains:
Запись вебинара «Все, что вы хотели знать о профессии программиста»
Бесплатный онлайн-курс для начинающих «Основы программирования»
Что следует знать перед тем как «увлечься» программированием
Вступление
Этот хабратопик предназначается для всех тех, кто хочет с головой (или не очень) погрузиться в волшебный мир программирования, но пока не знает, с чего начать. Возможно, вы уже предпринимали попытки научиться программированию, однако безнадежно забуксовали.
Так получилось, что около четырех-пяти месяцев назад я решил слегка разнообразить свой досуг новым хобби и вплотную заняться веб-программированием. Как я докатился до жизни такой — это тема для совсем другой статьи, и речь сейчас пойдет не об этом. Речь пойдет о трудностях, с которыми я столкнулся, и к которым абсолютно не был готов. Возможно, этот топик поможет вам лучше подготовиться и не повторить моих ошибок.
Итак, после осознания навязчивого желания хотя бы немного да освоить это таинственное ремесло, каждый задает абсолютно логичный вопрос — «С чего же мне начать»? Ответов может быть множество — к услугам новичков скринкасты, книги, курсы, онлайн-обучение, форумы и прочее, и прочее. Учи-нехочу. И так как никакой общепринятой системы самообучения программированию не существует, можно смотреть и читать все без разбору, дни напролет. При желании, в чтении можно захлебнуться, однако для уверенного продвижения по лестнице знаний необходимо четко и эффективно расходовать свое время и силы, и если не знать с чего начать и куда двигаться — вы попросту забредете в дремучий лес, по которому можно блуждать неделями, пока, наконец, вы не выйдете на верную тропинку. Если выйдете вообще — велик шанс, что вам попросту все это дело быстро надоест.
Я и сам пошел по этому пути — скачивал тучи роликов, впридачу купил несколько книг, читал их и забрасывал, потому что мне все-равно не хватало знаний и подготовки, несмотря на то, что все материалы были предназначены для «новичков». Я постоянно гуглил разные мелочи, задавал нубские вопросы на форумах, хватая минусы, и это убивало во мне желание продолжать самообучение.
Да, любые знания и любой накопленный (нагугленный?) опыт вам, безусловно, поможет и пригодится, однако ваша цель научиться тому, чему вы хотите научиться, и увидеть мало-мальский результат в обозримом будущем ведь так?
Абсолютно все материалы, которые попадались мне на глаза, после краткого вступления немедленно бросались с места в карьер, предлагая читателю решения и примеры на заданную тему. Я чувствовал себя абсолютным двоечником в классе вундеркиндов, и постоянно сталкивался с одной и той же проблемой — авторы книг, впрочем как и любого другого образовательного материала, предполагали что я владею некоторой базой основ, которая, на первый взгляд, к непосредственному программированию не имеет никакого отношения.
Это как если вы пришли работать, скажем, крановщиком, вас в первый же день посадили в башню, и похлопали по плечу со словами «Ну, удачи!». А как же техника безопасности и базовое объяснение что делать, а чего делать не нужно? Как мне пользоваться инструментами? Что вообще у меня за инструменты в наличии? Что я должен знать перед тем как приступить к работе?
Статья носит сугубо рекомендательный характер, однако попадись мне подобный топик на глаза пол года назад, я бы значительно увеличил свою продуктивность, сэкономил уйму времени себе, а так же множеству людей с форумов, отвечавшим на мои абсолютно идиотские вопросы. К каждому пункту я добавил несколько ссылок, как отправных точек для начала обучения. Так как текст предназначается для абсолютных новичков (да и сам я еще таким себя считаю) — я буду изъясняться предельно просто и понятно, поэтому если вы — гуру, и вы нашли в моем тексте оплошность — судите, но не строго!
Итак, что же следует знать, перед тем как увлечься программированием?
1. Терминал
Для вашего дальнейшего успешного самообучения программированию вам необходимо научиться пользоваться терминалом. Помимо непосредственного взаимодействия с языками программирования, обучение пользованию терминалом поможет вам лучше, так скажем, понять язык компьютера и устройство файловой системы в целом, а это уже маленький шажок в нужную сторону. Более того вы скажете мне спасибо, после того как начнете обучаться по скринкастам, в которых терминал используется постоянно.
Самообучение
2. Регулярные выражения
Представьте себе, что вы решили выучить иностранный язык не вникая в его азбуку, алфавит или иероглифику. Конечно, это возможно. Но насколько это усложнит процесс и путь к пониманию сути вещей? Решение сомнительное, правда? Так вот, регулярные выражения (они же регексы, с ударением на первый слог) — это, объясняясь простым языком, в какой-то степени вспомогательная азбука любого программиста, или, выражаясь языком викисловаря — «формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов».
Выглядеть регекс может, например, так:
Задача регулярных выражений — помочь программисту с поиском чего-либо. Сейчас объясню.
Если я в своей программе захочу найти все слова, частью которых является слово car (car, carrot, cartoon), мой регекс будет выглядеть так:
Если же меня интересует только слово car, я напишу:
Дальше — веселее. Можно фильтровать поиск через слово, через букву, исключать слова перед или же после искомого результата… Список возможностей фильтрации результатов при помощи регулярных выражений по-настоящему захватывает, и в паре с терминалом, про который я вам уже рассказал выше, эта штука просто невероятно крута. Несмотря на различающийся синтаксис отдельно взятых представителей ООП, многие из них поддерживают регексы и экономят уйму времени людям их использующим.
«Ну поиск, кому оно надо? Я же буду учиться программировать, а не искать слова!» — наверняка подумаете вы. Я вас услышал и даже понял. Так что если вы все еще сомневаетесь в необходимости заморачиваться с регулярными выражениями, просто поверьте мне на слово — они вам пригодятся. Многие книги и скринкасты используют регексы в примерах, вообще не объясняя, что происходит — авторы думают, что вы уже владеете этими азами и особенно не акцентируют внимание на разжевывании написанного.
Зубрить их совсем не обязательно, но, согласитесь, просмотр пары-тройки скринкастов на данную тематику вас явно не убъет.
Самообучение
3. Софт для разработки — знай свое оружие
Правило номер один — вы должны по-максимуму знать и владеть своими инструментами. Грамотно выбранный и изученный редактор, в котором вы вскоре обязательно начнете творить чудеса, я легко могу сравнить с превосходно подобранным самурайским мечом. Солдаты собирают и разбирают свои автоматы с завязанными глазами — вот насколько хорошо вы должны владеть софтом, которым пользуетесь! Пока вы буква за буквой пишете простую функцию, ваш враг, используя весь потенциал своего редактора, напишет несколько.
Для веб-разработки существует огромное количество програм, от простых текстовых редакторов до сложных облачных решений. В этой статье я не буду сравнивать эти редакторы между собой, вам придется сделать это самостоятельно — ведь вам с этим редактором жить, работать и смотреть на него и в горе и в радости. Я остановил свой выбор на редакторе Sublime Text 2. Помимо тонны возможностей, которыми обладает Sublime, необходимо отметить, что он условно-бесплатный и по нему существует множество отличной документации. Возможно совсем скоро, познав все хитрости Sublime и научившись подключать к нему плагины, подобная строка будет для вас обычным делом:
div>(header>ul>li*2>a)+footer>p (используется плагин Emmet, если кому интересно)
Самообучение
4. Система контроля версий
«Ну а это еще что такое?» — спросите вы. О, система контроля версий это прекрасная вещь, без которой в наши дни не обходится ни один серьезный девелопер. Википедия гласит — «Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое.» Систем контроля версий существует достаточно много, поэтому сразу скажу — ниже речь пойдет исключительно о GitHub, самом большом сервисе для совместной разработки проектов.
Резонный вопрос: «Зачем мне этот Гитхаб осваивать, ведь мне пока нечего выкладывать?» А причин на то несколько. Помимо содержания собственных репозиториев, GitHub, во-первых, поможет вам осознать себя частью огромного сообщества разработчиков (возможно, кто-то из читающих сейчас ухмыльнулся, но поверьте, это действительно важно, особенно на ранних стадиях обучения!). Кроме того, вы сможете взглянуть на чужой исходный код и научитесь правильно его скачивать и «форкать» (копировать). В дальнейшем GitHub частенько будет всплывать в различных онлайн-курсах и скринкастах, и, конечно же, их авторы будут уверены в том, что вы знаете, как Гитхабом пользоваться. Поэтому если у вас найдется немного времени на неделе, сделайте себе одолжение — попробуйте Git.
Самообучение
5. История и культура
Этот пункт, скорее, вспомогательный, но если программиста которым вы восхищаетесь зовут Стив Джобс, то прошу вас, продолжайте чтение. Программирование имеет богатую и интересную историю (говорю вам как историк по первому диплому), в которой следует поковыряться хотя бы для общего образования. Занимаясь чем-либо, всегда полезно знать, откуда у этого чего-либо растут ноги. Кроме того, я искрене считаю, что без знания истории предмета невозможно полностью понять его суть, и, следовательно, достичь предельных успехов в его освоении. Поэтому если по прошествии некоторого времени такие имена, как Линус Торвальдс или же Грейс Хоппер не будут для вас пустым звуком — уважение вам и респект!
Помните — тот, кто не изучает историю, повторяет ее ошибки.
Заключение
Надеюсь, данный текст вас ни в коем случае не испугал, а наоборот, направил в нужную сторону, или же поможет в будущем избежать затруднений, которые постоянно встречаются на пути ученика. Я буду рад получить отзывы и комментарии, или же ссылки на дополнительные ресурсы, которые помогут новичкам в самообучении.
7 принципов, которые нужно знать начинающему программисту
Авторизуйтесь
7 принципов, которые нужно знать начинающему программисту
Эта статья — не самоучитель по кодингу. И не пост о том, «какой язык программирования выбрать». Если вы хотите понять, насколько вам интересно изучать мир кода, то более важным вопросом будет: что такое программирование? Как выглядит программирование изнутри? Совместимы ли я и программирование?
Принцип «логика, а не математика»
Одно из величайший заблуждений у начинающих программистов — это то, что в программировании полно математики. Если вам кажется, что занятие программированием заставит вас снова вспомнить о школьных знаниях тригонометрии, алгебры и т.п., то вы ошибаетесь. Такая математика редко встречается в программировании.
По опыту из «чисто математических» вещей встречаются, например, порядок операций в выражении и система координат. Ничего особо сложного. Логики, напротив, очень много. Необходимость думать наперёд, понимать, в каком порядке выполнять действия и как контролировать этот поток, пронизывает все аспекты программирования. Если у вас есть способность к логике, то вам будет легко начать справляться с программистскими задачами.
Принцип «поймать падающую звезду»
На программирование можно смотреть, как на запуск множества «процессов» — как бы принуждение компьютера «делать работу за вас» — и управление этими процессами. В программировании процесс часто выдаёт некий результат. Результатом может быть файл, но может быть и нечто попроще, например строка, или число.
Проблема в работе с процессами заключается в том, что если вы ничего не делаете с их результатами, то они просто растворяются. Говоря литературно, «уходят в небытие», никогда не воссоздаются, очень похожи на звёзды, которые сверкают на небе и исчезают. Другими словами, вам надо «поймать их».
Если вы создаёте что-то с помощью процесса, вам надо схватить его, или вы его потеряете. Вот где в игру вступают переменные — как способ «запечатлеть» результаты процесса. Этот принцип сильно помогает понять, что такое программирование, на ранних этапах обучения. И если вы рано его ухватите, то найдёте его очень полезным.
Принцип «словаря»
В программировании есть много «типов». Представляйте типы как строительные блоки языка программирования. Один из типов — это строка, или коллекция символов внутри кавычек. И «яблоко», и «апельсин» — это строки. Их можно, например, объединить и сделать «яблокоапельсин». Числа — это другой тип. Числа можно складывать, вычитать, умножать (помимо остальных действий). Затем идут «массивы» — множество объектов в определённом порядке. [«Первое», «идёт», «перед», «вторым»], например, является массивом с первым элементом «Первое» и последним элементом «вторым».
Но, возможно, одним из самых мощных типов является «хэш», или пара «ключ-значение». Хэш имеет много названий. В Ruby это «hash». В JavaScript он называется «object» (объект). Возможно, лучшее имя ему дал Python: «dictionary» (словарь). Если немного подумать, то словарь это и есть набор ключей (слов), указывающих на свои значения.
Но почему это имеет значение? Оказывается, такая структура часто нужна для хранения данных. Например, таким образом можно упаковать информацию о человеке:
Принцип «матрёшек»
В программировании полно объектов, которые находятся внутри объектов внутри других объектов. Программируя, вы часто обнаруживаете, что пытаетесь структурировать данные, и часто эти структуры содержат внутри себя другие структуры.
Добавим в предыдущий пример свойство «siblings» (братья/сёстры):
Этот принцип вы будете встречать на протяжении всего программирования. В HTML одни элементы включают в себя другие элементы:
В CSS также есть иерархия. Точно так же, когда вы пишете скрипты, вам часто нужно запускать одни команды внутри других, которые запускаются внутри других. Когда вы научитесь работать с объектами внутри других объектов, вам станет намного легче учиться программировать, т.к. это составляет значительную часть всего программирования.
Принцип «сосиски»
В вычислениях объектами в основном являются программы или файлы. Это крайне полезный принцип. В программировании вы часто услышите термины «in» и «out» — ввод и вывод. Причина в том, что задачей часто является получение входных данных (ввод), их обработка (процесс), и произведение изменений (вывод). Обработкой занимаются процессы (активные биты), которые управляются вашим кодом. Пассивными битами являются данные, с которыми работают процессы. Это всё похоже на превращение фарша в сосиску.
Принцип «собаки, кошки и рыбы»
(или принцип причинно-следственной связи)
Представьте, что у вас есть комната. В этой комнате есть кошка и рыба в чаше. Рыба ведёт себя как обычно. В определённый момент происходят 2 вещи: собака входит в комнату, а кошка выходит из комнаты. В то же время рыба начинает петь. Вопрос: что заставило рыбу петь?
Можно рассмотреть много возможностей. Можно предположить, это случилось потому, что вошла собака. А можно предположить, что причина в том, что вышла кошка. А может быть, причина в комбинации обоих событий. Возможно, оба события тут не при чём. А дело в том, что 18:17 — это время превращения рыбы в ведьму. Может быть, все рыбы поют. Некоторые из этих вариантов могут оказаться правдой.
Что действительно важно для программиста, так это уметь изолировать причины изменений. Вы будете сталкиваться с подобными ситуациями на протяжении всего времени, пока вы кодите. В таких ситуациях мы, возможно, захотим спросить себя: можем ли мы симулировать вход собаки без выхода кошки (это может многое прояснить); можем ли мы симулировать выход кошки без входа собаки; можем ли мы полностью воспроизвести обстановку (например, время 18:17), чтобы понять, влияет ли она на пение рыбы, вне зависимости от собак и кошек. И так далее. Очень важно применять методологию для установления причин изменений. Эта способность будет помогать вам снова и снова, пока вы кодите.
Абстракции, или принцип «пиццы»
Это один из самых хитрых принципов. Представьте пиццерию. Каждый день повар готовит пиццу с разными начинками. Каждая пицца готовится в определённом порядке: сначала вы готовите тесто, затем вы его оставляете, после помещаете его в форму, добавляете томатный соус, начинку, сыр, а в конце запекаете.
Но естественно, повар не готовит каждую пиццу с нуля в том порядке, как здесь описано. Это заняло бы годы. Вместо этого он готовит всё заранее, а когда очередь доходит до Неаполитаны, всё что ему нужно, это взять основу (которая уже сформирована), добавить томатный соус, анчоусы и сыр, и затем запечь в духовке.
Важная вещь, которую здесь нужно понять, это то, что что повару надо знать лишь ингредиенты для каждой конкретной пиццы, а в остальном все пиццы похожи одна на другую. Программирование выглядит очень похоже, вы используете «абстракции» для хранения более общих данных (это как основа пиццы), отделяя их от более специфичных (начинка).
Давайте превратим приготовление пиццы в код. Сначала начнём делать это неправильно. Сделаем метод make_a_napoletana_pizza (приготовить пиццу Неаполитана):
В нём будет 5 шагов (сделать основу, добавить томатный соус, добавить анчоусы, добавить сыр, запечь):
Отлично. Но что, если мы хотим сделать пиццу салями? Мы будем вынуждены написать абсолютно новый метод make_a_salami_pizza (приготовить пиццу салями), у которого будет много общего с текущим методом, разве что он будет добавлять салями вместо анчоусов. Это несколько затратно. Программистский подход состоит в том, чтобы «абстрагировать» общие части методов приготовления пиццы и учесть различающиеся, специфичные ингредиенты. Мы можем сделать это с помощью «аргумента», который «передаётся» в метод.
Вот что имеется ввиду. Представим, что наш метод make_a_pizza (приготовить пиццу) вызывается с аргументом «toppings» (начинки). Метод будет выглядеть примерно так:
И он будет работать следующим образом:
В 3-й строке мы берём начинки, определённые ранее, и добавляем их в пиццу.
Теперь, когда мы определили общий метод по приготовлению пиццы, мы можем просто вызвать его и задать ингредиенты, которые хотим. Всё происходит автоматически. Другими словами, мы вызываем make_pizza(salami), и когда метод запустится, salami (салями) станет toppings (начинкой) и добавится в пиццу, когда метод дойдёт до 3-й строки. Просто изменяя начинку, можно одним методом создать 2 разные пиццы. Это так же экономно, как когда официантка просто пишет в форме заказа «1 х салями, 1 х вегетарианская», и повар знает всё, что ему нужно. В программировании это называется «абстракция».
Так что мы имеем: семь принципов, которые обычно усваиваются в первые 3 года занятия программированием, и которые вносят значительный вклад в понимание искусства написания кода. Если вы начинаете своё путешествие, эти принципы могут помочь и вам.