Компьютерные науки: описание, особенности, изучение
Развитие человечества привело к тому, что пользователи начали изобретать и осваивать совершенно новые технологии. Вместе с ними появились науки и профессии, которых раньше не было. Яркий пример тому – Computer Sciences.
Немногим понятно, кто это вообще такие. Относительно новое и перспективное направление, которое рекомендуется изучать программерам, разработчикам, а также вообще всем, кто в той или иной степени заинтересован в компьютерах и IT-технологиях. В статье будет рассказано о соответствующем направлении более подробно. В конце каждый разберется, стоит ли браться за него, и как изучить в должной степени.
Определение
Computer Science – перспективное направление современного обучения, тесно связанное с IT-технологиями. Представляет собой совокупность практических и теоретических данных, используемых специалистами при создании и задействовании:
- информационных систем;
- баз данных;
- разнообразных технологий;
- вычислительной техники.
Сюда также относят программирование. Впервые в качестве относящейся к computers возникла в 20 веке (30-е годы). Образовалась область посредством объединения математической логики и созданием компьютеров.
Говоря простыми словами, Computer Science – все то, что относится к современной «вычислительной технике». Для большинства иностранцев ассоциируется со специальными курсами или направлением обучения в ВУЗе.
Для чего необходимо
Computing Courses по упомянутому направлению в основном проходят программисты – как новички, так и опытные специалисты. Их разделяются на несколько категорий:
- Тех, кто собственными силами хотел окунуться в мир IT и изучил языки программирования. Обычно – один из них. Далее обучение прекратилось.
- Тех, кто осознает, что в современном мире прогресс и развитие держится на АйТи-технологиях, которые непрестанно совершенствуются. Такие люди не сидят на месте, постоянно изучают что-то новое. Они хорошо разбираются в Computer Science. Способны придумывать нестандартные решения тех или иных задач.
В первом случае работников нельзя назвать лентяями – они просто занимаются «стандартными» обязанностями. Такие лица прекрасно подходят для решения типовых задач и написания элементарных приложений.
Второй вариант – более системный. Подобные спецы готовы заниматься разработкой инновационного программного обеспечения. Работники делают разнообразные утилиты для бизнеса, совершенствуя его с минимальными затратами. Обеспечено полноценно и постоянное развитие.
Стоит обратить внимание еще и на то, что Computer Science – это еще и весьма перспективное высокооплачиваемое направление. Подчиненные в выбранной области получают не только самосовершенствование и бесценные знания, но и достойный заработок.
Это science требуется изучить, так как технологический прогресс с каждым годом занимает все больше места в обыденной жизни. Без элементарных познаний в упомянутом направлении совсем скоро будет не обойтись.
Направления
Если человек решил самостоятельно, или посетив специализированные курсы, освоить рассматриваемую область, придется понять, что она в себя включает. На самом деле науки технологического характера состоят из многочисленных сфер. Освоить все сразу и в полном объеме невозможно. Поэтому приходится выбирать область деятельности.
На сегодня Компьютерная Science преимущественно подразумевает следующие варианты развития событий:
- программирование;
- архитектура компьютера (электронно-вычислительных машин);
- алгоритмы и структуры данных;
- математика для IT и computer science;
- операционные системы;
- компьютерные сети;
- базы данных;
- языки программирования и компиляторы;
- распределенные системы;
- графика;
- искусственный интеллект.
Если описать направленности кратко, это – написание программных кодификаций, а также информатика и математика. Но изучаемая информация выходит за пределы «стандартного» школьного и ВУЗовского обучения.
Programming
То, с чего начинают многие. Принципы написания программных кодов – основополагающая всех информационных технологий. Здесь вариантов воплощения задумки в жизнь несколько:
- Пойти обучаться в ВУЗ после 11 классов в школе. Отнимает от 5 лет, зато в процессе удается стать настоящим специалистом с дипломом государственного образца.
- Отдать предпочтение получению образования в техникуме/колледже после 9/11 классов. Человек здесь больше практикуется. По выпуску получает диплом о средне профессиональном образовании.
- Заниматься самообучением. Неплохой вариант для тех, кто еще не определился, стоит ли вообще связываться с IT-технологиями. Требует усидчивости и долгого кропотливого труда. Стать настоящим профессионалом в области написания кодов можно и без «вышки».
Последний вариант – это посещение Computer Science курсов. Есть варианты как для новичков, так и для уже более опытных людей. По окончании процесса выдается спецсертификат.
Внимание: все перечисленные методы получения знаний относительно программирования подходят и для остальных сфер. Но иногда добиться успеха без ВУЗа или техникума окажется предельно трудно.
Архитектура электронно-вычислительной техники
Может называться как «компьютерные системы» или «организация computers». Важный раздел, характеризующий принципы функционирования аппаратуры. Речь идет о слое, находящимся «под» программным обеспечением. Инженеры-самоучки не слишком уважают архитектуру ЭВМ, хотя она крайне важна.
Для того, чтобы разобраться в области самостоятельно, можно прочесть книгу «The elements of Computing Systems». Позволяет осознать, каким образом функционирует computer. Здесь есть:
- иерархия памяти;
- вычислительный конвейер;
- написание логики на языке описания аппаратов (HGL) посредством центрального процессора.
После изучения соответствующей литературы удастся намного лучше ориентироваться в архитектуре ЭВМ. Далее теорию обычно изучают посредством спецкурсов.
Алгоритмы и структуры
В компьютерных науках не обойтись без алгоритмов и структур информации. Область служит одной из основополагающих. Помогает потренироваться в решении разнообразных задач, необходимых в выбранной специализации.
Практика показывает, что алгоритмы и структуры «материалов» изучаются через:
- специализированную литературу (электронную или бумажную);
- обучающие видеоролики;
- спец course.
В ВУЗах соответствующий раздел изучается, но не слишком углубленно. Получаемых знаний достаточно на первых порах, но затем приходится «ударяться» в самообразование.
Дела математические
В компьютерных науках невозможно обойтись без разного рода вычислений. Все, что связано с computers, можно отнести в той или иной степени к прикладной математике. Хороший программер или «комп.ученый» не оставит math в стороне. В один прекрасный момент решение поставленных задач, особенно при разработке сложного контента, отсутствие достаточного багажа знаний станет огромной проблемой.
Математиков, занятых углубленным изучением «дискретики», ждет успех в случае смены специализации в пользу IT-технологий. Связано это с тем, что компнауки относятся преимущественно к дискретной математике. Выходят они далеко за пределы матанализа.
Также рекомендуется изучать:
- комбинаторику;
- основы логики;
- теорию вероятности;
- графы;
- криптографию (основы);
- линейную алгебру.
Последняя особо важна для тех, кто предпочтет в будущем сконцентрироваться на графике и видео, а также машинном обучении. Математика для Computer Science – главный «раздел».
Операционные системы
Каждый современный юзер точно знает – операционных систем у ПК и других устройств полно. Каждое «системное программное обеспечение» обладает собственным функционалом, особенностями и интерфейсом. Чтобы стать настоящим специалистом в компьютерах, стоит изучать все ОС. Либо выбрать одну «специализацию», в которой совершенствоваться далее.
В соответствующей «категории» предстоит узнать о принципах работы ОС, а также об их видах. Лучше действовать путем прохождения курсов (можно дистанционно). Вариантов полно – как для новичков, так и для продвинутых «ученых».
При самообразовании идеально прочесть код маленького ядра, после чего откорректировать его. Пример – XV6. Это – современная интерпретация Unix x86, которая написана на ANSI C.
Сети
Программеры работают преимущественно с веб-серверами и компьютерными сетями. Значит, упомянутую сферу обделять вниманием нельзя. Она расскажет о:
- принципах работы сетей;
- разновидностях «подключений»;
- настройке и отладке сетей.
Самоучкам рекомендуется прочесть книгу Computer Networking: A Top-Down Approach. Там не только теория, но и практика – небольшие проекты и задания.
Базы данных
База данных – совокупность информации, которая организована в концептуальную структуру, описывающую особенности соответствующих материалов и их взаимоотношения. Простыми словами – некое хранилище электронных сведений. Используются БД повсеместно – не только в программировании и IT, но и в обыденной жизни: экономика, бухгалтерия, юриспруденция. Даже при работе с 1C требуется знания баз данных.
В ВУЗах этому разделу уделяется достаточно времени как у «компьютерщиков», так и у математиков/экономистов/программистов. Но лучше посетить курсы по базам данных, чтобы получить максимально много полезной информации.
Компиляторы и языки
Программеры занимаются непосредственным изучением языков «общения» с компьютерами и приложениями. А вот работники компьютерных наук стараются разобраться в принципах работы оных. Соответствующие познания помогают обойти даже опытных разрабов. Схватывание нового материала будет максимальным и быстрым.
Данная область затрагивает:
- принципы функционирования языков при создании машинных кодификаций;
- программы, используемые при кодировании и эмуляции;
- особенности компиляторов.
Своими силами здесь обойтись проблематично.
Распределенные системы
Распределенной системой называют некую систему, в которой отношения местоположения составляющих или их групп играют важную роль для дальнейшего функционирования. С развитием прогресса и IT даже самые простые приложения способны функционировать на нескольких computers одновременно. Распределенные системы являются наукой о том, как обеспечить подобное явление.
Для изучения Science соответствующей области требуется просмотреть книгу Distributed Systems. Лучше пробежать глазами по всем изданиям. 3-е – это своеобразное дополнение к предыдущим.
С чего начать
Новички в Москве и других регионах часто задумываются над тем, с чего же начать изучение компьютерных наук. И как вообще подойти к решению поставленного вопроса комплексно, чтобы ничего важного не упустить.
Для этого рекомендуется:
- определиться с направлением – начинать лучше «с малого» (основы информатики);
- подготовить соответствующую литературу;
- выяснить мотивы выбора профессии IT Science (если это только заработок – ничего не получится);
- изучить имеющиеся в доступе уроки и литературу.
Но для полноценного образования стоит присмотреться к специализированным курсам. Есть как всеобъемлющее звено «Компьютерные науки», так и различные направленности упомянутой области. Главное помнить – изучить computer и его принципы работы не так-то просто. Это долгий и весьма энергозатратный процесс. Но, если постараться, все обязательно получится.
Хотите освоить современные компьютерные науки? Огромный выбор курсов по востребованным IT-направлениям есть в Otus !
Программирование в науке: полувековое легаси и Fortran 77
Александр Нозик, физик и программист, руководитель Nuclear Physics Methods Laboratory в JetBrains Research, заместитель заведующего Лабораторией методов ядерно-физических экспериментов и магистерской программой в МФТИ — о том, как перевести научный код на современный стек и почему в науку тяжело внедрять новые инструменты. Статья написана на основе выпуска подкаста «Люди и код» от Skillbox (декабрь 2021 года).
— Александр, расскажите, чем занимаетесь и какие задачи решаете?
— Моё основное место работы — Московский физико-технический институт (МФТИ), также известный как Физтех. Помимо этого, я работаю в Институте ядерных исследований РАН и JetBrains Research — это сообщество лабораторий, связанных с JetBrains. Компания поддерживает лаборатории и таким образом собирает вокруг себя научное сообщество.
Я занимаюсь физикой нейтрино, это основное направление моей научной деятельности. Но в последние годы больше разрабатываю софт и библиотеки для научных исследований.
— Чем наука отличается от коммерческой разработки с точки зрения задач? Как это влияет на выбор инструментов и языков программирования?
— Наука всегда была и остаётся «быстрее, выше, сильнее» остальных сфер. Учёные часто решают те же задачи, что и в коммерческой разработке, но на гораздо большем масштабе. Вспомним интернет-протокол HTTP: изначально его создавали, чтобы научные центры могли обмениваться большими объёмами данных. В одном из коридоров ЦЕРНа даже висит табличка: «В этой комнате придумали интернет».
В экспериментах по ускорению частиц на Большом адронном коллайдере, если мне не изменяет память, генерируется 25 ГБ данных в минуту. Для коммерческих проектов это просто непостижимо. Мы работаем с такими объёмами данных, которых больше нигде нет.
Анализ данных и так называемый Data Science уже стали частью промышленности. «Так называемый», потому что до сих пор нет чёткого определения, что это за наука такая. Тем не менее всю методологию и новые инструменты разрабатывают учёные, потому что только они могут оперировать сложными математическими моделями.
Важная особенность науки в том, что в ней очень мало профессиональных программистов. Поэтому инструменты, которые используют учёные, должны быть не только самыми гибкими и быстрыми, но и простыми. Иначе учёные-непрограммисты, такого наваяют, что потом никто не сможет это разобрать. Собственно, нечто подобное уже случилось в физике, и теперь научное сообщество решает эту проблему.
Дело в том, что физики пишут вычислительный код на C++, а потом оборачивают его в код на Python. И мне кажется, этот подход себя изжил: на Python очень сложно поддерживать большую кодовую базу, а тут размеры проектов растут именно на стороне пользователей кода — учёных. Поэтому такие системы потихоньку рассыпаются и последние пять лет инженеры и учёные ищут более гибкие и простые альтернативы.
— А в других науках используют такую же связку языков?
— Да, везде примерно то же самое, но с небольшой разницей. Например, биоинформатика как отдельная область появилась относительно недавно. В отличие от физиков, которым пришлось «пересаживаться» на Python, там сразу стали работать на современных языках. Но в большинстве наук всё ещё используют библиотеки C, Fortran и С++, а над ними пишут надстройку на Python. И там сейчас те же самые проблемы с гибкостью.
Кроме Python в разных областях науки пишут или пытались писать на других языках.
R. Его используют в статистике. Это узкоспециализированный язык, который отлично подходит для решения статистических задач. Но часто нам надо не только получить данные, но и сделать веб-сервис, чтобы пользователь имел доступ к этим данным. Написать его на R — дело непростое.
Julia. Это довольно интересный язык со множеством конструктивных особенностей. Попробуйте его, если вам не хватает скорости или гибкости в Python. Хотя и у Julia есть недостаток: его набор инструментов всё ещё нестабильный.
Julia придумали как альтернативу Python и MATLAB. Последний до сих пор используют, но это проприетарная, «неживая» система. Как только вы выходите за рамки привычных задач, то сразу ощущаете его ограниченность.
Swift. Из Swift тоже пытались сделать универсальный язык, но он так и не вышел за рамки iOS. А потом появился Kotlin, который по синтаксису сильно напоминает Swift, но при этом подходит для решения более широкого спектра задач и позволяет работать с библиотеками из Java, JavaScript и C.
Java. Раньше я программировал на Java — это классный язык, который часто несправедливо ругают. Его создавали для энтерпрайза, поэтому там чересчур затянутая «церемония»: чтобы собрать простое приложение, надо написать много дополнительного кода. Да, это упрощает поддержку и повышает стабильность приложения, но сильно усложняет сам процесс программирования.
Kotlin. Сейчас я много пишу на Kotlin. Он обладает достоинствами Java, но избавляет программиста от доброй половины «церемоний», и потому, на мой взгляд, у него большие перспективы.
Какие основные проблемы в научном IT и как их пытаются решить
— Вы упомянули, что в науке было много всего наворочено. Интересно, это относится только к библиотекам на Fortran и С++ или к чему-то ещё? И в чём там главные проблемы?
— Это очень большая проблема, которую нам ещё долго предстоит разгребать. Дело в том, что однажды разработка превратилась в отдельную профессиональную область. 40 лет назад, когда программирование только зарождалось, физики были самыми крутыми программистами. Они работали на здоровенных машинах размером со шкаф, и всем всё было понятно. Но 15–20 лет назад оказалось, что software engineering — это самостоятельная инженерная область.
Учёные сильно отстали, потому что продолжали разрабатывать ПО в том же стиле, в котором делали это на допотопных мейнфреймах. Они придумывали замечательные алгоритмы, но совсем не думали о поддержке кода, тестировании, CI/CD и тем более об архитектуре.
Например, системы сбора данных совершенно не умеют взаимодействовать друг с другом. Их писали разные программисты, которые иногда специально делали так, чтобы системы не могли общаться между собой. Если два эксперимента выполнены на разных системах, то учёному придётся обрабатывать их результаты по отдельности. Более того, на изучение каждой системы может уйти несколько лет — настолько они сложные.
Из-за того, что в науке не внедряли современные подходы к проектированию ПО и не использовали новые инструменты, у нас накопились миллионы строк легаси. Там можно встретить хорошие и даже гениальные алгоритмы, но понять их будет практически невозможно. Чтобы почувствовать всю боль, найдите программу на Fortran 77 и попробуйте понять, что там происходит.
Для справки: в Fortran 77 длина имени переменной ограничена восемью символами. Это значит, что, когда заканчиваются все подходящие имена переменных, программа становится нечитаемой. В ход идут числобуквенные идентификаторы, с которыми код становится только запутанней. А ведь большая часть программ в науке всё ещё написана на Fortran.
Относительно недавно учёные поняли, что нужно инвестировать в software engineering, уделять внимание архитектуре и осваивать современные инструменты, а не городить свои велосипеды. К моему удивлению, за последние два года появилось много групп инженеров, которые целенаправленно продвигают современный подход в науке.
— Расскажите немного, что это за группы и чем они занимаются?
— К ним относятся наша лаборатория в Физтехе и в JetBrains Research. Мы пытались продвигать новый подход в ИЯИ РАН ещё восемь лет назад, но столкнулись с сопротивлением. Нельзя просто прийти к учёным и сказать: «Мы хотим написать новую программу, которая будет делать то же самое, что и ваша старая, только гораздо удобнее». Вам ответят: «А у нас и так всё хорошо работает». И никого не волнует, что 80% своего времени они тратят на совершенно бесполезные вещи. Тем не менее в некоторых отраслях стоимость поддержки становится критичной и научное сообщество обращает на это внимание.
Есть и другие группы. Например, недавно мы познакомились с коллегами из института CASUS Science в Дрездене. Мы тесно сотрудничаем с учёными из «Немецкого электронного синхротрона» (DESY) по фундаментальным и прикладным исследованиям. Ещё геоинформатики в Германии внедряют у себя Big Data, как когда-то это сделали в биоинформатике.
Есть и отдельные инженеры, которых мы знаем по JetBrains Research, в Новосибирске и Петербурге. В ЦЕРНе на Большом адронном коллайдере уже довольно давно работает своя группа. Хотя её основная задача — поддерживать существующие системы, а не разрабатывать новые. ВШЭ и «Яндекс» открыли лабораторию Lambda. Правда, пока они используют только методы machine learning, а software engineering не трогают.
— Такие группы только разрабатывают софт или ещё проповедуют свои идеи, организовывают конференции?
— Сообщество software engineering начало собираться в российской науке совсем недавно. Люди только осознают, что нужно менять инструментарий, и потихоньку разрабатывают свои программы, оглядываясь на других.
Мы с коллегами хотим создать сообщество, чтобы обсуждать насущные проблемы IT в науке и обмениваться идеями. Нас поддерживают учёные из других групп, поэтому думаю, что скоро нас станет гораздо больше.
Ещё важный момент. Софтверные группы при исследовательских центрах и крупных экспериментах действуют уже давно. Но они работают как энтерпрайз: быстро решают конкретную задачу и не думают о развитии направления. А продвигать новые архитектуры, инструменты и подходы надо долго и целенаправленно.
Какие проблемы существуют в обучении учёных программированию
— Наверняка преподаватели старой школы отличаются от аспирантов и молодых учёных 30–35 лет. Кому проще объяснить, что необходим системный подход к инжинирингу и выбору тулинга?
— С молодёжью, конечно, договориться проще. Уже в школах и институтах они знакомятся с разными инструментами и понимают, что многие вещи можно делать иначе. А вот учёные старой школы с большим трудом вылезают из привычной экосистемы. Не то чтобы они этого не хотели – просто не видят путей.
Яркий пример: многие сидят на С++ 11 и даже не подозревают об этом. Причём на самом деле они почти не используют возможности C++ 11, а пишут на С++ 98. Если спросить типичного физика, который говорит: «Я знаю С++», про смарт-пойнтеры (необходимую вещь для менеджмента памяти в современном С++), то, скорее всего, он ничего не расскажет.
Я задаю один и тот же вопрос всем «знатокам»: «Как управлять памятью в С++?» Большинство начинает рассказывать про new, delete и так далее. Но современные программы так не пишут.
Лучше всего, когда у человека есть хотя бы небольшой опыт промышленной разработки. Я имею в виду не работу в фирме, а практику в веб-разработке или других востребованных областях. С такими инженерами уже можно говорить на одном языке.
— Как помогает государство или бизнес? Ведётся ли какая-то целенаправленная работа по технологическому обучению молодых физиков, математиков и биологов?
В этом направлении работают компании, правда пока не очень слаженно. Бизнесу выгодно развивать научное программирование, потому что, как я уже сказал, наука решает самые сложные задачи. Кто-то из науки переходит в коммерческую разработку, и компании с радостью хантят таких специалистов. Таким образом, мы тренируем людей на своих задачах и тестируем инструменты компаний.
На Западе в развитие научного тулинга вкладываются гиганты вроде Microsoft и Google, а в России — JetBrains и «Яндекс». Компании поменьше тоже подтягиваются, но пока не знают, с чего начать. Ведь для этого нужно понимать, как работает образование.
— Вы говорили, что за долгие годы в науке накопилось много легаси-кода. Надо ли его переписывать на современный стек или можно оставить как есть, но при этом сменить прослойку из кода на Python?
— И то и другое. Я думаю, что рано или поздно все библиотеки придётся переписать, потому что прослойка не решает всех проблем. Как только вы захотите поменять что-нибудь внутри — а не бывает такого кода, который никогда не меняется, — вы застрянете из-за бесконечно долгой поддержки.
Конечно, невозможно переписать в одночасье всю кодовую базу, поэтому пока мы работаем с обёрткой там, где это возможно. Сам С++ подкидывает проблем, потому что очень плохо дружит с другими языками, для него невозможно писать удобные прослойки. Поэтому зачастую получается vendor lock — чтобы подключиться к старому коду на С++, новый тоже приходится писать на плюсах. Я думаю, с этой проблемой скоро разберутся, потому что стоимость поддержки старых программ растёт.
— Как, на ваш взгляд, выглядит идеальная модель научной IT-инфраструктуры? Какими должны быть железо и программный стек, какие инструменты должны использоваться?
— На этот вопрос нет однозначного ответа, потому что задачи могут быть разные. Например, иногда нужны суперкомпьютеры. Таких задач немного, но они есть, и в них всё завязано на суперкомпьютерах. В большинстве же случаев достаточно мощности персоналок.
Я думаю, что научная IT-инфраструктура должна как минимум не отставать от коммерческой. Обязательно нужны IDE, автоматическая проверка кода, автоматическое тестирование и continuous integration. Последнюю уже внедрили в большой части проектов, но она ещё не до всех дошла.
Нужно внедрять микросервисную архитектуру, потому что наш огромный «зоопарк» инструментов практически нереально подружить. Они написаны на разных языках и реализуют разные протоколы, поэтому вряд ли получится наладить коммуникацию между ними. Думаю, мы движемся к веб-сервисам, браузерной визуализации и, возможно, к распределённой архитектуре. Сейчас много говорят о распределённых вычислениях и удалённой разработке, но пока такие проекты находятся в пилотной стадии.
Как помочь науке и какие технологии изучать начинающим учёным
— Какие есть опенсорс-проекты по переводу старых библиотек в новые? Работаете ли вы с контрибьюторами и как волонтёрам подключаться к крупным инициативам?
— Да, буквально недавно мы обсуждали несколько таких задач. Недавно Дмитрий Костюнин из Технологического института Карлсруэ (KIT) выступал с докладом о переводе CORSIKA, одной из основных библиотек для моделирования, со старого Fortran на современный С++. Проект полностью открытый, туда приглашают всех, кто умеет программировать.
Есть много легаси-кода, который надо просто почистить, найти в нём узкие места и так далее. Большая часть кодовой базы, к счастью, уже открыта и лежит на GitHub. Можно поискать эти проекты и присоединиться.
Основная проблема с переводом в том, что большая часть задач написана не на программистском языке. Было несколько попыток привлечь профессиональных программистов к научной разработке. Например, ЦЕРН когда-то пытался, но столкнулся с банальной проблемой: программисты не понимают, чего хотят физики, а физики не могут доступно объяснить задачу программистам. Поэтому куда проще применить машинное обучение, для которого вообще ничего понимать не надо. Собственно, в этом главная прелесть machine learning.
Учёные, которые более-менее разбираются в программировании, должны формулировать задачи так, чтобы программисты их понимали. Вообще, у разработчиков большой интерес к нашей области. Ко мне часто обращаются энтузиасты и просят дать какое-нибудь задание.
— А что бы вы посоветовали тем, кто только приходит в науку или уже пришёл, но без нормальной IT-подготовки? Какой минимум нужно освоить, чтобы делать хорошие вещи?
— Развивайте кругозор и знакомьтесь с разными областями программирования. В первую очередь — с веб-разработкой, потому что именно там используют самые современные технологии. Желательно знать, как работают простые веб-проекты и сервисы.
В научном софте много проблем с архитектурой, поэтому полезно посмотреть, как устроены большие проекты и как в них организуются потоки данных. Послушайте доклады с конференций по коммерческой разработке, попробуйте их понять и подумайте, как эти технологии можно применить в вашей деятельности.
Разумеется, в инженерии без опыта ничего не сделаешь. Но вообще, это очень хорошая идея — сделать cheat sheet, как максимально быстро перейти на следующий уровень мастерства.
— Что порекомендуете почитать по этой теме? На кого подписаться, за кем следить?
— Первое, что рекомендую, — подписаться на JetBrains Research. У них есть материалы о computer science и натуральных науках на русском языке, а в Telegram можно найти инвайты на семинары в Zoom.
ЦЕРН регулярно выпускает доклады по software engineering. Но я не особо за ними слежу, потому что там не столько рассказывают о новых разработках, сколько переосмысливают сделанное.
Computer Science
Computer Science, или компьютерные науки, — это наука о методах и процессах сбора, хранения, обработки, передачи, анализа и оценки информации с использованием компьютерных технологий, которые обеспечивают возможность ее применения для принятия решений. В России Computer Science называют информатикой, но могут употреблять этот термин по-разному в зависимости от контекста.

Освойте профессию «Data Scientist»
Существуют схожие области, например, наука о данных или программная инженерия. Некоторые из них можно считать частью Computer Science, но разница в терминах все же есть: компьютерные науки — более широкое понятие. Они изучают компьютерные технологии и представление информации в целом, а не отдельные сферы, такие как разработка.
Для глубокого понимания Computer Science нужен хороший математический аппарат. В отличие от многих прикладных IT-направлений, эта сфера сильно связана с математикой. Компьютерные науки могут изучать в высших учебных заведениях на технических специальностях, посвященных информационным технологиям. Но осваивать их можно и самостоятельно.
Профессия / 24 месяца
Data Scientist
Дата-сайентисты решают поистине амбициозные задачи. Научитесь создавать искусственный интеллект, обучать нейронные сети, менять мир и при этом хорошо зарабатывать. Программа рассчитана на новичков и плавно введет вас в Data Science.

Кто пользуется Computer Science
- Разработчики, в особенности высокого уровня. Чтобы начать программировать, глубокое понимание компьютерных наук не нужно, но по мере развития человеку становятся нужны алгоритмы, теоретические знания, понимание, как устроены компьютеры и сети. Все это относится к Computer Science. Разработчик в любой сфере может столкнуться с необходимостью ее знать.
- Системные архитекторы и аналитики высокого уровня, которые работают с понятиями, имеющими отношение к CS.
- Инженеры, которые работают с компьютерными технологиями в дата-центрах или прокладывают сети, системные администраторы и другие специалисты.
- Ученые, которые изучают компьютерные науки как фундаментальную, научную дисциплину. Они могут заниматься в том числе теоретической информатикой или дискретной математикой. Это, например, преподаватели в вузах или другие специалисты-теоретики.
Для чего нужно знать компьютерные науки
Computer Science рассказывает, как устроены компьютерные системы, как в них представляется, хранится и передается информация, по какой логике они работают, — это помогает программировать эффективнее. С такими знаниями можно более результативно применять те или иные решения, решать более сложные задачи, избегать ошибок.
Существуют области, где понимание компьютерных наук нужно с самого начала. Это, например, системное администрирование или Data Science. Первое напрямую связано с инженерией, второе — с математикой и наукой о данных. Без понимания CS просто не получится усвоить теорию: она основана на информатике. Сюда же относится низкоуровневое программирование, близкое к «железной» части компьютеров.
Computer Science — это база, на которой строятся теоретические знания. С ней человек лучше понимает, что делает, быстрее учится и растет в профессиональном плане.

Станьте дата-сайентистом и решайте амбициозные задачи с помощью нейросетей
Что входит в компьютерные науки
Computer Science очень обширна, поэтому мы не сможем привести полный список сфер, которые в нее входят. Приведем примеры теоретических и практических дисциплин, относящихся к ней.
Математика
Математический анализ, линейная алгебра и другие дисциплины тоже важны, но больше всего связи с информатикой имеет дискретная математика. Она изучает «прерывистые», конечные, то есть дискретные структуры. На математике основано огромное количество алгоритмов, которые используются в разных отраслях IT. К дискретной математике относят теорию графов, конечные автоматы, комбинаторику и многие другие сферы.
Теоретическая информатика
Это фундаментальная наука, которая посвящена информации: тому, как она представляется, хранится и передается. Теоретическая информатика работает с абстрактными понятиями и теориями. Понятие «фундаментальный» означает, что эта наука не подразумевает создания чего-либо на практике: она может описать новый подход к хранению информации, но не реализовать машину, которая так ее хранит. К теоретической информатике можно отнести теорию информации и теорию кодирования — последняя посвящена преобразованию информации в коды. К этому же направлению относят изучение алгоритмов и устройства языков программирования.
Криптография и информационная безопасность
Эта отрасль изучает методы защиты информации от несанкционированного доступа, перехвата или прослушивания. Базовое понимание принципов информационной безопасности нужно всем, кто имеет дело с вебом, глубокие знания — пентестерам, этичным хакерам и специалистам по ИБ.
Читайте также Кто такой «белый» хакер: чем занимается и сколько зарабатывает
Языки программирования
Компьютерные науки — не то же самое, что программирование, хотя сферы связаны. CS изучает не столько особенности языков и умение их применять, сколько их внутреннее устройство в целом. Это то, как устроены языки программирования, какая у них структура, каким образом они реализованы и на чем строятся. Проектирование языков программирования, их классификация, анализ относятся к компьютерным наукам.
Архитектура компьютеров
Этот раздел рассказывает, как устроена компьютерная техника внутри, по какому принципу работают составные части: процессор, различные узлы и блоки памяти, другие структуры. Дисциплина сосредоточена на структуре внутреннего устройства. Для описания того, как все работает с точки зрения физики и электротехники, существуют другие направления, например компьютерная инженерия. Она тоже относится к Computer Science.
В первую очередь знание архитектуры компьютеров нужно низкоуровневым и системным программистам. Большинство популярных языков сейчас работают на «высоком» уровне, то есть близком к человеку. Но такие языки написаны на более низкоуровневых, а те, в свою очередь, на еще более низкоуровневых. Уровень постепенно понижается вплоть до машинных кодов. Так что в конечном итоге понимание архитектуры может понадобиться любому разработчику.
Теория искусственного интеллекта
К этой огромной сфере относят все, что связано с «умным» поведением компьютерных систем. Это робототехника, компьютерное зрение и обработка компьютером естественного языка — ее еще называют NLP. Сюда же относятся машинное обучение, теория нейронных сетей и многое другое.
Такие знания в основном нужны специалистам, занятым в соответствующих отраслях. Например, разработчику из сферы Machine Learning они понадобятся с первых дней работы, а фронтендер может не столкнуться с ними за годы. Но иметь хотя бы поверхностное понимание работы ИИ все равно стоит.
Информационные сети
Этот раздел изучает сеть: то, как она устроена, каким образом передает информацию. Он описывает сетевые протоколы, их особенности и безопасность. Понимание сетей может понадобиться любому, кто имеет дело с разработкой интернет-сайтов, приложений или распределенных систем. Они важны специалистам по информационной безопасности, администраторам, инженерам и многим другим.
Базы данных
Вокруг баз данных — структурированных хранилищ информации — существует отдельная дисциплина. Она описывает подходы к хранению данных, организации связей между ними и доступа. Отдельные знания из этой дисциплины нужны всем разработчикам. Глубоко ее понимать обязаны администраторы БД и люди, которые специализируются на работе с СУБД — системами управления базами данных.
Алгоритмы
Изучение, создание и применение алгоритмов — это отдельный большой раздел науки. Он имеет огромное практическое применение: алгоритмы нужны, чтобы решать сложные прикладные задачи или оптимизировать код. Простой пример — сортировка: разные алгоритмы имеют различную эффективность и скорость работы, и для решения той или иной задачи можно подобрать свой. И таких примеров очень много. Поэтому хороший IT-специалист должен быть знаком с основными алгоритмами из своей сферы.
Слово «алгоритм» означает последовательность действий, определенный принцип выполнения задачи. Оно образовано от имени древнего среднеазиатского математика Аль-Хорезми. Алгоритмы тесно связаны с дискретной математикой и с теорией информации. Они оперируют математическими понятиями и решают в том числе задачи, которые изначально описала дискретная математика.
Data Scientist
Дата-сайентисты решают поистине амбициозные задачи. Научитесь создавать искусственный интеллект, обучать нейронные сети, менять мир и при этом хорошо зарабатывать. Программа рассчитана на новичков и плавно введет вас в Data Science.

Статьи по теме:
Делимся ресурсами для поиска и подборкой возможностей для студентов в IT, которыми можно воспользоваться прямо сейчас
И почему специалисты считаются особенными среди программистов
Делимся подборкой задач с ответами, а также опытом успешных руководителей, HR-специалистов и трудоустроившихся айтишников
Научное программирование: часть 1
Наука в программировании — быль или реальность? Сколько её в языках и почему идут холивары о приемуществах одних языков над другими? Если интересно — прошу под кат.
Давным-давно идут «священные войны» в которых обсуждаются и критикуются различные подходы в написании программ и в самом программировании, критикуется в основном Объектно-Ориентированное Программирование(раз, два, три).
Егор Бугаенко критикует ООП на практических примерах(раз, два, видео), используя идеи Девида Уэста и, как я понял, недавно пошел в сторону теории. Эффективность этих споров стремится к нулю. Почему? Потому что все эти споры ведутся уже на основе реализаций каких-то мыслей, практик и мнений отдельных людей, а не на основе теоретических работ. Научного метода и подхода с его теориями, гипотезами, аксиомами, экспериментами, доказательствами и фактами в последнее время в этих спорах и «войнах» нет от слова вообще!
В математике, как и в любой другой науке, любые теоремы и теории требуют доказательств. Как пример: Теорема Пифагора. Сначала идет теория, а за ней практика. В программировании такого подхода не придерживаются уже несколько десятков лет. Всё заменено догмами и мнением отдельных личностей, которых иногда называют «евангелистами» или «пророками». Они своим словоблудием продвигают в массы только нужные им идеи, не заботясь ни о теории, ни о доказательствах (Посмотрите конференции и презентации по ИТ). Где здесь наука, а где религия? И не скатываемся ли мы в мракобесие и веру в слова написанные давно и не требующих доказательств? Слышали про сторонников плоской Земли? Ничего не напоминает по части подходов по убеждению и упоротости?
И вот в таком кураже последние 30-40 лет программисты, ослепленные религиозными убеждениями от проповедников ООП или ФП, строили абстракции поверх других абстракций, новые языки поверх других языков, новые фреймворки и библиотеки поверх старых. А зачем это все было нужно? Ради упрощения и производительности своей работы по написанию программ. Только этот путь привел в тупик. Потому что вместо упрощения получили усложнение и изучение теперь не алгоритмов, а API и документации к очередному модному фреймворку, а может и нескольким. Теперь баги стали искать не только в своем коде, но и в чужом. Отладку кода приходится делать через тонны прокси, паттернов архитектуры и шаблонов проектирования, хелперов, фреймворков и библиотек. И, как показывают исследования, выигрыша в скорости написания кода от применения ООП нет вообще.
Немного истории. С чего всё началось? Сначала было процедурное программирование, затем структурное и за ним на сцену вышло императивное программирование. Некоторые люди додумались ввести понятие объекта — так родилось обьектно-ориентированное программирование. И в этот момент произошел крутой поворот повернувший всю индустрию в то состояние, в котором мы сейчас находимся.
Введение объекта должно было быть теоретически обосновано. Но этого не произошло. Вместо этого каждый язык внедрял понятие объекта по своему. И каждый разработчик языка трактовал постулаты ООП на свой вкус и цвет. Особо упоротые фундаменталисты придумали Функциональное Программирование основанное на математике, списках и функциях высшего порядка. Звучит серьезно и даже немного научно обосновано, ведь математика — вещь нужная и полезная, только вот какое отношение к реальному миру имеют списки и функции?
Какие задачи решает чистое ФП без использования состояний и есть ли это оптимальный, удобный и правильный способ со стороны человека — вот такой вопрос нужно задать «пророкам» ФП. И его задают (раз, два).
Разработчики функциональных языков начали применять у себя некоторые парадигмы из ООП для того, чтобы выйти из области прикладных задач по математике в область задач реального мира. В ответ некоторые ООП языки реализовали у себя парадигмы из ФП. И «Смешались в кучу кони, люди » (с)
В итоге реализация чистых парадигм ООП и ФП в текущих языках как в песне — «Я его слепила из того что было, а что было то и полюбила»! И получается, что без теоретических работ и научной базы, все эти языки лишь плод фантазий и желаний их разработчиков. И таких языков больше сотни! А так быть не должно! В идеале должно быть всего 2 низкоуровневых языка и 3-4 высокоуровневых, построенных на их основе.
Могу предположить, что когда вводили понятие объекта — за основу приняли то, что видели вокруг себя — человека и животных. И в этом была главная ошибка которая позже вырастет до огромных размеров! Таким образом, возможно, появилось наследование(предок-потомок и связь между ними объясняется наследованием, но как быть с другими объектами в мире? И что значит само определение слова «наследование» в реальном мире? Кровь и ДНК? Азотистые основания?). Как остальные термины, а именно абстракция, инкапсуляция и полиморфизм, относятся именно к ООП? А предоставить доказательства такой связи как-то не потрудились. Ведь написать можно что угодно и звучит логично, только проблема в том, что приведенные аргументы к ООП отношения не имеют. Ведь в ООП была сделана логическая ошибка —(неполная индукция) был произведен переход от одного частного случая ко всему общему множеству. Чтобы это показать, приведу пример — если можно за основу взять только живых существ с наследованием, то почему же, следуя этой же логике, не взять за основу планету или целую галактику? Ведь планета или галактика тоже наследница других объектов из космоса и имеет состояние и какое-то поведение. Или все горы представить как объекты без наследования и практически без поведения.
Почему любой объект должен или может использовать наследование от другого объекта кто-то потрудился объяснить и доказать? Ударение на слове «доказать»!
Ведь если начинаешь сильно задумываться над этим, то возникает смутное предчувствие: здесь не обошлось без обмана, манипуляций и ошибок! Ведь ценность слов оценивается по возможности их логически и аргументированно доказать опираясь на факты и данные. Иначе можно придумывать какой угодно бред вплоть до розовых единорогов! Или по-другому — чем ваши слова отличаются от слов религиозного фанатика-экстремиста сбежавшего из психбольницы?
Но так было не всегда. Вот примеры научного подхода:
1. книга «Электронные цифровые машины и программирование» А.И. Китова.
Не так много как хотелось бы, и, возможно, где-то есть еще много примеров научных работ, но их найти очень сложно. Подавляющее большинство пользуется всякими «библиями» и статьями для аргументации и дискуссий(в реальности это даже слишком громкое слово для этого процесса).
Попробуем применить к программированию науку и опираться только на её достижения, результаты и методы.
Введем базовые определения для терминов:
Обьект — наименьшая неделимая сущность, также известная нам как химический элемент, имеющая множество свойств и множество моделей поведения реализуемые через методы. У объекта есть 2 типа методов: 1) для получения его свойств, 2) для изменения его состояния.
Модель поведения — интерфейс для взаимодействия с объектом.
Процесс — вид взаимодействия над элементами(гравитация, свет, нагревание, излучение).
1. Всё в окружающем мире состоит из мельчайших неделимых химических элементов и поэтому за основу главного объекта необходимо брать именно химический элемент обладающий множеством моделей поведения.
2. Химические элементы могут объединяться во множества.
3. Химические элементы взаимодействуют между собой (реакция), находятся под действием разных процессов.
4. Каждый химический элемент имеет свое состояние на каком-то промежутке времени и может его менять под воздействием внешних процессов.
5. Процессы также являются объектами или их множеством и с помощью своей модели поведения могут изменять химические элементы.
Приняв за основу изложенные факты и данные, проанализировав свойства и поведение элементов, их взаимодействие и процессы между ними, выделим несколько принципов:
1. Есть 2 типа объектов: элементарные(атомарные) и реакционные(процессные). Элементарные объекты могут, при соблюдении определенных условий, возвращать из методов, меняющих их состояние, новые объекты.
2. Реакционные объекты знают интерфейсы объектов с которыми работают.
3. Все свойства объекта должны быть определены как приватные и неизменяемые, объекты как публичные и неизменяемые, а методы только публичные.
4. Существует только один тип проверяемого исключения — Exception.
5. У элементов нет такого понятия как NULL. Вместо этого должен быть или 0, пустая строка, массив с одним элементом или пустая коллекция элементов.
6. У элементов нет наследования ни в каком виде.
7. Также нет аннотаций, приведения типов, внутренних и локальных классов, анонимных классов и лямбд, Enum-ов, дженериков со словами super, extends и ?(только T, V, U, R!), статических методов и атрибутов.
8. Нет абстрактных классов и методов.
9. Элементарные объекты не могут возвращать данные которые могут быть изменены. Можно только попросить этот объект что-то с ними сделать — так как только он отвечает за их хранение и изменение. Изменение элементарного объекта происходит только с помощью реакционного объекта.
10. Для хранения состояния необходимо использовать структуры данных, такие как массивы, очереди, коллекции, списки и карты (maps).
11. Объекты вступающие в реакцию друг с другом могут вернуть другой обьект или изменить свое состояние.
12. Структуры данных очень важны. Реакционные объекты могут принимать в качестве параметров метода множество(коллекцию) разных объектов и могут возвращать множество разных объектов как результат работы метода.
13. Методы используют формальную логику(с высказываниями, алгеброй логики и логическими операциями) и циклы выраженную в виде синтаксиса языка, для работы с данными и возвращают результат или изменяют состояние объекта (или его множества).
14. Тело метода должно занимать от 1 до 10 строчек кода без пропусков.
15. Тело класса должно занимать от 5 строк до 2 высот экрана монитора без пропусков. Чем меньше тело класса и метода — тем лучше.
1. Если исключить из ЯП (Язык Программирования) возможность наследования, статические методы и атрибуты, абстрактные классы, то в проекте код станет минимум на 10-20 процентов меньше.
2. Если исключить из кода в проекте все антишаблоны проектирования, то код станет минимум на 10-15 процентов меньше.
3. Чем меньше и проще объекты, тем проще их понимать, тестировать и изменять.
4. Тестирование объектов будет проходить быстрее (см п.3).
5. Отладка метода будет проходить быстрее (см п.3).
6. Написание новых классов будет проходить быстрее (см п.3)
Таким образом, приняв во внимание факты, принципы и созданную гипотезу(если она подтвердится экспериментально), мы можем вывести свою Элементарную или Атомную теорию программирования.
Если бы в 60-е и 70-е годы такой подход был принят за основной стандарт, то мы бы не испытывали сейчас столько негатива и растерянности с существующим зоопарком языков и подходов.
В следующей части будем экспериментально доказывать нашу гипотезу и дополнять теорию. Задавайте вопросы по теории в комментариях. Серьезно отнеситесь к этому делу и думайте.