Computer Science или что должен знать программист?
Программисты бывают разные. Мобильные разработчики на Kotlin и Swift, веб-программисты, использующие PHP, Python, Ruby, хардкорные электронщики на Си и Assembler. Главным их отличием является сфера, в которой они работают и используемый язык. Однако не редки случаи, когда, например, веб-разработчики уходят в mobile, электронщики в gamedev и т.д. А конкретно язык программирования вообще можно переучить за пару месяцев. Пропорции условны, а границы размыты. Языки и технологии меняются, и если всё так подвижно и непостоянно, что же объединяет всех этих людей? А объединяет их умение программировать в целом, не зависимо от языка, платформы и технологии. и знание английского языка, пока не поздно учи английский (вставка из «Криминальное чтиво»)
Умение же программировать складывает из практического навыка написания программ и теоретической базы из различных областей Computer Science. Какие алгоритмы нужно знать программисту, нужно ли ему разбираться в компьютерах, системах счисления, делить в уме столбиком и что вообще должен знать программист в широком смысле этого слова. На эти вопросы вам сегодня постарается ответить Макс — один из автора YouTube-канала PyLounge. Поехали!
Скажем так, Computer Science — это наука, объединяющая в себе различные области знаний, которые будут полезны специалисту, работающему с компьютерами и вычислениями. В общем-то это знания, которые пригодятся программисту. Самые необходимые из них, те, которые встречаются на практике постоянно я сейчас максимально кратко и перечислю.
Алгоритмизация (в целом). Суть в том, что не нужно заучивать реализацию чужих алгоритмов, а стараться развивать своё алгоритмическое мышление, чтобы ты сам мог составлять алгоритмы. Декомпозировать задачу и выявлять нужную последовательность действий. Развить эти навыки можно решая задачи и разбирая готовые алгоритмы, а не заучивая их. Кстати у нас на канале есть ролик «Как решать задачи по программированию». Ознакомьтесь, если интересно.
Оценка сложности алгоритмов. Да, да. Это то самое большое О. Кроме него есть ещё Тета и Омега, но в принципе можно обойтись и просто О-большим. Действительно важно хотя бы примерно прикидывать временную сложность алгоритма. Нужно понимать какой участок кода тормозит всё твою программу, почему O(n^2) хуже, чем O(n*log(n)), как следует переделать код чтобы добиться этого O(n*log(n)) и почему вот так лучше вообще не делать.
Это поможет вам писать нормально работящий код, который не будет решать 5 секундную задачу 15 минут на разогнанном I9. Сейчас уже недостаточно просто уметь решать задачу. Нужно уметь её решать максимально эффективным образом.
Кодировки — UTF-8, Windows-1251, ASCII и т.д. Очень многие программисты мучаются с различными проблемами, связанными с кодировками. Поэтому ориентируясь в этом хотя бы на минимальном базовом уровне, вы знатно облегчите себе жизнь.
Парадигмы программирования. Что такое объектно-ориентированное, функциональное, логическое программирование. Чем они отличаются, их преимущества и недостатки. Это поможет тебе выбрать наиболее подходящий инструмент и подход для максимально эффективного решения твоей задачи. Потому что язык и технология это в первую очередь просто инструменты, которые надо уметь грамотно выбирать под советующую работу.
Техники и приемы программирование. Стоит ознакомиться с понятием рекурсии, мемоизации, динамического, линейного программирования и тому подобного. А также понимать, что, где и когда (вставка Что, Где, Когда) лучше применять. Это поможет сделать твой код гораздо эффективнее и качественнее.
Архитектура компьютера. Хотя бы примерно понимать, что такое память в компьютере, зачем нужна, какая быстрее и т.д. Почему копировать объект 1000 раз не самая лучшая идея, зачем нужно кешировать информацию и т.д. Также неплохо бы разобраться в особенности вычислений процессором, видеокартой. Как грамотно распоряжаться программными ресурсами. Да и вообще полезно знать, как и что там работает в этой коробке под столом.
Ориентироваться в структурах данных. Списки, деревья, очереди и т.д. Просто зачем нужна каждая структура, какие, когда эффективнее использовать. Вот необходимо на проекте решить какую-то задачу, а ты такой «О, чем-то это задача похоже на историю с графами». Есть зацепка, начинаешь гуглить графы, алгоритмы решения задач на графах, библиотеки для этого. Поверь, твоя жизнь станет сильно легче, если конфиг настроек для бота ты будешь хранить в словаре, а не в массиве. Опять-таки, тебе не нужно уметь с нуля собственными руками реализовывать этот словарь, хеш-таблицу (хотя можно, ничего неподъёмного там нет). Просто надо знать, что она существует и когда обычно её применяют.
Базы данных. Для backend’деров это отче наш. SQL, запросы, таблицы, связи один ко многим, 1 к 1, многие ко многим, миграции. Что такое реляционные базы, не реляционные. Где лучше какие применять и почему. Это тот раздел, без которого точно не обойтись.
Архитектура программного обеспечения. Ранее я упоминал, что недостаточно чтобы программа просто работала. Она должна работать эффективно. Эффективно не только в плане производительности. Важно уметь писать код качественно, чтобы его было легко сопровождать, расширять. Серьёзное программирование это сложный итеративный процесс, зачастую комодный. Поэтому качественно спроектированная программа сделает вашу жизнь и жизнь других разработчиков лучше. Тут приходится понимание построение архитектуры ПО и грамотное использование паттернов (шаблонов) проектирование (GoF, GRASP, Enterprise). Кроме того, не мешало бы овладеть общепринятыми практиками (SOLID, KISS, DRY и т.д.)
Устройство Сети. Весь мир потихоньку переезжает в онлайн. Поэтому было бы неплохо разбираться в том, как работает Интернет. Опять-таки на базовом уровне. Что такое протоколы, сокеты, DNS, IP-адреса, зачем оно всё нужно и как между собой взаимодействует.
Важная заметка. Математика, в частности логика, комбинаторика, дискретка тоже входит в Computer Science. Поэтому коротко. Математика — круто. Математика точно нужна, но не всем и не всегда. Вообще математика для программиста эта тема довольно обширная и холиварная, заслуживающая отдельного обстоятельного разговора. Поэтому сюда я её включать не стал. Однако держу в курсе.
Best practice. Наверное, Не совсем про Computer Science. Но мне кажется, необходимо ознакомиться как принято писать код именно на вашем языке/стеке. Программирование есть программирование. Но согласитесь, в каждом омуте водятся свои черти. Поэтому будьте добры играть по их правилам или не играть вовсе.
Под конец я очень хочу порекомендовать ознакомиться с книжкой Феррейра Фило «Теоретический минимум по Computer Science». Она коротенькая, но даёт отличное общее понимание всего того, что тебе пригодится (и не отправит начинающего в психушку, как, например, труды Кнута). В том числе в этой книге есть и совсем немного про тот самый матан. Настоятельно призываю ознакомиться. Опытных вряд ли заинтересует, а для новичков самое то.
Как ты понял не нужно идеально всё знать наизусть. Достаточно разбираться в базовых понятиях, принципах и понимать, что, когда применять. Если ты понимаешь, что тебе нужно, но недостаточно глубоко знаешь это, всегда можно заглянуть в Интернет или справочник, спросить у кого-то. Когда ты выберешь специализацию, то будешь уже разбираться отдельных веща непосредственно на деле, когда коснёшься этого, предметно. Например, если решишь программировать ядро Linux, будешь подтягивать знания ОС и т.д.
Базовое понимание — это твой скелет. На которой в последствии ты будешь наращивать мясо из тонкостей, деталей и специфики.
Если я упустил что-то важное из виду, то обязательно напиши об этом в комментариях.
В некотором смысле программирование похоже на рисование. Сначала у вас есть только чистый холст и материалы. Нужно использовать сочетание науки, искусства и ремесла, чтобы определить, что со всем этим делать. (с) Эндрю Хант (Andrew Hunt)
P.S. Есть также видеоверсия данной статьи. Кому интересно, welcome на YouTube.
3 блока базовых навыков, без которых вы не сможете работать программистом
К 2020 стало понятно, что хорошие программные продукты создаются в командах. Случаи, когда весь код написал один очень умный разработчик, скорее исключение, подтверждающее правило.
Чтобы успешно работать в команде, нужно уметь не только писать код. Мы пообщались со многими программистами и поняли, какие навыки нужны на работе всегда, независимо от языка программирования и предметной области создаваемых продуктов. В статье расскажем про эти три блока навыков. Они вам точно пригодятся, чтобы получить хороший оффер и быстро вписаться в коллектив.
Не важно, на каком языке вы пишете код, вам понадобятся эти навыки, hard skills. Вы пользуетесь ими ежедневно и, если вы решите сменить язык программирования, компанию или предметную область, базовые навыки помогут вам сильно сократить время обучения и адаптации. К ним относятся:
- знание базовых алгоритмов,
- опыт использования документации,
- умение отлаживать код,
- понимание абстрактных типов данных,
- понимание принципов работы операционных систем,
- понимание принципов построения инфраструктуры современной разработки,
- понимание общей модели протоколов передачи данных.
Систему контроля версий использует ежедневно каждый хороший программист. Так вышло, что Git стал почти что монополистом среди систем контроля версий, большинство команд предпочитают именно его. Использование моделей, построенных на функциях GIt стало стандартом в командной разработке и гарантирует то, что репозитории у членов команды будут одинаковыми, а проблем с версиями не возникнет.
Ветвление в Git позволяет организовать гибкую разработку любой команде. Знание Git и умение работать с ветками — это то, о чем у вас обязательно спросят на собеседовании, если разработкой в компании занимается больше 1 человека.
Если вы хотите быстро освоить Git, можно пройти практический видеокурс.
Для программистов софт-скиллы немного отличаются от традиционного представления о мягких навыках. Но стандартные пункты тоже никто не отменял:
- развитый эмоциональный интеллект,
- стремление развиваться и совершенствоваться,
- умение постоянно учиться и обучать,
- навыки презентации (да-да, нужно уметь представлять своё видение решение задач в проекте, а не бездумно выполнять задачки).
К тем гибким навыкам, которые особенно важны в разработке, относят:
Это скорее не про доброжелательность и позитивную атмосферу, хотя и без этого не обойтись, а про навык аргументировано доносить свое мнение до коллег, способность воспринимать и готовность давать обратную связь. Про эффективную коммуникацию.
Как с технической стороны, так и для бизнеса. Помните о том, что вы занимаетесь коммерческой разработкой.
Если вы способны объяснить жене, ребенку и бабушке, что такое спринты, чем занимается скрам-мастер и с какими запросами product owner приходит в скрам-команду, вам будет легко освоиться в очень многих компаниях.
Будут моменты, когда вы будете разочарованы в проекте или себе как специалисте. Это нормально. Главное, относиться к этому спокойно и понимать, что это только период.
Каждый программист будет на порядок лучше выполнять свою работу, если будет знать, как его код и функциональность, которую он разрабатывает, выполняют поставленные задачи, какую проблему для пользователей и компании в целом решает программный продукт. Знание предметной области программного продукта сильно отличает посредственных программистов от отличных программистов. Очевидно, что именно отличные программисты разбираются в предметной области, будь то медицина, транспорт или ритейл.
Если в вашем арсенале уверенные навыки программирования, знание Git и развитые софт-скиллы, вы сможете выбрать оффер с высокой оплатой и команду разработки, в которой будет комфортно и интересно. Современным быстроразвивающимся компаниям нужны не просто наборщики кода, а специалисты, которые принимают решения и реализуют функциональность, учитывая огромный набор аспектов, начиная от инфраструктуры, в которой создается код, заканчивая предметной областью конечного продукта. Чтобы было понятнее: чем лучше программист, тем больше «переменных» он держит в голове во время работы.