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

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

Быть на «ты» с компьютером

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

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

К чему все это? А к тому, что мир информационных технологий – это мир игрушек, с которыми должно хотеться играть. Именно с интереса к этим «игрушкам» все и начинается. Если его нет, нет и программиста.

Английский

Без английского не обойтись. Чтобы выучить язык программирования, продется перелопатить много литературы, видео-уроков и документации. Почти все (99%) первоисточники написаны на английском языке. Если его не знать, то спектр материалов для изучения сузиться в разы. Соответственно скорость изучения языка программирования значительно снизиться.

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

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

Математика

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

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

Общительность

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

Есть некий миф, мол, отшельничество и замкнутость – это неотъемлемая часть натуры программиста. В большинстве своем программисты весьма интересные и коммуникабельные люди. А отшельничество – это некий образ присущий всем гениям независимо от профессии, будь-то программист, лингвист, доктор и т. д.

Гибкий ум

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

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

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

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

Рассмотрим сущность отмеченных аспектов подробнее.

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

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

  • написание компьютерных программ;
  • разработка концепций ПО;
  • адаптация программ к различным категориям пользователей (с точки зрения интерфейса и функций);
  • тестирование и отладка «софта».

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

Языковая компетенция

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

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

Какие языки программирования должен знать программист? Это во многом зависит от того, какого рода ПО он создает. В рамках внутрикорпоративных задач программист чаще всего работает с базами данных, серверами, отладкой, тестированием, написанием алгоритмов управления оборудованием. Данные компетенции, вероятнее всего, потребуют знания универсальных, многофункциональных языков: C, C++, Java, Ruby. Если говорить о работе с базами данных, не обойтись без владения SQL. Пригодится специалисту знание Python - одного из самых простых в освоении, но очень нужного и востребованного языка.

Что касается выпуска ПО под заказ на внешний рынок, то требования к навыкам программиста обычно шире - поскольку от функциональности и качества выпускаемых решений зависит коммерческий успех компании-работодателя. Не считая указанных универсальных языков, человеку необходимо будет владеть более «узкопрофильными» - такими как, например, C#, Javascript, PHP, Objective-C.

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

Участие в концепции

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

В ходе решения задач, связанных с концепцией ПО, функции программиста также предполагают высокий уровень его языковых знаний. В частности, специалист должен уметь корректным образом подбирать оптимальный язык с точки зрения совместимости с проектом. Например, отмеченный нами выше Objective-C - основной при разработке мобильных приложений для iOS, но что касается решений для Android, то для их создания один из самых оптимальных инструментов - Java.

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

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

Все компоненты важны

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

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

Пройти тесты

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

Существует большое количество видов ПО для проверки корректности программ. В числе популярных - Device Anywhere, Jira, Android Debug Bridge, iPhone Configuration Utility. Программист должен уметь пользоваться ими, не считая, разумеется, знаний в области языков, применяемых при создании ПО для платформ, в которых проводится тестирование.

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

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

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

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

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

Итак, в числе самых востребованных сегодня языков: C, C++, C#, Java, Javascript, Ruby, PHP, Python, Objective-C, SQL. Чем обусловлено то, что современный программист должен их знать?

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

В свою очередь, язык C# не слишком близок к C, однако он взял многое из C++, а также Java. Что касается его применения, он незаменим для программистов, работающих с корпоративными типами ПО для Windows.

Язык Java многие IT-специалисты называют самым универсальным. Он может быть задействован практически на любой платформе - Windows, Linux, Mac, в мобильных операционных системах, в веб-разработке. Язык Java относительно сложен в изучении, но по факту его освоения программист сумеет решать самый широкий спектр задач.

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

Что должен знать программист о языках Python и Ruby? Прежде всего, то, что несмотря на простоту изучения, они применяются в самых разных сферах. Например, Python активно задействуется разработчиками крупнейших онлайн-корпораций - Google, Facebook. Язык Ruby отлично подходит для небольших стартапов, но не только - например, опыт его успешного использования есть у таких крупных проектов, как Slideshare и Groupon.

Рынок мобильных приложений - один из самых динамичных и прибыльных сегодня. Если программист хочет освоиться на iOS-платформе, то ему следует изучить язык Objective-C - он, как мы уже отметили выше, специально создан для разработки соответствующего типа ПО. Если человеку ближе рынок устройств на Android, то тогда нужно изучать Java.

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

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

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

Что должен знать начинающий программист?

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

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

Построенные на теории массового обслуживания и стандарте GSM сети мобильной связи; PHP-скрипты, исполняющиеся на удаленных серверах и передающие свою выдачу через Ethernet по TCP/IP на компьютеры с NDIS-драйверами; процессоры, переупорядочивающие и спекулятивно исполняющие наборы инструкций для того, чтобы скомпенсировать вызванную ограничениями полупроводниковой электроники и скоростью света остановку роста тактовой частоты; рассчитанные на ЭВМ корпуса самолетов и автомобилей, лекарства и структуры ДНК; компьютерные игры, ради крохотного блика в которых пишутся мегабайты заполненных интегралами Френеля статей; электронные фильмы и книги; алгоритмы NLP и TreeNet, вызывающие нам из огромных баз данных поисковую выдачу - вот то, что окружает нас каждый день благодаря программистам, благодаря оригинальным подходам и фундаментальным знаниям, благодаря продуманной и отточенной десятилетиями методологии разработки и управления сложностью ПО.

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


  1. C++ , стандарт, Comeau, 1TBS, Страустрап/D&E/Джосаттис/Вандервуд, Дьюхэрст/Мейерс/Саттер, RAII/copy-and-swap/exception-safety, правило пяти, Александреску/Абрахамс-Гуртовой, type erasure, CRTP, NVI, SFINAE, Koenig lookup, Duff"s device, Boost, Сик-Ламсдейн/Карлссон, TR on C++ performance, тест Степанова, forwarding problem/move semantics, SPECS
  2. Компиляторы , особенности реализации стандарта, ограничения реализации, интринсики, отличия стандартных библиотек (контейнеры, rand), ABI, реализация виртуальных функций, виртуального наследования, исключений, RTTI, switch, указателей на функции и методы; оптимизации, copy elision (RVO, NRVO), sizeof на различных платформах, дефайны компилятора и среды, __declspec, ключи компилятора, empty-base optimization, статическая и динамическая линковка, манглинг, распределенная компиляция, precompiled header, single compilation unit, (strict) aliasing/restrict, inline/_forceinline, volatile
  3. Мультитредность , обедающие философы, deadlock/livelock/race condition/starvation, атомарность, lock инструкции процессора, memory model/barrier/ordering, CAS или LL/SC, wait/lock/obstruction-free, ABA problem, написание lock-free контейнеров, spin-lock, TLS/per-thread data, закон Амдала, OpenMP, MPI, map-reduce, critical section/mutex/semaphore/condition variable, WaitForSingleObject/WaitForMultipleObjec ts, green thread/coroutine, pthreads, future/deferred/promise, модель акторов
  4. Язык ассемблера , Зубков/Хайд/Дреппер/Касперски/Фог/Абраш, x86, FPU/MMX/SSEn/AVX, AT&T и Intel-синтаксис, masm32, макросы, стек, куча/менеджеры кучи, соглашения вызова, hex-коды, машинное представление данных, IEEE754, little/big endian, SIMD, аппаратные исключения, прерывания, виртуальная память, реверсинг, срыв стека и кучи, return oriented programming, alphanumeric shellcode, L1/L2/RAM/page fault и их тайминг, язык ассемблера ARM
  5. Аппаратное обеспечение , Хоровиц-Хилл/Титце-Шенк/От физики к Си от panchul , полупроводниковая электроника/спинтроника/фотоника, транзистор, триггер, схемотехника, микрокод, технология создания процессоров, logic synthesis, static timing analysis, FPGA, Verilog/VHDL/SystemC, SISAL, Arduino, устройства памяти (ROM → EEPROM, RAM, SSD, HDD, DVD), RISC/CISC, Flynn"s taxonomy (ID), принстонский и гарвардский подход, архитектуры процессоров, архитектуры x86, VID/PID
  6. Процессоры , конвейеризация, hyper-threading, out-of-order execution, спекулятивное исполнение, static/dynamic branch prediction, префетчинг, множественный ассоциативный кэш, кэш-линия/кэш-промах, такты, кольца защиты, память в мультипроцессорных системах (SMP/NUMA), тайминг памяти
  7. Дискретная математика , K2, теорема Поста, схемы, конечные автоматы (ДКА и НДКА), автомат Калашникова, клеточные автоматы
  8. Вычислимость , машина Тьюринга, нормальные алгоритмы Маркова, машина Поста, диофантовы уравнения Матиясевича, лямбда-функции Черча, частично рекурсивные функции Клини, комбинаторное программирование Шейнфинкеля, Brainfuck, эквивалентность тьюринговых трясин, проблема останова и самоприменимости, счетность множества вычислимых функций, RAM-машина, алгоритм Тарского, SAT/SMT-солверы, теория формальных систем
  9. Языки программирования , грамматики, иерархия Хомского, теорема Майхилла-Нероуда, лемма о накачке и лемма Огдена, алгебра Клини, НДКА → ДКА, алгоритмически неразрешимые задачи в формальных языках, Драгонбук, Фридл, регекспы и их сложность, PCRE, БНФ, Boost.Spirit + Karma + Qi/Ragel, LL, LR/SLR/LALR/GLR, PEG/packrat, yacc/bison/flex/antlr, статический анализ кода, компиляция/декомпиляция/обфускация/деобф ускация, Clang/LLVM/XMLVM/Emscripten, GCCXML, OpenC++, построение виртуальных машин, JiT/AoT/GC, DSL/DSEL
  10. Алгоритмы и комбинаторная оптимизация , Кормен/Скиена/Седжвик/Кнут/Ахо-Хопкрофт-У льман/Пападимитриу/Шрайвер-Голдберг/Преп арата-Шеймос/e-maxx.ru, структуры данных, алгоритмы, сложность, символика Ландау, теорема Акра-Баззи, time-space tradeoff, классы сложности, NP-полные задачи, КМП, графы и деревья, потоки в сетях, матрица Кирхгофа, деревья поиска (особенно RB-дерево и B-дерево), occlusion detection, куча, хэш-таблицы и идеальный хэш, сети Петри, алгоритм русского крестьянина, метод Карацубы и матричное умножение Винограда-Штрассена, сортировки, жадные алгоритмы и матроиды, динамическое программирование, линейное программирование, diff-алгоритмы, рандомизированные алгоритмы и алгоритмы нечеткого поиска, псевдослучайные числа, нечеткая логика
  11. Численные методы , дихотомия/метод Ньютона, интер- и экстраполяция, сплайны, метод Гаусса/Якоби/Зейделя, QR и LU-декомпозиция, SVD, МНК, методы Рунге-Кутты, метод Адамса, формулы Ньютона-Котеса, метод Ритца, метод Бубнова-Галеркина, метод конечных разностей/элементов, FFT/STFT, сходимость и устойчивость
  12. Машинное обучение , Рассел-Норвиг/Bishop, подходы к моделированию AI, переобучение/кроссвалидация, байесовские сети, нейросети, сети Кохонена, Restricted Boltzmann machine, градиентный спуск/hill climbing, стохастическая оптимизация (метод Монте-Карло, метод отжига, генетические алгоритмы, муравьиные алгоритмы), SVM, gradient boosting, кластерный анализ, метод главных компонент, LSH, обучение с подкреплением, MDP, information retrieval/data mining/natural language processing, машинное зрение, Szeliski, OpenCV, image processing, OCR, фильтры Собеля, каскад Хаара, Viola-Jones framework, SURF, введение в психофизиологию зрения, IPython/pandas/scikit-learn
  13. Теория информации , сжатие, Хаффман, RLE, BWT, LZ, коды коррекции ошибок, сжатие с потерями (изображения, аудио, видео), информационная энтропия, формула Шеннона, сложность Колмогорова
  14. Криптография , Шнайер/Ященко, Принцип Керкгоффса, симметричная (DES, AES), асимметричная (RSA), качество ГПСЧ, алгоритм Диффи-Хеллмана, эллиптические кривые, хэширование (MD5, SHA, CRCn), DHT, криптостойкость, криптоатаки (атака гроссмейстера), WEP/WPA/WPA2 и атаки на них, цифровая подпись и сертификаты, PKI, HTTPS/SSL, доказательство с нулевым разглашением, пороговая схема
  15. Математика , Кнут-Грэхем-Паташник/Зорич/Винберг, Spivak/Dummit-Foote, матан, линал, комплан, функан, диффгем, теория чисел, дифуры/интуры/урчпы/вариационное исчисление/оптимальное управление, производящие функции, ряды, комбинаторика, теорвер/матстат/слупы/теория массового обслуживания, цепи Маркова, интегральные преобразования (Фурье, Лаплас, вейвлет), NZQRCHOS, матпакеты (Mathematica, Maple)
  16. Физика , правила Кирхгофа, закон Джоуля-Ленца, комплексное сопротивление, скорость и частота света, уравнения Максвелла, лагранжиан и гамильтониан
  17. Химия , стехиометрия, химия кремния:)
  18. Архитектура и стиль кода , Макконнелл/Фаулер/Лебланк/Гамма/Александ реску-Саттер/Буч, защитное программирование, паттерны, SOLID/GRASP/KISS DRY SPOT/YAGNI, UML, OOP (Smalltalk), OOD/OOA, метрики кода
  19. Методологии разработки , Waterfall/RUP/Agile/Scrum/Kanban/XP, TDD/BDD, CASE
  20. Тестирование , юнит-тесты, функциональное, нагрузочное, интеграционное тестирование, тестирование UI
  21. Инструментальные средства разработки , IDE, IntelliSense, отладчики (VS/Olly/WinDbg/kdb/gdb) и трейсеры (strace/ltrace), DWARF debug information format, дизассемблеры и декомпиляторы (IDA/HexRays/Reflector), системы контроля версий (SVN, GIT), merge/branch/trunk, системы именования файлов и бранчей, continuous integration, ant, code coverage, статический анализ (lint, cppcheck), динамический анализ (valgrind, фаззинг), верификация и валидация ПО (Frama-C, RAISE (RSL), Coq), профайлинг, багтрекеры, документирование кода, системы сборки (CMake), пакетные менеджеры (NuGet)
  22. Фреймворки , Qt, moc и метаинформация, концепция слот-сигнал, Саммерфилд-Бланшет/Шлее, PoCo, промышленные библиотеки: GMP, i18n, lapack, fftw, pcre
  23. Операционные системы , Silberschatz/Рихтер/Соломон-Руссинович/Р обачевский/Вахалия/Стивенс/Love/Linux Kernel Internals, менеджер памяти, менеджер кучи и ее устройство (LAL/LFH/slab), менеджер устройств, менеджер процессов, context switch, реальный и защищенный режим, исполнимые файлы (PE/ELF/Mach), объекты ядра, отладочные механизмы (strace/ptrace/dtrace/pydbg, Debug API) и минидампы, bash, сетевой стек и высокопроизводительные сервера, netgraph, CR0, IPC, оконная подсистема, система безопасности: ACE/ACL и права доступа, технологии виртуализации, RTOS (QNX), программирование драйверов, IRQL, IRP, файловые системы, BigTable, NDIS/miniport/FS drivers/filter driver, Mm-, Io-, Ldr-функции, DKOM и руткиты, GDT/IDT/SDT, ядра Windows/Linux/BSD, POSIX
  24. Компонентно-ориентированные модели , Роджерсон/Таварес, COM/OLE/ActiveX/COM+/DCOM RPC, ATL, апартменты, моникеры, MIDL, XPCOM, CORBA, TAO, D-Bus
  25. Сеть , Стивенс, OSI model/Internet model, Ethernet, TCP/IP, TCP window, алгоритм Нейгла, сокеты, Protocol buffers/Thrift/Avro/ASN.1, AMQP, ICMP, роутинг/BGP/OSPF, ARP, атака Митника, syn flood, HTTP/FTP, P2P/DHT, DHCP, SMB/NBNS, IRC/XMPP, POP3/SMTP/ESMTP/IMAP, DNS, WiFi/WiMax/GSM/CDMA/EDGE/Bluetooth/GPS, ACE, Wireshark
  26. Графика и GPGPU , алгоритм Брезенхема, цветовые модели, трассировка лучей vs полигональная графика, OpenGL/GLSL/Open Inventor, DirectX/DirectShow/DirectAudio/HLSL, stencil/depth/alpha-test, графический конвейер в DirectX 11, шейдеры, модели освещения (Фонг), пропускная способность, fillrate, OpenCL/CUDA/AMP, ландшафты, лоды, тени, deferred shading, текстурирование и фильтрация, антиалиасинг, HDR, tone mapping, virtual/augmented reality
  27. Форматы , XML/XSLT/XPath/XMLStarlet/DOM/SAX, RTF/ODF, JSON/BSON/bencode, YAML, JPEG/PNG/WebP, AVI/MPEG/RIFF/WAV/MP3/OGG/WebM, SVG, Unicode, кодировки однобайтные/UTF-8/UTF-16/UCS-2/UTF-32, проблемы длины и сравнения Unicode-строк
  28. Базы данных , Грубер/Дейт, ANSI SQL, T-SQL, ODBC, MySQL/PostgreSQL/MS SQL/BDB/SQLite/Sphinx, хранимые процедуры, триггеры, алгебра Кодда/А, Tutorial D, нормальные формы, оптимизация и выполнение запросов, структуры данных индексов, транзакции и ACID, CAP-теорема Брюера, NoSQL, key-value storage, шардинг, ORM (C++ ODB), ERD, OLAP, семантическая сеть, triplestore, RDF/Turtle, SPARQL, OWL, Semanticscience Integrated Ontology, reasoner, DBpedia
  29. Прикладное программирование , C#/F#, Шилдт/Троелсен/Рихтер, генерики, yield, linq/plinq, рефлексия, AST, WCF, WinForms/WPF/Silverlight, AOP, фреймворки логгирования, .NET assembly, Scala, Хорстманн/Одерски, pattern matching, макросы/квазицитаты
  30. Квантовые вычисления , алгоритм Шора, квантовая криптография
  31. Функциональное программирование , Haskell/Ocaml/Scheme/Alice или Oz, SICP/TaPL/YAHT/Purely Functional Data Structures/Харрисон-Филд, HOF (map/fold/filter), система типов Хиндли-Милнера, монады, тайпклассы, АТД, dependent types, ленивость/энергичность, логическое программирование (Prolog или Mercury), конкурентное программирование (Erlang или Oz)
  32. Веб-программирование и скриптовые языки , Фланаган/Zend PHP5 Certification Course + Study Guide, Apache/nginx, CGI/FastCGI, PHP/Zend Framework/ReactPHP/Zend Engine/Doctrine или Propel/CodeIgniter или Symphony или Yii, Python/Django/Twisted, Ruby/RoR, ASP.NET MVC, JavaScript/jQuery/React/Google Closure/ExtJS/node.js, ООП в JavaScript, HTML5, CSS3/табличная и блочная верстка, RSS, canvas/WebGL, Ajax/WebSockets, вопросы безопасности (XSS, SQL injection, CSRF), highload, C10k problem, SWIG
  33. Проектирование GUI и представление информации , Раскин/Тафти, юзабилити, основы дизайна и типографики, закон Фиттса, основы верстки, LaTeX

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


Этот теормин вполне справедливо критикуется за отсутствие системности изложения и ВНЕЗАПНЫЕ соседства различных как по глубине, так и по содержанию топиков. Это не бага, это фича. Системное изложение программы по практически любому из пунктов заняло бы места не меньше, чем оглавления пухлых талмудов, поэтому лучше как раз названия этих талмудов и приводить. Как же тогда работать с этим списком? Следует брать хорошие книжки по тематике и читать их до тех пор, пока все упомянутые слова не встретятся в процессе чтения. Авторы и в страшном сне не могли предположить, что кто-то решит, что устройство Даффа посчитают по глубине и объему чем-то равным полуторатысячестраничному Священному Стандарту. Однако этот критерий вполне рабочий - можно перечитать сотню книг по C++ для начинающих, и ни разу не встретить упоминания о нем, но если читать действительно полезные книги и статьи (для тем, подобных C++, такие книги существуют и перечислены), то все слова довольно быстро встречаются. Смысл программы, обусловленный ее размером, именно в том, чтобы дать возможность оценить, достаточное ли количество книг по теме прочитано.

Весьма значительное количество критики теормин встречает и со стороны людей, считающих себя программистами, которые полагают, что все это знать невозможно , изучать слишком долго, а в некоторой абстрактной узкой практике большая часть не используется. Эти люди, к сожалению, просто не понимают, в чем разница между эрудицией/памятью и знаниями. Ценность для программиста имеет не запоминание точного формата какого-нибудь из пакетов NBNS, а овладение подходами, которые использовались при разработке, другими словами не способность воспроизвести, а способность воссоздать или опознать, в том числе в другой области. Именно способность человека к анализу и синтезу (которая все же не берется из ниоткуда, а достигается активным познавательным трудом) отличает его от гугла, который даже в очень отдаленной перспективе не научится решать даже div2 250. Именно на развитие этой способности и направлен теоретический минимум, который в процессе работы обязательно придется дополнять domain-specific знаниями, будь то особенности игровой физики, разработка оперденей на Java или создание реальных микросхем.

В отдельный абзац стоит выделить вопрос от тех, кто сомневается в своих способностях освоить теормин, либо полагает, что способность его применять будет редко востребована и ослабнет. В целом, теорминимум в большинстве пунктов несколько уступает учебным программам факультетов CS нормальных университетов, так что за 5 лет его освоить вполне возможно, даже совмещая с работой. Конкретно в геймдеве активно используются (по разным подсчетам в обсуждениях) от 1/3 до 2/3 перечисленных пунктов. Недостающую активность можно восполнять, к примеру, консультируя других на Stack Overflow .

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

«Нас и тут неплохо кормят» . Этот аргумент встречает свое опровержение во втором по активности обсуждении статьи у metaclass :
Все, что должен знать программист, чтобы его после 40 лет не выбросили на Помойку, Где Бомжи.
Действительно, в возрасте около 45 лет начинает активно проявляться деградация мозга, приводящая к существенным проблемам в понимании и способности оперировать кодом с обычной цикломатической сложностью. Потеря способности писать код в сочетании с неспособностью из-за отсутствия тренировок к анализу/синтезу - гарантированный путь именно туда. Некоторые люди сохраняют способность оперировать нормальной цикломатической сложностью и в старости, однако лишь за счет превышающих норму показателей в молодости. Проверить, входите ли вы в зону риска, можно на TopCoder
От физики к программированию
Зачем нужно знать всякие низкоуровневые вещи

Ну и наконец, откуда вообще вырос этот теормин:
ACM Computer Science Curriculum

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

перевод на русский Это одна из классической статей, которая проведет вас по особенностям памяти, некоторые из которых старые, некоторые новые, некоторые известные и некоторые не очень. Несмотря на управляющую роль и вездесущность, не каждый программист имеет достаточный уровень знаний о Памяти. Важность знакомства с памятью в современных системах увеличивается, если вы заняты в сфере написания высокопроизводительных приложений. Разработчики аппаратных средств придумывают более сложные модели управления памятью и методы ускорения, такие как кэш CPU, но они не могут оптимально работать без некоторой помощи со стороны программистов. Я до сих пор читаю эту статью, и не могу сказать насколько много я узнал из нее о RAM, кэше CPU, например, L1 и L2 кэш, различных видах памяти, прямом доступе к памяти, конструкции контроллера памяти, и памяти в целом. Короче говоря, must read для программистов любых уровней.

Что должен знать каждый ученый о арифметики чисел с плавающей точкой

Тема арифметики операций с плавающей точкой коварна, и непроста в освоении. Многие Java программисты даже не знают, что может пойти не так при сравнении значений типа float / double оператором == . Многие из нас часто совершают ошибки, реализуя денежные расчеты в типах float и double . Данная статья еще одна жемчужина этой серии и является must read для всех разработчиков программного обеспечения и программистов. По мере роста опыта вы должны вдаваться в тонкости общих тем, и арифметика чисел с плавающей точкой является одной из них. Как старший Java разработчик вы должны знать как выполнять денежные расчеты, когда использовать типы float , double или BigDecimal , как округлять числа с плавающей точкой и многое другое. Даже если вы обладаете твердыми знаниями в этой теме, после прочтения статьи вы сможете открыть для себя что-то новое об операциях с плавающей точкой.

Что каждый разработчик должен знать о Unicode

Кодировка символов является еще одной областью, где многие программисты испытывают трудности, и "Абсолютный минимум, который безусловно должен знать каждый разработчик программного обеспечения про Unicode и наборы символов (никаких оправданий!)" призван восполнить этот пробел. Для справки, Да, это полное название этой статьи. Ее автором является Joel Spolsky, один из основатель https://stackoverflow.com . Джоэл написал эту статью в своем блоге почти 10 лет назад, но она не потеряла своей актуальности и в современном мире. Статья объясняет что такое Unicode, что такое кодировка, как символы представлены с использованием байт и многое другое. Одной из лучших вещей в этой статье является язык и метод изложения, даже если вы ничего не знаете о Unicode, у вас не возникнет проблем с пониманием. Короче говоря, еще один must read для всех программистов, кодеров и инженеров программного обеспечения.

Что каждый программист должен знать о времени

Помимо кодировки символов, время и даты (Time and Date) являются еще одной областью, где многие программисты, включая меня, испытывают трудности. Даже старшие разработчики теряются в GMT, UTC, летним временем и високосными секундами. Честно говоря, не легко справиться с часовыми поясами, не совершая каких-либо ошибок, а использование летнего времени дополнительно усложняет задачу. Проблемы усугубляются, если вы пользуетесь метод проб и ошибок, потому что вы никогда не будете в состоянии решить вашу проблему, делая это. Существует огромное число вещей, которые могут пойти не так, и бытует такое же количество заблуждений. Такие вещи, как, содержит ли дата часовой пояс или нет могут сбить вас с толку, преобразование времени UNIX к другим временным зонам, может взбесить вас, и вы с легкостью можете забыть о синхронизации часов и задержек. Я надеюсь, что после прочтения этой статьи, многие из ваших заблуждений о времени исчезнут, и у вас выстроится полное понимание времени.

Что каждый веб-разработчик должен знать про кодировку URL

Эта статья описывает распространенные ошибочные представления о кодировании Uniform Resource Locator (URL), а затем пытается разъяснить кодирование URL для HTTP, и далее демонстрирует часто возникающие проблемы и пути их решения. Хотя эта статья не является заточенной под какой-либо язык программирования, она иллюстрирует проблемы в Java) и заканчивается объяснениями по исправлению проблемы с кодировкой URL в Java, и в веб-приложениях на нескольких уровнях. Вы узнаете основы URL грамматики, общий синтаксис URL в HTTP и других протоколах. В этой статье также рассматриваются частые подводные камни URL-адресов, например, кодировку символов, специальные символы в разных частях URL, и вопросы кодирования/декодирования URL. Если вы Java программист, то вы также узнаете о том, как правильно управляться с URL-адресами в приложении Java. Как построить URL и использование клиентской библиотеки Apache Commons HTTP. Наконец, также предлагаются лучшие примеры и варианты работы с URL-адресами, например, вы должны кодировать URL при его построении, убедиться, что ваши фильтры URL-перезаписи справляются с вашими URL корректно и многое другое. Короче говоря, must read для любого веб-разработчика и программиста.

Что каждый программист знать о веб-разработке?

Эта интересная статья из programmersStackExchange, о том, что следует обдумать каждому программисту, реализующему технические детали веб-приложения, прежде, чем открыть сайт для публики. Она включает в себя вещи из областей разработки интерфейсов и удобства использования (Interface design and User Experience), Безопасности (Security), веб-стандартов (Web standards), производительности (Performance), оптимизации для поиска (Search Engine Optimization(SEO)), используемых технологий, и некоторых важных ресурсах. Сегодняшний мир в значительной степени зависит от интернета и достаточно распространено наличие у программиста личного сайта или блога. Опыт полученный из этой статьи, будет полезен не только в вашей профессиональной деятельности, но и в собственных проектах. Вы узнаете о всех ключевых технологий, таких как, HTTP, HTML, XML, CSS, JavaScript, совместимость браузеров, советы для уменьшения времени загрузки вашего сайта, XML карты сайта, спецификаций W3C и несколько других ключевых моментов.

Что каждый программист должен знать о SEO

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

Что каждый C программист должен знать о неопределенном поведении (Undefined Behaviour) # 1/3

Язык программирования C имеет концепцию "неопределенного поведения". Неопределенное поведение широкая тема с большим количеством нюансов, и это одна из причин, почему я люблю Java: меньшее количество неопределенного поведения, меньше путаницы, больше стабильности и больше мира. Многие, казалось бы, разумные вещи в C на самом деле имеют неопределенное поведение, и это общий источник ошибок в программах. Кроме того, любое неопределенное поведение в C дает разрешение реализациям (компилятора и среды исполнения) для генерации кода форматирующего жесткий диск, совершения абсолютно неожиданных вещей, или даже хуже. Читайте эту прекрасную статью для глубокого погружения в море непредсказуемого поведения.

Что каждый программист нужно знать о сетях

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

Что каждый Java разработчик должен знать о Строках (String)

Это моя статья о java.lang.String и лично я считаю, что каждый Java программист должен знать об этом. Строки очень важны в повседневном программирования на Java, и именно поэтому хорошие знания являются обязательными для любого Java разработчика. Эта статья затрагивает многие важные аспекты Строк, включая строковой пул, строковые литералы, сравнение строк с помощью == против equals() , преобразование байт в строку, то почему строка является неизменной (immutable), правильное объединение строк и многое другое. Продвинутый программист, возможно, уже знаете все эти особенности, но даже в этом случае будет неплохо повторить.

Что каждый программист должен знать о безопасности?

Этот вопрос был задан студентом программистом на StackOverflow. Равно как много мы знаем об общих понятиях программирования, таких как, операционная система, алгоритмы, структуры данных, компьютерная архитектура и другие вещи, точно также важно знать и о безопасности. Хотя тема Безопасности достаточно обширна, содержит области шифрования/дешифрования, SSL, веб-безопасности, запутывания, аутентификации, авторизации и т.д., существует базовый минимум знаний обязательный для каждого программиста. Лично я в начале своей карьеры не знал многого о безопасности, когда я начал писать Servlet/JSP на основе Java web application, я узнавал о веб-безопасности и ряде угроз безопасности таких как SQL Injection, отказ в обслуживании (Denial of Service), XML Injection, межсайтовый скриптинг (Cross site scripting) и других. Как разработчик Java, теперь я следую безопасным методам Java программирования, предоставляемых fortify, PMP и другими поставщиками статических анализаторов кода. В этой статье содержится очень хорошая подборка тем и ссылок про безопасность, и в независимости от того, программируете вы или нет, вы, несомненно, получите пользу от этого ресурса.

Показатели Задержки (Latency Numbers) которые должен знать каждый программист

Это статья является бонусной, но, тем не менее, must read для любоко программиста. Для написания высокопроизводительного приложения на любом языке программирования будь то Java или C++, вы должны знать основные значения задержек, например, сколько времени займет чтение переменной из памяти, из L1-кэша, из L2-кэша, при случайном чтении (random read) с SSD и с диска. Сколько времени необходимо, чтобы заблокировать/разблокировать мьютекс, чтобы отправить пакет данных из одного города в другой или делать проход с возвратом (roundtrip) в пределах одного центра обработки данных. Эти значения задержек не зависят от языка программирования и являются часть базовых знаний, которые разработчик должен иметь, для написания сильнонагруженных приложений с низкой задержкой (high frequency low latency). Положительный момент об этой ссылке заключается в том, что он предоставляет сравнительный анализ того, как эти значения развивались в течение многих лет. Вы можете видеть, какими были значения в 2006 году и то, что они представляют собой сейчас. Вот и все, об этом списке статей которые должен прочитать каждый программист. Читая статьи такие как Что каждый программист или разработчик должен знать, вы углубляете свои знания в конкретной теме. Честно говоря, существует слишком много вещей к изучению программистами, и изучение языка программирования, такого как Java, лишь верхушка айсберга, но разве не большинство из нас имеют страсть к обучению. Программирование - работа, требующая постоянного развития, и единственными вещами которые будут полезны любому программисту на протяжении всей карьеры являются фундаментальные знания о таких вещах как память (memory) , Unicode , вычисления с плавающей точкой (floating point numbers) , время (time) , безопасность (security) . Некоторые вещи специфичны для конкретных языков, например мой пост о строках (String) в Java и, Что каждый C программист должен знать о неопределенном поведении (Undefined Behaviour), но и они хороши к изучению для многих начинающих и разработчиков. Перевод статьи

От автора: работа программистом может стать вашим счастливым билетом в жизнь. Это сложная дорога, требующая огромного количества потраченных усилий и времени на изучение языка HTML, CSS, Java, PHP и прочих технических штук, но, черт возьми, игра стоит свеч. Продолжайте чтение статьи, если вас не пугают трудности на пути к звездам, и вы четко хотите понять, что нужно, чтобы стать программистом.

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

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

С чего начать?

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

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

JavaScript. Быстрый старт

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

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

Самостоятельно стать программистом (самообразование).

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

Причем многие из них находятся в бесплатном доступе, поэтому если вы на тематических форумах уже успели всех достать сообщениями: «Хочу стать программистом, с чего начать? А где взять деньги? Я же с нуля!», то вот, пожалуйста ответ. Скачивайте бесплатные курсы, обучайтесь, применяйте полученные знания на практике, зарабатывайте.

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

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

Быстро стать программистом при помощи специализированных курсов.

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

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения

Получить высшее образование в университете.

Этот путь будет самым долгим. За сколько можно стать программистом в университете? Лет 5, не меньше. Нельзя сказать, что у вас будет большое преимущество в знаниях, ведь половину образовательной программы разбавят ненужными предметами вроде физкультуры, философии и прочих наук, с преподавателями которых явно не поговоришь на языке HTML или Java.

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

Стать крутым программистом с помощью ментора.

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

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

Какие знания необходимы?

Знания, которые необходимо получить, зависят от того, на чем вы хотите специализироваться. Каким программистом лучше стать - решать только вам. У каждого человека свои цели и предпочтения. Если говорить о том, что надо, чтобы стать программистом в самом начале, то советую определиться с подходящим языком программирования (PHP, Java, Python, Ruby и т. д.). Критериями выбора могут стать следующие 3 параметра:

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

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

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

Как получить первый практический опыт?

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

Не нужно ждать, пока закончится последняя страница новой мега полезной книги, которая сделает вас гуру программирования. Увидели задание? Тут же выполняйте, потом усложняйте, экспериментируйте. Задача: прокачать ключевые навыки в программировании до уровня автоматизма. Бои выигрывает не тот, кто много знает, а тот, кто может удачно применить свои знания на поле битвы.

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

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

JavaScript. Быстрый старт

Изучите основы JavaScript на практическом примере по созданию веб-приложения