Как выбрать технологический стек для стартапов?
Технический стек также называют экосистемой данных, технологической инфраструктурой или стеком решений. Это комбинация инструментов, которые используются для создания и эксплуатации одного приложения. Это структура, на которой приложение, которое вы используете, например Facebook поддерживается такими инструментами как: HTML, PHP, CSS, ReactJS или JavaScript.
Более того, стеки объединяют два аспекта разработки программного обеспечения: серверная и визуальная части. Фронтенд - это экосистема, в которой взаимодействие осуществляется пользователями, а бэкенд - веб-сервер и координация.
Вы можете спросить, как определить правильный стек технологий для вашего бизнеса? Стек технологий, предназначенный для разработки веб-сайтов, будет отличаться от необходимого для мобильных приложений. Точно так же стек коммерческих/корпоративных продуктов будет отличаться от стека стартапов. К другим факторам относятся скорость, с которой вы хотите выпускать MVP(Минимально жизнеспособный продукт), и количество квалифицированного персонала, которое вы можете выделить для нового проекта.
Стек технологий для стартапов
Чтобы определить правильный набор технологий для вашей стартап-компании, вы должны понимать, что технологический стек не универсален. Они собираются на основе следующих факторов:
- Тип проекта: если у вас небольшой проект, идеальным техническим стеком была бы стандартная система управления контентом, такая как WordPress. Для стартапа среднего размера вы можете объединить CMS с подходящим языком программирования, таким как Python, C ++ или JS. Для более крупного проекта вам потребуются веб-приложения со специальными функциями, отвечающими вашим требованиям.
- Дедлайн: количество времени, в течение которого вы хотите запустить свои проекты, частично зависит от стека, который вы выбрали для своего веб-приложения. Имея правильный технический стек, заданный опытным разработчиком, вы можете выпустить свой продукт вовремя и без ошибок.
- Масштабируемость: способность системы, сети или процесса справляться с увеличением своей производительности при добавлении ресурсов (обычно аппаратных). Увеличение производительности каждого компонента системы с целью повышения общей производительности или же разбиение системы на более мелкие структурные компоненты и разнесение их по отдельным физическим машинам.
- Обслуживание: зависит от кодовой базы и инфраструктуры программного обеспечения. Реюзабилити и длина кода считается важным.
- Доступность: Некоторые технологии платные, а некоторые не могут быть использованы в коммерческих целях. Помимо этого необходим специалист для их применения. Востребованные разработчики уже заняты на других проектах, и поэтому, найти хорошего разработчика, который мог бы заставить все это работать - дорого. Это актуально для Python, React Native и Node. Найм хорошего разработчика одна из главных статей расходов.
- Стоимость: Бюджет всегда имеет ограничения, будь то запуск ракеты или копицентр. Вы - идейный носитель стартапа, очевидно что деньги расходятся на ресерч, найм, маркетинг и прочее. Следовательно, можно попробовать сэкономить, на использовании решения с открытым исходным кодом. Другими словами, вы можете использовать такие технологии бесплатно. Они постоянно развиваются, настраиваются и часто достаточно долговечны. Но их могут выпустить и забросить. Это и есть риск. Или там может быть вредоносный код - и это риск. Или это перестанет работать, потому что связано с внешним сервисом, который перестанет работать.
Кроме того, следите за техническими стеками, которые уже созданы компаниями и доступны на рынке. Вы можете найти их на Stackshare, чтобы увидеть, какие компании используют стек программного обеспечения.
Технический стек для MVP
Итак, у вас есть целенаправленный технологический стек, и все сотрудники и приоритеты. Но на протяжении всей разработки вашего продукта MVP может сильно отличаться от того, что вы изначально задумывали.
Иногда вы можете прийти к тому моменту, когда окончательная версия MVP потребует изменений в вашем стеке технологий, поскольку дальнейшие инновации и развитие будут зависеть от того, с чем вы работаете. В таких обстоятельствах вам может потребоваться начать все сначала с новыми фреймворками и совершенно новой архитектурой. Всего лишь один недостающий элемент может изменить всю инфраструктуру и навести беспорядок.
Факторы, которые следует учитывать при выборе стека технологий MVP
- Убедитесь, что продукт выходит на рынок в короткие сроки. Таким образом вы сможете быстрее собирать отзывы и поддерживать быстрый темп исправлений и развития.
- Заранее принимайте расчетные решения, чтобы исключить альтернативные затраты времени из-за отсутствия программ автоматизации, поддерживающих вашу инфраструктуру. Наличие подходящего инструмента CI / CD может ускорить тестирование, управление версиями и размещения приложения.
- Не экспериментируйте со своим MVP в поисках разрекламированной или новой технологии, даже если разработчики этого хотят. Когда вы серьезно относитесь к технологическому стеку для своего проекта, вам нужно думать о долгосрочной перспективе (Хотя, это спорно, стартап не всегда для долгосрочной перспективы). Чтобы увидеть, является ли новая технология причудой или позитивной тенденцией необходимо время.
Новые технологии нестабильны, и вам может быть нелегко найти команду для новой ниши, что является пустой тратой времени и денег. Поэтому сосредоточьтесь на имеющихся в настоящее время и доступных в будущем стеках. Работайте умеренно, чтобы проложить стабильный путь к желаемому результату.
Заключение
Есть две вещи, на которые вы должны обращать внимание при выборе набора технологий для своего стартапа; проект и разработчик. Вы изучаете свои требования к стартапу и тип MVP, который хотите запустить? Это поможет вам найти похожие примеры и усвоить некоторые знания, на выяснение которых у вас уйдет целая вечность.
Кроме того, прежде чем использовать свой стек технологий, проконсультируйтесь со своей командой разработчиков, чтобы изучить их область знаний для выполнения работы. Они, вероятно, сами предложат стек для проекта, которым вы собираетесь заниматься - правильное предвидение ваших требований, наличие рук для вашей цели и внимание к своей команде разработчиков при выборе инфраструктуры программного обеспечения проложат путь к успеху стартапа.
Английский вариант читать тут: How to Choose a Technology Stack for Startups
Понравилась ли статья? Напишите отзывы, будем продолжать? :)
Лучшие Front-end фреймворки для веб-разработки в 2021 году
Программирование веб-сайтов и веб-приложений всегда должно начинаться с выбора правильной технологии. Фактически это станет основой вашего будущего проекта. Если вы новичок в программировании или уже открыли свой путь, возможно, вы работаете с JavaScript. В таком случае никогда не следует забывать о фронт-енд фреймворках JavaScript. Программисты используют их постоянно, поскольку они являются идеальным инструментом для разработки сложных веб-приложений.
В следующей статье сделаем акцент на самых популярных интерфейсных фреймворках за последние несколько лет. Более того, нам удалось проанализировать массу информации о трендах JS. Все это для того, чтобы выбрать те, которые сохранят или увеличат их популярность среди программистов. Здесь вы найдете только самые лучшие фронтенд-фреймворки JavaScript.
Angular, React, Vue - эти названия широко известны всем программистам. Но вопрос в том, хороши ли они вообще? А может просто переоценено? Узнаем же все плюсы и минусы упомянутых фреймворков, а также многое другое!
Эти повторяющиеся массивные падения хорошо видны в Google Trends. То же самое произошло и в декабре 2020 года. За последние несколько лет пользователи Google больше всего искали React.js. Angular всегда отставал лишь на небольшой шаг, а Vue.js шел третьим.
Чтобы подтвердить наши выводы, мы перешли на страницу NPM Trends для загрузки фронт-енд фреймворков JS. Было видно такое же падение популярности. На сайте показано, что React.js - это наиболее часто загружаемый фреймворк. Второе место принадлежит jQuery. Vue.js отстает.
Посмотрев на State of JS, мы увидим убедительный результат. Это обзор разработчиков, ориентированных только на JS, приводит нас к выводу, что React пользуется высокой репутацией среди программистов. Это был самый надежный интерфейсный фреймворк JavaScript каждый год. За исключением того случая в 2018 году, когда он разделил первое место с Vue.js. К нашему удивлению, популярность Angular среди пользователей в последнее время падает.
Примерно в начале 2020 года Statista провела онлайн-опрос разработчиков, чтобы изучить популярность веб-фреймворков. Среди наиболее часто используемых интерфейсных фреймворков JS можно увидеть jQuery, React.js и Angular. Честно говоря, ничего удивительного.
Чтобы подтвердить рейтинги, мы рассмотрели StackOverflow и их идеи для разработчиков в начале 2020 года. Результаты были очень похожи на результаты, полученные на Statista.
Это подводит нас к окончательному вердикту. Меняется популярность лучших интерфейсных JavaScript-фреймворков. Тем не менее, те, которые сохранили свою репутацию за последние пять лет, - это Angular, React и Vue.js.
Список фреймворков, которые будут популярны в 2021 году
Мы хотим поделиться с вами нашими прогнозами о главных тенденциях в интерфейсных фреймворках JavaScript на 2021 год. Есть несколько фреймворков, которые, несомненно, сохранят свои позиции. Вот наш шорт-лист на этот год, основанный на анализе прошлых лет и изменении популярности:
1. React.js
2. Angular
3. Vue.js
4. Backbone
5. Ember
Глядя на текущие тенденции, мы понимаем, что среда интерфейсных фреймворков JS процветает. Мы также хотим рассказать о нескольких полезных фреймворках, которые будут использоваться в 2021 году. Даже несмотря на то, что их прайм-тайм ушел:
1. Ext JS
2. Svelte
3. Preact
5 лучших Front-End JavaScript-фреймворков в 2021 году
Давайте внимательнее рассмотрим все основные особенности лучших Фронт JavaScript-фреймворков. После подробного изучения мы выбрали для вас 5 основных.
1. React
Более 162 тысяч звезд на GitHub делают React.js действительно заслуживающим доверия. Эта внешняя среда JavaScript с открытым исходным кодом увидела свет в 2013 году. Это произошло благодаря Facebook. Фреймворк был разработан, чтобы позволить дизайнерам и разработчикам создавать современные графические интерфейсы приложений. React.js использует компоненты, которые значительно улучшают весь процесс создания веб-проекта. Благодаря своей высокой эффективности этот JS-фреймворк идеально подходит для приложений с высокой посещаемостью. Как Netflix, Dropbox или Pinterest, которые все основаны на React.js.
React.js - самые важные функции:
- Этот интерфейсный фреймворк работает быстрее других. Благодаря этому программисты могут сэкономить много времени и стать более эффективными.
- По сравнению с Angular продуктивность React постоянно росла, превращаясь в инструмент для создания серьезного и сложного программного обеспечения.
React.js плюсы:
- Хорошая производительность, поскольку он основан на виртуальной модели DOM.
- Его компоненты можно повторно использовать в разных частях приложения.
- Большое сообщество постоянно развивается и делает фреймворк стабильным.
- Он универсален и может использоваться с любыми фреймворками.
- Односторонний поток данных.
Минусы React.js:
- Использование сложного JSX заставляет разработчиков и дизайнеров жаловаться на это.
- Его динамика иногда может влиять на поисковую оптимизацию Google (SEO).
- Поддерживает только результаты внешнего интерфейса.
2. Angular
Angular - фронт-енд JavaScript для веб-приложений, созданная инженерами Google. Они стремились полностью изменить дизайн интерфейсных веб-приложений. Им это удалось? Что ж, если мы посмотрим на его популярность и репутацию, мы можем сказать, что Angular превзошел своего старшего коллегу, jQuery. Приложения Xbox, Forbes и BMW основаны на этой технологии. Все программисты, использующие эту структуру, получают передовой опыт. Наряду с React.js новичкам широко рекомендуется Angular. Но действительно ли это так просто?
Angular - важнейшие особенности:
- Эта структура использует двустороннюю привязку данных. Он обеспечивает динамическую синхронизацию данных между уровнем представления и уровнем модели данных в архитектуре MVW.
- Angular построен исключительно на TypeScript, что обеспечивает плавную и эффективную работу. Другими словами, TypeScript - это основной язык Angular.
- Это кроссплатформенный фреймворк. Используя Angular, программисты могут создавать веб-сайты, веб-приложения, мобильные приложения и настольные приложения. Довольно аккуратно, да?
Angular плюсы:
- Он автоматически улавливает изменения на уровне модели, самостоятельно изменяя код HTML.
- Простые решения для тестирования на основе Angular поддерживают интеграцию модульных тестов.
- Внедрение зависимостей обеспечивает простой перенос и взаимодействие между всеми компонентами сложной системы.
- Angular отлично работает с внешними библиотеками, такими как jQuery, UnderscoreJS или Ionic framework.
- Встроенная связь REST через $http и $resource
Angular минусы:
- Трудно изучить сложные процессы. Это не самый простой фреймворк для новичков, не имеющих опыта работы с JavaScript и TypeScript.
- При открытии приложения все скрипты загружаются одновременно. Это влияет на эффективность и скорость работы программистов.
- Для полной индексации сайта вам нужно будет использовать внешние инструменты, которые возвращают правильный HTML-код.
3. Vue.js
Когда дело доходит до Vue.js, в представлении нет необходимости. Эта внешняя среда JavaScript с открытым исходным кодом модели MVV была впервые представлена в 2014 году Эваном Ю. Он раньше работал в Google, где использовал Angular. Сначала Вы создали облегченную версию того, что ему больше всего нравилось в среде Angular. Теперь, семь лет спустя, Vue.js является одним из наиболее часто используемых в мире интерфейсных фреймворков для JS. Но сможет ли он оправдать свою репутацию?
Vue.js - самые важные функции:
- Он работает как универсальный JavaScript-фреймворк, сочетая в себе самые удивительные инструменты из Angular, React и Ember. И он легче своих предшественников.
- Эта структура работает с виртуальной DOM и использует двустороннюю привязку. Все это делает Vue.js сложным и современным решением для разработки сложных веб-приложений.
- Vue.js основан на открытом исходном коде и, вероятно, станет более удобным для пользователя. Тем более, что для всех программистов подробная и обширная документация.
Плюсы Vue.js:
- Серверный рендеринг на основе того, что предоставляет Angular2 и React.
- Скорость и эффективность как для одностраничных, так и для многостраничных проектов.
- Интуитивно понятные функции и простой синтаксис делают этот фреймворк простым в освоении для новичков.
- Поддерживает эластичное и гибкое программирование на основе понятного и читаемого кода.
- Поддерживает использование машинописного текста.
Минусы Vue.js:
- Небольшая поддержка. За Vue.js. не стоит крупная корпорация. Это делает его менее предпочтительным для продвинутых программистов, которые привыкли к другим фреймворкам JavaScript.
- Гибкость. Не поймите неправильно. Это также преимущество Vue.js. Но в то же время выбор множества компонентов может вызвать проблемы. Особенно при реализации масштабного проекта, над которым работает много программистов.
- Языковой барьер. Многие из новых механизмов и плагинов, используемых в Vue.js, написаны на китайском языке.
4. Backbone
Backbone.js - это еще один стабильный фреймворк JavaScript для веб-приложений. Он был выпущен в 2010 году. Его создатель Джереми Ашкенас также известен благодаря CoffeeScript и Underscore.js. Эта облегченная структура JS обрабатывается моделью MVC. Он предназначен для разработчиков, работающих над одностраничными веб-приложениями. Backbone.js широко используется, и его популярность растет с каждым годом. Веб-приложения, построенные на этой платформе, включают, среди прочего, Airbnb, Hulu, SoundCloud или Verizon.com.
Backbone.js - самые важные функции:
- Легкая в освоении эта интерфейсная среда позволяет программистам разрабатывать клиентские веб-приложения и мобильные приложения.
- Он принимает императивную парадигму программирования при работе с DOM. Другими словами, Backbone состоит из команд, которые должны выполнять приложения.
- Backbone.js совместим с REST API, что делает его безупречным для синхронизации между бэк и фронт фреймворками.
Backbone.js плюсы:
- Обеспечивает быструю и плавную работу.
- Новичкам очень легко изучить эту внешнюю среду JavaScript для веб-приложений.
- Основанный на библиотеке с открытым исходным кодом, он имеет более 100 пользовательских рабочих расширений.
- Его модели и коллекции совместимы с архитектурой RESTful. Вы можете удобно получить их данные с сервера.
- Очень отзывчивый. Все изменения кода можно сразу увидеть в приложении.
Backbone.js минусы:
- Чтобы писать более сложные приложения, программистам необходимо загрузить дополнительные плагины и расширения.
- Небольшой размер. В то же время это преимущество. Тем не менее, если вы хотите использовать Backbone.js в полной мере, вам необходимо добавить в свой проект фреймворки Underscore.js и jQuery.
- Backbone.js не имеет готовых структур. В нем есть только несколько очень простых инструментов для разработки макета приложения.
5. Ember
Другой широко используемый и известный фронт фреймворк JavaScript - это Ember.js. Созданный в 2011 году Иегудой Кац, он настоятельно рекомендуется профессиональными кодировщиками, работающими над передовыми решениями. За этой структурой стоит заинтересованное сообщество, так как она основана на механизмах с открытым исходным кодом. Ember.js фокусируется на предоставлении инструментов высочайшего качества для клиентских веб-приложений и мобильных приложений. Прямо сейчас некоторые из самых известных веб-сайтов, использующих эту структуру, включают Apple Music, Discourse, LinkedIn и Twitch.
Ember.js - самые важные функции:
- Двусторонняя привязка данных, как в Angular.js. Эта функция синхронизирует и модель, и вид.
- Наличие Fastboot.js позволяет ускорить рендеринг всех серверных DOM и повысить производительность сложных интерфейсов.
- Ember.js - лишь один из основных компонентов сложного стека внешнего интерфейса, подготовленного командой Ember. Эти решения также включают Ember CLI, Ember Data, Ember Inspector, Fastboot и Liquid Fire.
Плюсы Ember.js:
- Он использует простые для понимания шаблоны, позволяющие легко и гибко разрабатывать пользовательский интерфейс.
- Благодаря этой структуре вы можете добавлять маршруты вложения поверх представления шаблона.
- Простая отладка благодаря решениям Ember Inspector.
- Пользователи получают хорошую документацию по фреймворку JS.
- Все используемые шаблоны можно предварительно скомпилировать на сервере.
Минусы Ember.js:
- Изучение фреймворка считается трудным. Ember.js рекомендуется продвинутым пользователям, хорошо разбирающимся в интерфейсных фреймворках JS.
- Он не использует простые модели JavaScript, что делает веб-приложения более сложными, чем в случае с Angular.js.
- За Ember.js стоит относительно небольшое сообщество. Поэтому поиск решения ваших проблем может занять немного больше времени.
Обзор других фреймворков
Мы выбрали три других JS-интерфейсных фреймворка, о которых стоит упомянуть. Даже если они не так популярны, как упомянутые ранее. Давайте взглянем на них бегло.
1. Ext JS
Ext JS, фронт-енд JavaScript-фреймворк для веб-приложений, был представлен в 2007 году. Сначала он был построен как расширение библиотеки-надстройки YUI. Использование внешних фреймворков с Ext JS необязательно. Эта технология может работать совершенно независимо. Возможно, это не самый популярный интерфейсный фреймворк, но он работает довольно хорошо. Особенно при создании динамических сеток для статических веб-страниц или разработке одностраничных веб-приложений.
Плюсы Ext JS:
- Использует множество виджетов, упрощает работу и вносит изменения.
- Существует надежное сообщество, предоставляющее хорошую документацию и руководства.
Это делает этот фреймворк интересным вариантом для начинающих программистов.
- Пользователи могут воспользоваться стабильной базой предварительно протестированных компонентов пользовательского интерфейса.
Минусы Ext JS:
- Бесплатная версия Ext JS имеет ограниченную поддержку пользователей, и у пользователей могут возникнуть проблемы с отладкой.
- Полная версия стоит довольно дорого. Поэтому мы рекомендуем его только тем пользователям, которые уверены, что продолжат работать с этим фреймворком.
Svelte - относительно молодой фронт фреймворк JavaScript, основанный на его предшественнике Reactive.js. Первая версия этого бесплатного фреймворка с открытым исходным кодом была выпущена в 2016 году. Программисты могут использовать Svelte прямо в браузере, что является нововведением по сравнению с его конкурентами. Поскольку он является одним из последних фреймворков JS-интерфейса, он все еще не имеет интегрированного сообщества. Может быть, в ближайшие годы это изменится. Будем внимательно следить за этим.
Плюсы Svelte:
- Легкие и, следовательно, более быстрые, чем другие интерфейсы.
- Это помогает уменьшить масштаб веб-приложения за счет уменьшения его размера. Это отличная возможность для всех тяжелых приложений, которые некорректно работают при медленном подключении к Интернету.
- Компоненты легко понять, и их реакция на помеченные утверждения работает очень хорошо.
Минусы Svelte:
- За фреймворком стоит небольшое (но постоянно растущее!) Сообщество. Становится сложно решить некоторые проблемы, которые могут возникнуть у начинающих программистов при изучении этой библиотеки.
- Для небольших проектов рекомендуется использовать Svetle. Доступных дополнительных инструментов по-прежнему недостаточно, чтобы помочь кодерам работать в больших масштабах.
3. Preact
Сначала вы можете спутать Preact с React. Однако первый фреймворк намного легче и быстрее. Переход на Preact - хорошая идея для всех разработчиков, работающих с JavaScript. Использование этого фреймворка определенно сделает все веб-приложения более адаптивными и быстрее работают. У этого есть и обратная сторона. Вы можете потерять несколько функций React. Будет ли Preact когда-нибудь так популярен, как другие фреймворки? На данный момент трудно сказать.
Плюсы Preact:
- Легкий, портативный и совместимый с библиотеками React.
- Высокая эффективность позволяет кодировщикам работать без проблем и создавать более легкие версии веб-приложений.
- У него больше функций, чем у React-lite framework.
Минусы Preact:
- Небольшое сообщество затрудняет получение решений некоторых проблем.
- Preact предоставляет только функциональные компоненты без сохранения состояния и компонент, зависящий от ES6.
Какие фреймворки Frontend JS следует изучить в 2021 году?
Итак, вы собрались изучить новый фронт фреймворк JavaScript в 2021 году? Затем вы должны спросить себя, чего вы хотите достичь. Найдите свою цель, а затем ищите средства для ее достижения. Есть несколько замечательных фреймворков для начинающих, у которых нет опыта работы с JavaScript. Лучший фронт JS фреймворк для начала - React.js. Благодаря известному сообществу пользователей новичкам будет легко искать решения проблем.
Продвинутые программисты должны бросить вызов самим себе и продолжать поднимать планку выше. Поэтому рекомендуем всем новичкам. Мы имеем в виду все фреймворки, которые не имеют большого сообщества и не используются начинающими программистами.
Почему это? Потому что таким технологиям, как Preact, Svetle и Ext JS, нужны профессионалы, которые помогут будущим программистам решить существующие проблемы.
Когда вы считаете себя профессиональным пользователем JavaScript, нет никаких ограничений в отношении фреймворков, которым вы можете доверять. Если вы ищете лучший фреймворк JS для проектирования и разработки крупномасштабного проекта, выберите Angular. Это будет одна из хорошо поддерживаемых разработок JS в 2021 году. Ваша работа может быть намного проще и быстрее, чем когда-либо, благодаря использованию TypeScript.
Еще одна замечательная идея - попробовать Vue.js. Он известен своей популярностью среди пользователей. Неудивительно, почему - в нем собраны все лучшие функции от Angular и React. И он также работает с TypeScript для повышения производительности и эффективности. Эта структура поддерживается большим сообществом программистов, которые готовы помочь в случае необходимости. С таким мощным инструментом ваш следующий большой проект приложения в 2021 году будет иметь потрясающие результаты.
Заключение
Хотим, чтобы вы запомнили еще одну вещь. Фреймворки JavaScript постоянно развиваются. И для веб-приложений, и для мобильных. Все они предоставляют различные библиотеки, функции и расширения. Некоторые подходят для одностраничных веб-приложений, другие лучше работают с более крупными проектами. Окончательное решение по-прежнему остается за вами, независимо от того, для чего вы планируете использовать фреймворки. Никогда не стоит просто плыть по течению. Не полагайтесь только на популярность веб-фреймворка. Выбирайте фреймворки, которые удовлетворят ваши потребности.
Английский вариант читать тут: The Best Front-end Frameworks for Web Development in 2021
Понравилась ли статья? Напишите отзывы, будем продолжать? :)
Минимальный список технологий, которые должен знать каждый, уважающий себя, программист
Навеяно недавним постом про фреймворки и покемонов.
(HR'ам и прочим сочуствующим: копипастить в любое объявление по работе в сфере IT.)
• 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
• Мультитредность, обедающие философы, 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/WaitForMultipleObjects, green thread/coroutine, pthreads, future/deferred/promise, модель акторов, parameter server, RDD (as seen in sparks), downpour SGD, wait-free, stackful vs stackless
• Язык ассемблера, Зубков/Хайд/Дреппер/Касперски/Фог/Абраш, 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
• Аппаратное обеспечение, Хоровиц-Хилл/Титце-Шенк/От физики к Си от panchul, полупроводниковая электроника/спинтроника/фотоника, транзистор, триггер, схемотехника, микрокод, технология создания процессоров, logic synthesis, static timing analysis, FPGA, Verilog/VHDL/SystemC, SISAL, Arduino, ARM Cortex-M0,5, x86(-64),NEON, STM32, NXP LPC32 устройства памяти (ROM → EEPROM, RAM, SSD, HDD, DVD), RISC/CISC, Flynn's taxonomy ([SM]I[SM]D), принстонский и гарвардский подход, архитектуры процессоров, архитектуры x86, VID/PID
• Процессоры, конвейеризация, hyper-threading, алгоритм томасуло, спекулятивное исполнение, static/dynamic branch prediction, префетчинг, множественный ассоциативный кэш, кэш-линия/кэш-промах, такты, кольца защиты, память в мультипроцессорных системах (SMP/NUMA), тайминг памяти, intel optimization manuals, performance counters
• Дискретная математика, K2, теорема Поста, схемы, конечные автоматы (ДКА и НДКА), автомат Калашникова, клеточные автоматы
• Вычислимость, машина Тьюринга, нормальные алгоритмы Маркова, машина Поста, диофантовы уравнения Матиясевича, лямбда-функции Черча, частично рекурсивные функции Клини, комбинаторное программирование Шейнфинкеля, Brainfuck, эквивалентность тьюринговых трясин, проблема останова и самоприменимости, счетность множества вычислимых функций, RAM-машина, алгоритм Тарского, SAT/SMT-солверы, теория формальных систем, interactive proofs, теорема Левина-Кука, 3SAT, PSPACE = NPSPACE, #P
• Языки программирования, грамматики, иерархия Хомского, теорема Майхилла-Нероуда, лемма о накачке и лемма Огдена, алгебра Клини, НДКА → ДКА, алгоритмически неразрешимые задачи в формальных языках, Драгонбук, Фридл, регекспы и их сложность, 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
• Алгоритмы и комбинаторная оптимизация, Кормен/Скиена/Седжвик/Кнут/Ахо-Хопкрофт-Ульман/Пападимитриу/Шрайвер-Голдберг/Препарата-Шеймос/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
• Численные методы, дихотомия/метод Ньютона, интер- и экстраполяция, сплайны, метод Гаусса/Якоби/Зейделя, 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
• Машинное обучение, Тибширани/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
• Теория информации, сжатие, Хаффман, RLE, BWT, LZ, коды коррекции ошибок, сжатие с потерями (изображения, аудио, видео), информационная энтропия, формула Шеннона, сложность Колмогорова, maximum entropy problem, kullback-leibler divergence, elias/shannon-elias encoding
• Криптография, Шнайер/Ященко, Принцип Керкгоффса, симметричная (DES, AES), асимметричная (RSA), качество ГПСЧ, алгоритм Диффи-Хеллмана, эллиптические кривые, хэширование (MD5, SHA, CRCn), DHT, криптостойкость, криптоатаки (атака гроссмейстера), WEP/WPA/WPA2 и атаки на них, цифровая подпись и сертификаты, PKI, HTTPS/SSL, доказательство с нулевым разглашением, пороговая схема, murmurhash/cityhash, DKIM
• Математика, Кнут-Грэхем-Паташник/Зорич/Винберг, Spivak/Dummit-Foote, матан, линал, комплан, функан, диффгем, теория чисел, дифуры/интуры/урчпы/вариационное исчисление/оптимальное управление, производящие функции, ряды, комбинаторика, теорвер/матстат/слупы/теория массового обслуживания, цепи Маркова, интегральные преобразования (Фурье, Лаплас, вейвлет), NZQRCHOS, матпакеты (Mathematica, Maple), теория категорий
• Физика, правила Кирхгофа, закон Джоуля-Ленца, комплексное сопротивление, скорость и частота света, уравнения Максвелла, лагранжиан и гамильтониан, quantum tunnelling/hot electron injection :)
• Химия, стехиометрия, химия кремния :)
• Архитектура и стиль кода, Макконнелл/Фаулер/Лебланк/Гамма/Александреску-Саттер/Буч, защитное программирование, паттерны, SOLID/GRASP/KISS DRY SPOT/YAGNI, UML, OOP (Smalltalk), OOD/OOA, метрики кода, uncle Bob
• Методологии разработки, Waterfall/RUP/Agile/Scrum/Kanban/XP, TDD/BDD, CASE
• Тестирование, юнит-тесты, функциональное, нагрузочное, интеграционное тестирование, тестирование UI, mocks/stubs/spies, fixture, запахи и паттерны тестов (Osherove/Meszaros)
• Инструментальные средства разработки, 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
• Операционные системы, Silberschatz/Рихтер/Соломон-Руссинович/Робачевский/Вахалия/Стивенс/Таненбаум/Love/Linux Kernel Internals, менеджер памяти, менеджер кучи и ее устройство (LAL/LFH/slab), менеджер устройств, менеджер процессов, context switch, реальный и защищенный режим, исполнимые файлы (PE/ELF/Mach), объекты ядра, отладочные механизмы (strace/ptrace/dtrace/pydbg, Debug API) и минидампы, bash, сетевой стек и высокопроизводительные сервера, netgraph, CR0, IPC, оконная подсистема, система безопасности: ACE/ACL и права доступа, технологии виртуализации, RTOS (QNX), программирование драйверов, IRQL, IRP, файловые системы, BigTable, NDIS/miniport/FS drivers/filter driver, Mm-, Io-, Ldr-функции, DKOM и руткиты, GDT/IDT/SDT, ядра Windows/Linux/BSD, POSIX, TRIM
• Компонентно-ориентированные модели, Роджерсон/Таварес, 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
• Графика и GPGPU, алгоритм Брезенхема, цветовые модели, трассировка лучей vs полигональная графика, OpenGL/GLSL/Open Inventor, DirectX/DirectShow/DirectAudio/HLSL, stencil/depth/alpha-test, графический конвейер в DirectX 11, шейдеры, модели освещения (Фонг), пропускная способность, fillrate, OpenCL/CUDA/AMP, ландшафты, лоды, тени, deferred shading, текстурирование и фильтрация, антиалиасинг, HDR, tone mapping, virtual/augmented reality
• Форматы, 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
• Базы данных/Распределенные системы, Грубер/Дейт, 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)
• Прикладное программирование, 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
• Проектирование GUI и представление информации, Раскин/Тафти, юзабилити, основы дизайна и типографики, закон Фиттса, основы верстки, LaTeX, алгоритмы визуализации данных (as seen in d3), subpixel rendering