Работа программистом что нужно знать. Общепринятые способы получения знаний


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

Необходимые профессиональные умения и знания

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

Другой вопрос, что нужно знать чтобы поступить на программиста. Здесь невозможно за 2–5 лет вырасти в профессионала, если подойти к профильному образованию с минимальным набором школьных знаний. Желая опередить соперников, со старта карьеры получить преимущество, каждый программист (будущий) должен приступать к освоению профессии с отличной базой:

  • по математике (здесь же – логика, теория вероятности);
  • физике;
  • информатике;
  • английскому, русскому.

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

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

Дополнительные навыки делающие конкурентоспособным на рынке труда

Какие навыки помогут быстрее завоевать рынок престижных вакансий?

  • Умение работать в команде для IT-специалиста – 50% успеха его становления на любом поле (разные архитектуры сетей, языки программирования).
  • Усидчивость, упорство, неумение сдаваться.
  • Аналитический склад ума + критическое мышление позволят отмести априори неисполнимые задачи. Умение экономить время заказчика – самый важный плюс профессионала.
  • Аргоритмизированный подход (системность характера) поможет добиться успеха быстрее.
  • Особенность профессии – работа в условном отрыве от социума – определяет некоторые привычки программиста, которые в будущем могут снизить его эффективность. Потому навыки позитивного общения и умение презентовать свои идеи, привычка быть в курсе популярных алгоритмов, сервисов тоже являются полезными навыками.

Что должен знать новичок

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

  • навыков написания программ на 2–3 популярных языках (оптимальными для начинающего специалиста считаются Python, JavaScript, HTML);
  • знания и понимания алгоритмов, баз данных, паттернов программирования;
  • изучения фреймворков (программная среда под разные операционные платформы – Windows, iOS).

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

Где получить образование?

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

Существует несколько способов получения навыков программиста:

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

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

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

  • Наличием вакансий на рынке труда. Если же на рынке вакансий разработчики на выученном соискателем языке востребованы не будут, то и работу будет сложнее найти. Для ориентирования в этой сфере полезно проштудировать сайты с вакансиями, определив десятку наиболее востребованных языков. После этого можно переходить к следующему моменту.
  • Поскольку языки – это первое, что нужно изучать, чтобы стать программистом, то слишком долгое изучение какого-либо языка может в принципе отбить охоту к освоению данной профессии. Поэтому стоит бегло просмотреть учебную литературу по ним и выбрать те из них, которые позиционируются как лёгкие или показались таковыми самому читателю. Чаще всего, речь идёт о Python, Ruby, PHP.
  • Удовольствие от учёбы. Если писать код на выбранном языке человеку не нравится, то он не сможет получать удовольствия и от последующей работы с ним. Стоит ли сразу загонять в себя в такую кабальную деятельность?

Ещё, что надо знать, чтобы стать программистом – определиться с направлением программирования, которое может быть:

  • Десктопным.
  • Мобильным.
  • Игровым.
  • Низкоуровневым.
  • WEB и прочим.

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

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

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

Видео о том, как стать программистом с нуля самостоятельно

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

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

Очень популярен также язык PHP. С ним легко найти решение вопроса на форуме или найти себе наставника. Объясняется это обилием в мире РНР-программистов, работающих на разных уровнях. Здесь нет нормального импорта, зато одну и ту же задачу можно решить множеством способов, что, впрочем, усложняет обучение. Этот язык предназначен только для WEB.

А вот языки C и С# для новичка слишком сложны.

Ruby лучше изучать как второй язык.

Где и как получить начальный опыт?

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

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

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

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

Видео о том, как стать хорошим программистом

Что ещё нужно знать будущему программисту?

Что ещё изучать помимо английского и языков программирования – зависит от выбранного направления.

  • Так, WEB-программисту нужно знать JavaScript, CSS, HTML, программисту десктопов – различные фреймворки и API операционной системы, разработчикам мобильных предложений требуются фреймворки Windows Phone, iOS или Android.
  • Алгоритмы нужно изучать всем: найдя подходящую книгу по алгоритмам или отучившись на Coursera.
  • Кроме того, необходимо знание какой-либо базы данных, структуры данных, паттернов программирования.
  • Полезно изучить хотя бы один репозиторий кода. Знать обязательно систему версионного контроля (лучше выбрать наиболее популярный Git).
  • Программист должен знать операционную систему, рабочие инструменты и среду разработки, а так же уметь пользоваться Google.

А Вы бы хотели стать программистом, и почему? Расскажите об этом в

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

С чего начать

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

Если с вами ничего из вышеперечисленного не произошло, значит, у вас есть выбор из четырёх вариантов:

  • Самообразование . Этот вариант можно использовать как самостоятельно, так и в паре с другими методами. В интернете полно , и приложений , которые помогают изучать различные языки программирования и технологии. Но это самый тяжёлый путь для начинающих.
  • Университет . Если вы оканчиваете школу и хотите быть программистом, тогда идите в университет. Если не за знаниями, тогда за корочкой. Она может послужить бонусом при устройстве на работу. Хотя и какие-то знания вы тоже получите. Но не забывайте заниматься и самообучением. К выбору вуза стоит подойти очень ответственно. Внимательно изучите программы обучения и выбирайте лучшие технические вузы.
  • Ментор . Будет очень неплохо, если вы найдёте человека, который согласится помочь вам и направит вас в правильную сторону. Он подскажет подходящие книги и ресурсы, проверит ваш код, даст полезные советы. Кстати, мы уже писали о , где вы сможете найти ментора. Наставника можно искать среди знакомых программистов, на IT-тусовках и конференциях, на онлайн-форумах и так далее.
  • Специализированные практические курсы . Попробуйте поискать в своём городе курсы, где вас обучат какому-нибудь языку программирования или технологии. Я был приятно удивлён количеством таких курсов в Киеве, в том числе бесплатных и с последующим трудоустройством.

Какой язык, технологию и направление выбрать

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

  • Наличие на рынке вакансий . Конечная цель этого пути - найти работу программистом. А это будет трудно сделать, если на рынке вакансий никто не будет искать разработчиков на вашем языке программирования. Проверьте сайты с вакансиями, посмотрите, кого больше ищут, выпишите десяток языков. И переходите к следующему критерию.
  • Низкий уровень вхождения . Если вам придётся потратить длительное время на изучение языка, это может отбить у вас охоту к программированию вообще. Почитайте о тех языках, которые вы выбрали выше. Просмотрите литературу, которую нужно будет прочитать, чтобы изучить эти языки. И выберите те, о которых пишут, что они лёгкие, или которые вам показались лёгкими. Такими языками могут оказаться PHP, Ruby, Python.
  • Кайф от процесса . Если вам не нравится писать код на выбранном языке, вы не будете получать удовольствия от этого процесса, от работы и от жизни. А оно вам надо? Делайте правильный выбор.

Также вам придётся определиться с направлением программирования. Мобильное, десктопное, игры, веб, низкоуровневое программирование и так далее. Самые популярные и относительно лёгкие отрасли - разработка под веб, мобильные и десктопные клиенты. Под каждое направление может подходить один язык и совсем не подходить другой. То есть при выборе языка программирования также стоит отталкиваться и от этого фактора.

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

Как получить начальный опыт

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

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

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

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

Ещё одним неплохим вариантом для получения реального опыта является open source. Таким проектам всегда нужны новые люди, пусть даже и новички. Вы можете поискать в проекте баги или посмотреть в баг-трекере и предложить методы их решения. Найти такие проекты легко на GitHub или . Не стесняйтесь задавать там вопросы.

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

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

Почему стоит выбрать Python

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

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

Справедливости ради стоит упомянуть и о других языках программирования. Java может стать неплохим выбором для новичка. Этот язык популярнее, чем Python, но и немного сложнее. Зато инструменты для разработки гораздо лучше проработаны. Стоит только сравнить Eclipse и IDLE. После Java вам будет проще перейти к работе с низкоуровневыми языками программирования.

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

Языки C и C# очень сложны для новичка. Ruby - хороший выбор в качестве второго языка, но не первого. JavaScript - очень простой язык, но ничему хорошему он вас не научит. А задача первого языка программирования всё-таки научить вас чему-то правильному, задать какую-то логику.

Важен ли английский язык

Важен! Не знаете? Учите. Знаете? Совершенствуйте. Учитесь читать, писать, слушать и говорить на английском. Делайте упор на техническую литературу. Слушайте англоязычные подкасты. Читайте англоязычные учебники по программированию.

Что нужно знать, кроме языка программирования

Конечно же, кроме языка программирования и английского, нужно знать что-то ещё. А вот что - зависит от направления, которое вы выберете. Веб-программист обязан знать HTML, CSS, JavaScript. Десктоп-программист учит API операционной системы и различные фреймворки. Разработчик мобильных приложений учит фреймворки Android, iOS или Windows Phone.

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

Последние шаги

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

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

Когда я в заинтересованно спрашиваю что же именно должен знать НАСТОЯЩИЙ ПРОГРАММИСТ обычно получаю в ответ какие-нить частные проблемы именно того прогера, с которым я в эту минуту беседую. Причем выдаваемые чуть ли не за истинную сущность всего программирования как такового. Ну что-то типа -- "Если ты не знаешь как использовать семафоры в Делфи ты не программист". Или -- "если ты не знаешь как устроены хэш-таблицы ты не программист". Мне это надоело, я покопался в интернете и решил собрать в один пост все, что должен знать НАСТОЯЩИЙ ПРОГРАММИСТ по мнению самих НАСТОЯЩИХ ПРОГРАММИСТОВ. Список с разбивкой по разделам знания под катом

МАТЕМАТИКА

Численные методы, дихотомия/метод Ньютона, интер- и экстраполяция, сплайны, метод Гаусса/Якоби/Зейделя, QR и LU-декомпозиция, SVD, МНК, методы Рунге-Кутты, метод Адамса, формулы Ньютона-Котеса, метод Ритца, метод Бубнова-Галеркина, метод конечных разностей/элементов, FFT/STFT, сходимость и устойчивость, l-bfgs и другие квазиньютоновские методы, adagrad, PARAFAC, cassowary, interior point methods, вариационные методы для байесовского вывода, nesterov, автоматическое дифференцирование, alternating least squares, what every computer scientist should know about floating point arithmetics by Goldberg, Nocedal & Wright/Boyd & Vandenberghe

Алгоритмы, Кнут-Грэхем-Паташник/Зорич/Винберг, Spivak/Dummit-Foote, математический анализ, линейная алгебра, комплексный анализ, функциональный анализ, дифференциальная геометрия, теория чисел, дифференциальные уравнения/интегральные уравнения/вариационное исчисление/оптимальное управление, производящие функции, ряды, комбинаторика, теория вероятностей/математическая статистика/случайные процессы/теория массового обслуживания, цепи Маркова, интегральные преобразования (Фурье, Лаплас, Вейвлет), NZQRCHOS, матпакеты (Mathematica, Maple), теория категорий

Теория информации, сжатие, Хаффман, RLE, BWT, LZ, коды коррекции ошибок, сжатие с потерями (изображения, аудио, видео), информационная энтропия, формула Шеннона, сложность Колмогорова, maximum entropy problem, kullback-leibler divergence, elias/shannon-elias encoding

Дискретная математика, K2, теорема Поста, схемы, конечные автоматы (ДКА и НДКА), автомат Калашникова, клеточные автоматы

Криптография, Шнайер/Ященко, Принцип Керкгоффса, симметричная (DES, AES), асимметричная (RSA), качество ГПСЧ, алгоритм Диффи-Хеллмана, эллиптические кривые, хэширование (MD5, SHA, CRCn), DHT, криптостойкость, криптоатаки (атака гроссмейстера), WEP/WPA/WPA2 и атаки на них, цифровая подпись и сертификаты, PKI, HTTPS/SSL, доказательство с нулевым разглашением, пороговая схема, murmurhash/cityhash, DKIM

Квантовые вычисления, алгоритм Шора, квантовая криптография

ОБЩИЕ ОСНОВЫ ПРОГРАММИРОВАНИЯ

Мультитредность, обедающие философы, 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, модель акторов, parameter server, RDD (as seen in sparks), downpour SGD, wait-free, stackful vs stackless

Вычислимость, машина Тьюринга, нормальные алгоритмы Маркова, машина Поста, диофантовы уравнения Матиясевича, лямбда-функции Черча, частично рекурсивные функции Клини, комбинаторное программирование Шейнфинкеля, Brainfuck, эквивалентность тьюринговых трясин, проблема останова и самоприменимости, счетность множества вычислимых функций, RAM-машина, алгоритм Тарского, SAT/SMT-солверы, теория формальных систем, interactive proofs, теорема Левина-Кука, 3SAT, PSPACE = NPSPACE,

Алгоритмы и комбинаторная оптимизация, Кормен/Скиена/Седжвик/Кнут/Ахо-Хопкрофт-У льман/Пападимитриу/Шрайвер-Голдберг/Преп арата-Шеймос/e-maxx.ru, структуры данных, алгоритмы, сложность, символика Ландау, теорема Акра-Баззи, time-space tradeoff, классы сложности, NP-полные задачи, КМП, графы и деревья, потоки в сетях, матрица Кирхгофа, деревья поиска (особенно RB-дерево и B-дерево), occlusion detection, куча, хэш-таблицы и идеальный хэш, сети Петри, алгоритм русского крестьянина, метод Карацубы и матричное умножение Винограда-Штрассена, сортировки, жадные алгоритмы и матроиды, динамическое программирование, линейное программирование, diff-алгоритмы, рандомизированные алгоритмы и алгоритмы нечеткого поиска, псевдослучайные числа, нечеткая логика, gusfield (suffix tree, string alignment), motif search, scanning line, cache oblivious, funnel sorting, VEB-layout, корневая оптимизация, алгоритмы для динамических графов, модели вычисления (RAM-machine/pointer machine/decision trees и т.д.), алгоритмы в иерархиях памяти/стриминговые алгоритмы, time forward processing, range & rank, LSM-trees, buffered a-b-trees, toku trees, персистентные структуры, succint-структуры, lossy-струтуры (bloom/bloomier filter, hash-tables with false positives), locality sensitive hashing, space-time tradeoff в хэш-таблицах, scheduling strategies

Машинное обучение, Тибширани/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, (ME)HMM, CRF, label bias problem, stacked NN, LeToR, factorization machines, autoencoders, RNN/CNN, вместо NLP лучше отдельные задачи (language modelling, co-reference detection, text chunking, POS-tagging, probabilistic parsing, statistical machine translation, misspell correction, question answering, NER, collocation detection, text summarization, speech recognition, fact extraction, sentiment analysis), эффективное вычисление softmax, feature engineering/selection, quality estimation, Manning/Jurafsky/McCallum/Koehn, latent topics (LDA, chineese restaurant, pLSI), parallel coordinates, vowpal wabbit, NLTK, structured learning, EM-алгоритм, contrastive divergence, optimal brain surgery, belief propagation, semi-supervised learning, inductive vs transductive learning, kernel trick, discriminative/generative pairs (as seen by Ng & Jordan), sequence to sequence learning, bagging, анализ социальных графов, рекомендательные системы/collaborative filtering, multimodal learning

ОБЩИЕ ПРИНЦИПЫ НАПИСАНИЯ ПРОГРАММ

Архитектура и стиль кода, Макконнелл/Фаулер/Лебланк/Гамма/Александ реску-Саттер/Буч, защитное программирование, паттерны, SOLID/GRASP/KISS DRY SPOT/YAGNI, UML, OOP (Smalltalk), OOD/OOA, метрики кода, uncle Bob

Методологии разработки, Waterfall/RUP/Agile/Scrum/Kanban/XP, TDD/BDD, CASE

Инструментальные средства разработки, 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)

Фреймворки, Qt, moc и метаинформация, концепция слот-сигнал, Саммерфилд-Бланшет/Шлее, PoCo, промышленные библиотеки: GMP, i18n, lapack, fftw, pcre

Проектирование GUI и представление информации, Раскин/Тафти, юзабилити, основы дизайна и типографики, закон Фиттса, основы верстки, LaTeX, алгоритмы визуализации данных (as seen in d3), subpixel rendering

Тестирование, юнит-тесты, функциональное, нагрузочное, интеграционное тестирование, тестирование UI, mocks/stubs/spies, fixture, запахи и паттерны тестов (Osherove/Meszaros)

ЯЗЫКИ ПРОГРАММИРОВАНИЯ

Общее представление об языках программирования, грамматики, иерархия Хомского, теорема Майхилла-Нероуда, лемма о накачке и лемма Огдена, алгебра Клини, НДКА → ДКА, алгоритмически неразрешимые задачи в формальных языках, Драгонбук, Фридл, регекспы и их сложность, 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, on-stack replacement, type checking/type inference алгоритмы, CYK parser, advanced compiler design and implementation by Muchnick

Язык ассемблера, Зубков/Хайд/Дреппер/Касперски/Фог/Абраш, 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

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, GotW, Meyer"s singleton, cppgm

Компиляторы С++, особенности реализации стандарта, ограничения реализации, интринсики, отличия стандартных библиотек (контейнеры, rand), ABI, реализация виртуальных функций, виртуального наследования, исключений, RTTI, switch, указателей на функции и методы; оптимизации, copy elision (RVO, NRVO), sizeof на различных платформах, дефайны компилятора и среды, __declspec, ключи компилятора, empty-base optimization, статическая и динамическая линковка, манглинг, распределенная компиляция, precompiled header, single compilation unit, (strict) aliasing/restrict, inline/_forceinline, volatile, быстрое вычисление математических функций через битхаки, linkers & loaders by Levine

Прикладное программирование, C#/F#, Шилдт/Троелсен/Рихтер, генерики, yield, linq/plinq, рефлексия, AST, WCF, WinForms/WPF/Silverlight, AOP, фреймворки логгирования, .NET assembly, Scala, Хорстманн/Одерски, pattern matching, макросы/квазицитаты

Функциональное программирование, Haskell/Ocaml/Scheme/Alice или Oz, SICP/TaPL/YAHT/Purely Functional Data Structures/Харрисон-Филд, HOF (map/fold/filter), система типов Хиндли-Милнера, монады, тайпклассы, АТД, dependent types, ленивость/энергичность, логическое программирование (Prolog или Mercury), конкурентное программирование (Erlang или Oz)

Веб-программирование и скриптовые языки, Фланаган/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 MV*, JavaScript/jQuery/React/Google Closure/ExtJS/node.js, ООП в JavaScript, HTML5, CSS3/табличная и блочная верстка, RSS, canvas/WebGL, Ajax/WebSockets, вопросы безопасности (XSS, SQL injection, CSRF), highload, C10k problem, SWIG, CDN, shadow DOM, квирки браузеров, real time bidding/trading, anomaly detection, архитектура single page apps, устройство веб-краулеров, web/social graph random walk, asm.js и компиляция в js, v8/spidermonkey internals, PaaS/IaaS, SPDY

БАЗЫ ДАННЫХ

Базы данных/Распределенные системы, Грубер/Дейт, ANSI SQL, T-SQL, ODBC, MySQL/PostgreSQL/MS SQL/BDB/SQLite/Sphinx, хранимые процедуры, триггеры, алгебра Кодда/А, Tutorial D, нормальные формы, оптимизация и выполнение запросов, структуры данных индексов, транзакции и ACID, CAP-теорема Брюера, graph DB, document store, wide column store, key-value storage, теория распределенных систем, CRDT, net split проблема, протоколы консенсуса, теория шардинга/репликации, ORM (C++ ODB), ERD, OLAP, семантическая сеть, triplestore, RDF/Turtle, SPARQL, OWL, Semanticscience Integrated Ontology, reasoner, DBpedia, big table/hbase vs. dynamodb/cassandra/riak, 2/3PC, chubby/zoo keeper, leader election (paxos/raft), hdfs/gfs/glusterfs, deduplication problem, causality detection (vector clock/stamps), R/W quorum, load balancing, устройство индексов поисковых систем, event sourcing, CRDT, дизайн протоколов и принципы коммуникации, с точки зрения эволюции, расширяемости, надежности, дизайн программных интерфейсов (API)

ОПЕРАЦИОННЫЕ СИСТЕМЫ

Операционные системы, Silberschatz/Рихтер/Соломон-Руссинович/Р обачевский/Вахалия/Стивенс/Таненбаум/Lov e/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, TRIM

Форматы, 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-строк, base64, markdown

Компонентно-ориентированные модели, Роджерсон/Таварес, COM/OLE/ActiveX/COM+/DCOM RPC, ATL, апартменты, моникеры, MIDL, XPCOM, CORBA, TAO, D-Bus

Сеть, Стивенс, 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

АППАРАТНОЕ ОБЕСПЕЧЕНИЕ

Аппаратное обеспечение, Хоровиц-Хилл/Титце-Шенк, полупроводниковая электроника/спинтроника/фотоника, транзистор, триггер, схемотехника, микрокод, технология создания процессоров, 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

Процессоры, конвейеризация, hyper-threading, алгоритм Томасуло, спекулятивное исполнение, static/dynamic branch prediction, префетчинг, множественный ассоциативный кэш, кэш-линия/кэш-промах, такты, кольца защиты, память в мультипроцессорных системах (SMP/NUMA), тайминг памяти, intel optimization manuals, performance counters
___________________________________

Ну как, впечатляет?Интересно, есть в мире хоть ОДИН ЧЕЛОВЕК, который реально все это знает?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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







2024 © gtavrl.ru.