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

Отчасти я уже ответил на этот вопрос в статье .

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

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

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

  1. Быть уверенным пользователем компьютера. Это важно. Просто в моей практике периодически возникают ситуации, когда человек скачивает книгу “ ”, а потом пишет мне на почту претензии в том, что вместе с книгой нет инструкции как её открыть. Вопрос: не рано ли человек пытается изучать программирование, если он не знает, как распаковать архив и открыть файл формата PDF?
  2. Понимать, чем отличается опытный пользователь от программиста. Исходя из примера, который я привёл в п.1, я делаю вывод, что многие люди совершенно не понимают, чем занимаются программисты и думают, что программист - это человек, который хорошо разбирается в компьютерах. На самом деле это не так - программист вообще может не разбираться в компьютерах (в некоторых случаях он и без этого может делать свою работу).
  3. Знать математику хотя бы на уровне начальных классов средней школы.
  4. Желательно хотя бы в общих чертах знать информатику.
  5. Уметь хорошо печатать на клавиатуре (не обязательно, но это сократит время на изучение программирования, так как вам придётся печатать много текста, чтобы проверить примеры разных учебных программ на практике).
  6. Уметь читать)))

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

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

Вам надо знать, как создаются программы (ну хотя бы программы для работы в Windows).

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

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

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

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

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

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

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

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

Как же так получается, что компьютеры способны понимать программы, написанные программистами? Что для этого нужно и как вообще можно стать программистом?

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

  1. Пользовательский уровень.
  2. Знание основ программирования.
  3. Углубленное изучение языка программирования; работа в реальных коммерческих проектах.
  4. Работа в команде программистов над сложными системами.

Давайте рассмотрим особенности каждого из этих четырех этапов.

Пользовательский уровень

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

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

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

Как правило, пользователи работают с программами, запускаемыми под операционной системой Windows(OS, operation system, можно сказать, что это самая главная программа в любом компьютере). Существует огромное множество, как других операционных систем, так и других типов компьютеров. Самые популярные из альтернатив - это OSX (MacOS) и Linux.

Вне зависимости от того, чем именно вы решите заниматься в жизни, вам всегда пригодится умение искать нужную информацию в сети Интернет, пользоваться различными сетевыми сервисами — от электронной почты до платежей онлайн. Прошли те времена, когда для решения какой-то одной конкретной задачи нужно было штудировать тома учебной и справочной литературы. Кроме поисковых сервисов (google.com,yandex.ru) в Интернет существует масса сайтов, построенных по типу вопрос-ответ (лучший для программистов — stackoverflow.com). Это революционный и самый эффективный способ найти решение конкретной проблемы, потратив минимум времени.

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

Знание основ программирования

Как начать программировать?

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

Какой язык программирования выбрать?

Старая шутка гласит: «Выбирай тот язык программирования, на котором практикует ближайший к тебе гуру (авторитетный опытный профессионал), который всегда может помочь советом». Другой совет состоит в том, чтобы выбрать язык программирования, используя который, вы будете чувствовать себя счастливым . А если серьезно, то не важно, какой именно язык вы выбираете, чтобы освоить азы структурного программирования. Основная ваша задача на этом этапе - это понимание таких вещей как алгоритм, код, данные. Вы должны уметь работать с числовыми и строковыми переменными, массивами, использовать циклы, условный оператор, подпрограммы в формате процедур или функций, корректно программировать ввод и вывод данных. Судя по демонстрационным вариантам ЕГЭ по информатике 2012 года, основными учебными языками программирования остаются Бейсик (BASIC), Паскаль (Pascal) и Си (С). С таким же успехом в этот список можно добавить Питон (Python) и Руби (Ruby). Вы не выбираете один язык программирования раз и навсегда. Напротив, плох тот программист, который знает только один язык программирования. Со временем к вам придет осознание того факта, что такое разнообразие языков и сопутствующих им технологий существует не случайно. Дело в том, что в реальной жизни выбирать тот или иной язык программирования нужно в зависимости от поставленной задачи.

Можно изучить основы программирования самостоятельно.

В этом случае вам понадобятся учебно-методические материалы. Это может быть самоучитель или набор вводных статей в электронном виде (tutorial), которых в сети сейчас существует огромное множество даже на русском языке. Из программ вам потребуется компилятор или интерпретатор языка, который вы выбрали, и редактор исходного кода. Желательно иметь пакет программ разработчика с интегрированной средой разработки (IDE). Это специальный набор программ, который совмещает в себе и удобный редактор кода и подключенный к нему компилятор или интерпретатор. Подобные пакеты можно найти даже для очень старых компьютеров на базе операционной системы MS-DOS.

Интерпретатор - это программа, которая транслирует код вашей программы в машинный язык (самый низкоуровневый язык программирования; компьютер “железо” понимает только этот язык программирования) и тут же его выполняет шаг за шагом (интерпретирует). Компилятор - это программа, которая транслирует (компилирует) код вашей программы в специальный исполняемый формат (exe -файл под Windows ), по сути, в отдельную программу, которую позже можно самостоятельно запустить даже на другом компьютере под управлением той же или совместимой с ней операционной системы.

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

Профессиональное программирование

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

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

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

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

Вот почему в таких наукоемких сферах как IT высшее техническое образование играет одну из ключевых ролей. Оно дает вам как перспективу, так и безопасность в будущем. И речь сейчас вовсе не о формальном дипломе. Обладая широкой теоретической базой, полученной в вузе, вы сможете легко осваивать новые инструменты, языки программирования и даже целые парадигмы (функциональное программирование, логическое программирование, ООП, DSL, AI, Machine Learning). Вам будет гораздо легче найти новую работу. Богатый математический аппарат даст возможность решать сложные задачи, принимать нестандартные решения, видеть шире и дальше, со временем повести за собой людей, возглавив коллектив от нескольких программистов до мультинациональных групп разработчиков, в качестве системного архитектора (Architect), старшего программиста (Lead Developer), руководителя IT-направления (англ. Chief Information Officer, CIO) или исполнительного директора (англ. Chief Executive Officer, CEO). (СПбГУ ИТМО)

Работа в компании

Одного диплома недостаточно для того, чтобы автоматически получить место программиста в серьезной компании. В первую очередь HR’ы (англ. Human Resource, люди в компании, которые занимаются кадровыми вопросами подбора персонала) смотрят на реальный опыт кандидата, который тот должен подтвердить на собеседовании и при реализации тестового задания.

Условно позиции программистов можно разделить на 3 уровня:

  • начальный (Junior Software Developer);
  • средний (Middle Software Developer);
  • высокий (Senior Software Developer).

Причем каждая вакансия подразумевает специализацию по тому или иному языку программирования и технологии. Самые популярные и востребованные из них: Java, C/C++, .NET, PHP, Ruby, Python, Flash/Flex. Кроме того, существует градация по предметной области: программирование под Web, Enterprise-разработка коммерческих решений в сфере управления, создание игр, программирование под мобильные платформы, низкоуровневое и системное программирование.

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

Академическое знание в XXI веке старается не отставать от стремительно изменяющегося мира IT. Поэтому, и наши, и зарубежные вузы тесно сотрудничают с крупнейшими компаниями-разработчиками ПО. Так, например, преподаватели МГУ задействованы в школе обработки информации, занятия которой уже несколько лет организует компания Яндекс. С одной стороны, компании дают самые передовые практические навыки разработки, с другой - получают квалифицированные кадры в качестве выпускников факультетов прикладной математики и информатики.

Думается, что любого начинающего программиста интересуют ответы на следующие вопросы:

  • Что такое программирование?
  • Сложно ли стать хорошим программистом?
  • Что нужно знать новичку?
  • С чего следует начинать изучение?

Ответам на эти и некоторые другие вопросы как раз и посвящен данный пункт нашего учебника. Итак.

Программирование (от англ. programming ) – это процесс создания компьютерных программ.

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

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

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

Понятное дело, у всех людей данные качества и возможности развиты по-разному. Поэтому однозначно ответить на вопрос, сложно ли стать хорошим программистом, довольно затруднительно. Кто-то сможет без проблем освоить программирование самостоятельно не выходя из дома, а кто-то без посторонней помощи вообще не сможет начать процесс обучения даже при наличии всех учебников. В любом случае нужно помнить, что хорошими программистами не рождаются - ими становятся. При этом не нужно думать, что стать лучшим программистом - это значит с отличием окончить соответствующий ВУЗ. Есть довольно много примеров, когда целеустремленные самоучки во многом превосходят дипломированных специалистов. Это связанно с тем, что самоучки с большим желанием изучают интересующую их область и в случае возникновения трудностей не бегут к своим учителям или преподавателям, а пытаются самостоятельно одолеть проблему, упорно рассматривая различные возможности и варианты решения, листая страницы учебника или же бороздя просторы Интернета в поисках ответов на специализированных сайтах и форумах. К слову, по данным исследований страховой компании GoCompare почти четверть из богатейших людей планеты по версии журнала Forbes за последние 20 лет либо совсем не учились в университете, либо покинули его еще до получения диплома. При чем большинство из них, как раз и являются представителями IT-области! Вот лишь несколько примеров имен таких людей: Билл Гейтс - компания Microsoft, Марк Цукерберг - соцсеть Facebook, Стив Джобс - компания Apple, Майкл Делл - компания Dell Computer Corporation, Ларри Элисон - компания Oracle Corporation, Ян Кум - WhatsApp.

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

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

Быстрый переход к другим страницам

  • Что нужно знать начинающему программисту?
Вне зависимости от того, какое образование у – техник он или инженер, чтобы состояться в этой профессии, ему необходим набор некоторых особых личных качеств. Прежде всего, он должен уметь мыслить логически и просчитывать события на много ходов вперед. Ему также потребуется внимательность, усидчивость и уметь заниматься не только творческой работой, но и довольно рутинной. Подчас, чтобы воплотить в жизнь креативную идею, ему нужно будет потратить более 90% времени на ее реализацию и отладку программы. Конечно, без целеустремленности и настойчивости в этой профессии не обойтись, также, как и без развитого интеллекта, способности к точным наукам и умения концентрироваться.

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

Что входит в должностные обязанности техника-программиста

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

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

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

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

Знание и понимание терминологии

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

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

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

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

Уровень владения языком программирования (ЯП)

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

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

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

Например, при написании кода на Java или C# он должен знать применяемые библиотеки, типовые ситуации программирования. Хорошего специалиста отличает способность избегать повторяющихся структур в коде и способность создавать собственные программы в соответствии с проблемами, которые решаются в разрабатываемом приложении.

Коммуникативные навыки

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

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

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

Востребованность профессии

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

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

Куда пойти учиться?

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

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

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

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

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

Как стать программистом? Что нужно выучить? Ответ вроде прост: пойти в университет и там тебя научат. Но если вы спросите любого программиста он скажет что то чему там обучают, хоть иногда даже и бывает интересно, но почти бесполезно и совсем мало имеет общего с реальной работой.

Программирование - это что-то вроде грамоты

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

Эти операторы - как буквы алфавита, а функции ввода/вывода Read () и Write () - как первые слова, «мама» и «папа», с которых ребенок начинает постигать мир.

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

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

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

Но есть одно существенное отличие: сценаристы уже не могут переписать сюжет снятой серии. В лучшем случае, если зритель что-то недопонял, они прояснят это в следующей серии.

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

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

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

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

Оk, если программирование - это «как грамота», то что тогда еще нужно знать и уметь, чтобы стать «писателем»?

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

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

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

Основы программерии

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

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

Неслучайно она победила, в опросе «Если бы вы могли вернуться в прошлое, когда были еще начинающим девелопером, то какую книгу по программированию вы посоветовали бы себе прочитать?».

Затем появились другие хорошие книги о программерии:

И множество других достойных, но в целом они охватывают глубже определённые области.

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

  • Основы компьютерной техники: основы Булевой алгебры, двоичная и шестнадцатирядная системы счисления.
  • Устройство компьютера: процессор, оперативная память, стек, жесткий диск, графическая карта, шина, периферия (т. е. клавиатура, мышь).
  • Ассемблер процессора и С - их тоже нужно знать хотя бы немного.
  • Собственно базовая грамота: синтаксис, как объявлять переменную, функцию, как писать условный оператор if, приоритет операторов, как организовать цикл, как получить ввод от пользователя и как ему вывести. Структурное программирование - как писать без goto, используя циклы и рекурсию. Это легкотня на самом деле, пятнадцать операторов выучиваются быстро. Почти все используемые сегодня языки программирования наследуются от С (C++, Java, C#, PHP, JavaScript), так что переучивать их не придется. Поэтому, кстати, не особо важно, с какого из этих языков вы начнете обучение.
  • Алгоритмизация: линейный поиск перебором, бинарный поиск, пузырьковая сортировка, быстрая сортировка и т. д. Оценка сложности алгоритмов.
  • Структуры данных: строки, очередь, стек, одно- и двусвязный список, массивы и т. д.
  • Декомпозиция, абстракция и проектирование программы: объектно-ориентированное программирование, SOLID, шаблоны проектирования, UML-диаграммы.
  • Основы функционального программирования: как писать без деструктивного присваивания и циклов, работа с коллекциями в функциональном стиле.
  • Знание платформы, библиотек, технологий: Java Core, работа с файлами, работа с Сетью, работа с массивами, строками и коллекциями, работа с памятью и сборка мусора. Обо всем этом есть толстые книги от самих создателей технологии (например, «Эффективная Java»).
  • Стандарты и протоколы сети: TCP, UDP, HTTP, HTML, XML, JSON, MIME, RFC.
  • Умение писать чистый код: как правильно называть переменные и классы, как форматировать код, как правильно писать комментарии (точнее, как их не писать:-)). Понимание приходит после прочтения книги Clean Code.
  • Умение работать с кодом: рефакторинг (книга Фаулера), хоткеи IDE для рефакторинга, умение читать и сопровождать старый код.
  • Инженерные практики: юнит-тесты, экстремальное программирование (XP), непрерывная интеграция, системы управления версиями (Git, SVN).
  • Управление проектом и организация процесса: Waterfall, Agile, SCRUM, Kanban, баг-трекеры, оценка времени на задачу.
  • Soft skills: умение общаться с заказчиком и ладить в команде, побороть отсутствие мотивации, выбрать приоритеты.
  • Базы данных: SQL, реляционные, документо- и граф-ориентированные БД, ACID, теорема CAP, оптимизация запросов.
  • Операционные системы: Linux, установка и настройка программ на нем, командная строка.
  • Масштабирование и высокие нагрузки, мониторинг, логинг, отказоустойчивость.
  • Криптография, защита от атак.
  • Юзабилити, сбор требований.
  • Знание английского языка, умение четко и лаконично писать документацию.
  • Умение правильно формулировать вопросы и самостоятельно находить ответы на них.
  • Умение учиться и при этом постоянно самосовершенствоваться.
  • Умение обучать других, понятно объяснять и даже выступать перед публикой на конференциях…
  • и при этом не слетать с катушек.

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