четверг, 11 августа 2016 г.

Разбор теоретического минимума программиста

    Веб-программирование и скриптовые языки

    Фланаган Что это такое или кто это такой я так и не понял. 
    Гугл сказал, что это английский футболист. Как этот человек связан с веб-программированием мне неведомо.
    Zend PHP5 Certification Course + Study Guide Это вообще не технология. Не совсем уместно, по моему мнению, смешивать знания и курсы с руководствами. У меня есть цель по подготовке к PHP-сертификации. Вот там это актуально. Тут не к месту.
    Apache и nginx веб-серверы. Обычно используется один из них. Хотя есть и те, кто умудряется использовать оба. Я встречал такое. Надо освоить
    CGI и FastCGI стандарты интерфейса, используемого для связи внешней программы с веб-сервером.
    Языки программирования (далее ЯП) PHPPythonRuby и ASP (ASP.NET, C# и т.п.) являются с т.з. веб-программирования конкуретными между собой. Бессмыслено использовать больше одного из них при создании сайта или веб-приложения. 
    PHP - мой профильный ЯП, поэтому в изучение пойдет из них он. 
    Но в моей практике оказалось, что знание Python тоже было бы очень полезно. Дело в том, что питон можно применять и вне области веб-приложений. Да, собственно, как и остальные. Но в сравнении с PHP питон при решении более низкоуровневых задач производительнее, чем PHP. Мне пришлось столкнуться с ним при разработке автотестов, написанных на нём. 
    Поэтому добавлю к PHP и Python. Это будет две группы знаний. 
    С ними пойдут и сопутствующие им знания: их орм, фреймворки и библиотеки. Отделять их в отдельные группы не стану, как и выкидывать какие-либо библиотеки из них.
    Вопросы безопасности я бы вынес вообще в отдельный пункт. Единственное, что их здесь держит, это что указаны те направления безопасности, которые связаны с вебом: 
    XSS Сross Site Sсriрting внедрение в веб-страницу вредоносного кода 
    SQL injection Внедрение SQL-кода 
    CSRF Сross Site Request Forgery Межсайтовая подделка запроса
    Безопасность в программировании всегда очень важная составляющяя. Знать все её аспекты необходимо
    Comet и WebSockets связаны между собой, WebSocket это протокол полнодуплексной связи, любая модель работы веб-приложения, при которой постоянное HTTP-соединение позволяет веб-серверу отправлять данные браузеру без дополнительного запроса со стороны браузера.
    Автор зачем-то причислил сюда и Ajax. Да, AJAX - это тоже обмен данными между браузером и сервером. Но есть "но"... Аббревиатура AJAX расшифровывается и переводится на русский как Асинхронный JavaScript и XML. Следовательно, AJAX - это в группу JavaScript. Условность, да. Но не первая и не последняя в этих технологиях.
    HTML5 (CSS3) я бы соединил с canvas и WebGL и вынес в отдельную группу HTML5. Единственны нюанс: XHTML,CSS и верстка - это все-таки несного другое. Можно всё это соединить в группу front-end, но тогда надо сюда добавить JavaScript, но JavaScript слишком велик, чтобы быть в этой группе. У меня он сам идет отдельной группой. Да и канвас тоже соприкасается с яваскриптом. Дилемма, однако.
    Нужно пойти на компромисс. Всё-таки соединю HTML5 с canvas и WebGL, и с XHTML, CSS и версткой, объединю всё это в группу знаний  front-end, но JavaScript как полноценный ЯП, будет отдельной, самостоятельной группой. Но некоторые его элементы будут рассматриваться в тех областях HTML5, где без них не обойтись.
    Еще одна условность JavaScript.
    RSS семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Слишком незначительный объем, чтобы отдельно изучать. Пока только ознакомиться.
    И еще один момент с JavaScript. Это node.js. Автор включил его в группу JavaScript, но node.js - это платформа. Однако это платформа, транслирующая Javascript. Т.е. получается, что node.js - это и в группу JavaScript, и в группу WebSockets. 
    Лучшим компромиссом будет выделить его отдельной группой, но изучать после освоения групп JavaScript и WebSockets.
    highload это вообще отдельная тема. Это не просто целая группа знаний, это практически отдельная наука. Наука о высоких нагрузках. В состоянии огромных огромнейших нагрузок, значительной становится любая мелочь, вопросы производительности как железа, так и программного обеспечения, базы, а так же уместного и оптимального их сочетания зависит производительность, а то и вовсе работоспособность, ресурса под нагрузкой. Да, это отдельная тема. Тема для отдельного изучения.
    SWIG популярный инструмент с открытым исходным кодом, позволяющий интегрировать код C/C++ практически с любым распространенным языком сценариев. Довольно интересная, судя по описанию, штука. Я о ней сейчас узнал впервые. Изучить однозначно.

    Методологии разработки

    Waterfall modelмодель процесса разработки программного обеспечения, в которой процесс разработки выглядит как поток, последовательно проходящий фазы анализа требований, проектирования, реализации, тестирования, интеграции и поддержки.
    Rational Unified Process (RUP) методология разработки программного обеспечения, созданная компанией Rational Software. Если это - http://ru.wikipedia.org/wiki/RUP - она, то я думаю, она узкоспециализированная. но всё же поизучать стоит.
    Agile Гибкая методология разработки. Даже набор гибких методологий. Собственно, ScrumKanban и XP(Extreme Programming) являются входящими в нее методологиями.
    CASE (Computer-Aided Software Engineering) набор инструментов и методов программной инженерии для проектирования программного обеспечения, который помогает обеспечить высокое качество программ, отсутствие ошибок и простоту в обслуживании программных продуктов.
    Я бы сюда добавил бы еще IDEFSADT и UML.
    TDD — Test-driven development — Разработка через тестирование.
    BDD Разработка через поведение.

    Архитектура и стиль кода

    По третьему пункту много чего интеренсного. Почти всё на изучение.
    Стив Макконнелл американский программист, автор книг по разработке программного обеспечения. Его книги на русском языке: "Совершенный код", 2005; "Остаться в живых. Руководство для менеджера программных проектов. Библиотека программиста", 2006; "Профессиональная разработка программного обеспечения", 2006; "Сколько стоит программный проект", 2007.
    Мартин Фаулер автор ряда книг и статей по архитектуре ПО, объектно-ориентированному анализу и разработке, языку UML, рефакторингу, экстремальному программированию, предметно-ориентированным языкам программирования. Его книги на русском: "NoSQL: новая методология разработки нереляционных баз данных" (NoSQL Distilled), 2013; "Шаблоны корпоративных приложений" (Patterns of Enterprise Application Architecture), 2012; "Предметно-ориентированные языки программирования" (Domain-specific languages); "Архитектура корпоративных программных приложений" (Patterns of Enterprise Application Architecture); "Рефакторинг. Улучшение существующего кода"; "UML. Основы. Краткое руководство по унифицированному языку моделирования"; "Экстремальное программирование: планирование".
    Дэвид Лебланк, Майкл Ховард авторы таких книг, как: "19 смертных грехов, угрожающих безопасности программ. Как не допустить типичных ошибок", 2006; "24 смертных греха компьютерной безопасности", 2010; "Уязвимости в программном коде и борьба с ними", 2011; "Как написать безопасный код на С++, Java, Perl, PHP, ASP.NET", 2014.
    Андре́й Александре́ску румынский программист, известный благодаря своим исследованиям в области проектирования, основанного на стратегиях (Policy-based design), и реализованного посредством обобщённого программирования и метапрограммирования шаблонов. Его книги: "Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны проектирования" (Modern C++ Design: Generic Programming and Design Patterns), 2008; "Стандарты программирования на С++" (C++ Coding Standards: 101 Rules, Guidelines, and Best Practices), 2008.
    Герб Саттер известный эксперт по языку C++, автор книг и колумнист в Dr. Dobb's Journal. Его книги: "Решение сложных задач на С++", 2008; "Новые сложные задачи на С++", 2008; "Стандарты программирования на С++: 101 правило и рекомендация", 2008.
    Гради Буч американский инженер, руководитель исследований в IBM Research, IBM Fellow[en] с 2003 года; наиболее известен как создатель унифицированного языка моделирования UML, который он разработал совместно с Иваром Якобсоном и Джеймсом Рамбо. Одна из его книг и публикаций: "Объектно-ориентированный анализ и проектирование с примерами приложений (UML 2). Третье издание" (Object-Oriented Analysis and Design with Applications), 2010;
    Про Гамма я не нашел адекватной информации.
    С творчеством рассмотренных автором мне, думаю, стоит ознакомиться. Но без углубления в C++. Определенные книги нужно будет почитать.
    Защитное программирование (defensive coding) это стиль написания компьютерных программ, призванный сделать их более отказоустойчивыми в случае возникновения серьезных функциональных отклонений. Обычно подобное незапланированное поведение возникает из-за наличия багов в программе, но оно может быть обусловлено и совсем другими причинами: поврежденными данными, отказами аппаратного обеспечения, багами, которые возникают в программе в процессе ее доработки. Оказываясь в критической ситуации, код, написанный в защитном стиле, пытается принять максимально разумные меры с небольшим снижением производительности. Также такой код не должен допускать создания условий для возникновения новых ошибок.
    Шаблон проектирования или паттерн (англ. design pattern) в разработке программного обеспечения повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста. Обзор паттернов: http://citforum.ru/SE/project/pattern/. Это тоже большая отдельная тема для изучения.
    SOLID это аббревиатура пяти основных принципов дизайна классов в объектно-ориентированном проектировании — Single responsibility, Open-closed, Liskov substitution, Interface segregation и Dependency inversion.
    GRASP (англ. General Responsibility Assignment Software Patterns общие образцы распределения обязанностей) паттерны, используемые в объектно-ориентированном проектировании для решения общих задач по назначению обязанностей классам и объектам. GRASP-паттерны это хорошо документированные, стандартизированные и проверенные временем принципы объектно-ориентированного анализа, а не попытка привнести что-то принципиально новое.
    KISS (англ. keep it simple, stupid «не усложняй, тупица» или более вежливый вариант англ. keep it short and simple «делай короче и проще») процесс и принцип проектирования,[1] при котором простота системы декларируется в качестве основной цели и/или ценности. Имеют хождение разные расшифровки этого акронима. Эрик Рэймонд в своей книге резюмирует философию UNIX как широко используемый принцип KISS.
    Don’t Repeat Yourself (DRY, рус. Не повторяйся) это принцип разработки программного обеспечения, нацеленный на снижение повторения информации различного рода, особенно в системах со множеством слоёв абстрагирования. Принцип DRY формулируется как: «Каждая часть знания должна иметь единственное, непротиворечивое и авторитетное представление в рамках системы».
    Принцип «YAGNI» (англ. You Ain't Gonna Need It «Вам это не понадобится») процесс и принцип проектирования, при котором в качестве основной цели и/или ценности декларируется отказ от избыточной функциональности, т. е. отказ добавления функциональности, в которой нет непосредственной надобности.
    UML (англ. Unified Modeling Language унифицированный язык моделирования) язык графического описания для объектного моделирования в области разработки программного обеспечения. UML является языком широкого профиля, это открытый стандарт, использующий графические обозначения для создания абстрактной модели системы, называемой UML-моделью. UML был создан для определения, визуализации, проектирования и документирования, в основном, программных систем. UML не является языком программирования, но на основании UML-моделей возможна генерация кода.
    Объе́ктно-ориенти́рованное программи́рование (ООП, англ. - OOP) парадигма программирования, в которой основными концепциями являются понятия объектов и классов. В случае языков с прототипированием вместо классов используются объекты-прототипы.
    OOA - Объектно-ориентированный анализ.
    OOD - Объектно-оринтированное проектирование.
    Метрики кода позволяют разработчикам понять, какие типы или методы нуждаются в переработке или в более тщательном тестировании. Группы разработки могут увидеть возможные риски, понять текущее состояние проекта и отслеживать ход выполнения в процессе разработки программного обеспечения.
    Все описанные принципы необходимо изучить. Из рассмотрения я только убрал Smalltalk.

    Форматы

    XML (eXtensible Markup Language) язык разметки.
    XSLT (eXtensible Stylesheet Language Transformations) язык преобразования XML-документов.
    XPath (XML Path Language) язык запросов к элементам XML-документа.
    SAX (Simple API for XML) способ последовательного чтения/записи XML-файлов.
    Вышеперечисленные форматы должны изучаться в одной группе.
    DOM (Document Object Model «объектная модель документа») это не зависящий от платформы и языка программный интерфейс, позволяющий программам и скриптам получить доступ к содержимому HTML, XHTML и XML-документов, а также изменять содержимое, структуру и оформление таких документов. Это тоже относится к XML, но так же относится и к HTML.
    Что такое XMLStarlet, я не нашел
    Rich Text Format, RTF (англ. rich богатый; «формат обогащённого текста») проприетарный межплатформенный формат хранения размеченных текстовых документов, предложенный группами программистов.
    OpenDocument Format, ODF (от англ. OASIS Open Document Format for Office Application рус. открытый формат документов для офисных приложений) открытый формат файлов документов для хранения и обмена редактируемыми офисными документами, в том числе текстовыми документами (такими как заметки, отчёты и книги), электронными таблицами, рисунками, базами данных, презентациями.
    С этими двумя форматами ознакомления, думаю, достаточно. Плотно изучать их мне не нужно.
    YAML человекочитаемый формат сериализации данных, концептуально близкий к языкам разметки, но ориентированный на удобство ввода-вывода типичных структур данных многих языков программирования.
    JPEG PNG WebP - форматы изображений. Не думаю, что надо их знать глубже, чем я их знаю.
    AVI MPEG RIFF WAV MP3 OGG WebM - форматы видео. То же, что и с форматами изображений.
    SVG (Scalable Vector Graphics масштабируемая векторная графика) язык разметки масштабируемой векторной графики, созданный Консорциумом Всемирной паутины (W3C) и входящий в подмножество расширяемого языка разметки XML, предназначен для описания двумерной векторной и смешанной векторно/растровой графики в формате XML.
    Unicode, кодировки однобайтные UTF-8 UTF-16 UCS-2 UTF-32 - Это всё кодировки разные. Знать их желательно, хотя бы поверхностно.
    Всё, кроме текстовых и мультимедиа форматов, к изучению. А что касается текстовых форматов, разметки графики и форматов изображений и видео, то ознакомления хватит.

    Базы данных

    Грубера я не нашел.
    Кристофер Дейт (Christopher J. Date) специалист в области баз данных, независимый автор, лектор и консультант. Его книги: "Введение в системы баз данных" (Introduction to Database Systems), 2006; "Основы будущих систем баз данных: Третий манифест", 2004; "SQL и реляционная теория. Как грамотно писать код на SQL", 2010 и др.
    Есть два стандарта SQL: Oracle SQL и ANSI SQL. Американский национальный институт стандартов (American National Standards Institute, ANSI) объединение американских промышленных и деловых групп, разрабатывающее торговые и коммуникационные стандарты. Входит в ISO и Международную электротехническую комиссию, представляя там свою страну. Они издали стандарт SQL - ANSI SQL.
    Transact-SQL (T-SQL) процедурное расширение языка SQL, созданное компанией Microsoft (для Microsoft SQL Server) и Sybase (для Sybase ASE).
    ODBC (Open Database Connectivity) это программный интерфейс (API) доступа к базам данных, разработанный фирмой Microsoft, в сотрудничестве с Simba Technologies на основе спецификаций Call Level Interface (CLI).
    MySQL свободная реляционная система управления базами данных.
    PostgreSQL свободная объектно-реляционная система управления базами данных (СУБД).
    Microsoft SQL Server система управления реляционными базами данных (СУРБД), разработанная корпорацией Microsoft. Основной используемый язык запросов — Transact-SQL, создан совместно Microsoft и Sybase.
    Berkeley DB (BDB) высокопроизводительная встраиваемая система управления базами данных, реализованная в виде библиотеки. BDB является нереляционной базой данных она хранит пары «ключ значение» как массивы байтов и поддерживает множество значений для одного ключа.
    SQLite компактная встраиваемая реляционная база данных. Исходный код библиотеки передан в общественное достояние.
    Sphinx (SQL Phrase Index) система полнотекстового поиска, разработанная Андреем Аксеновым и распространяемая по лицензии GNU GPL. Отличительной особенностью является высокая скорость индексации и поиска, а также интеграция с существующими СУБД (MySQL, PostgreSQL) и API для распространённых языков веб-программирования (официально поддерживаются PHP, Python, Java; существуют реализованные сообществом API для Perl, Ruby,.NET[1] и C++).
    Хранимая процедура объект базы данных, представляющий собой набор SQL-инструкций, который компилируется один раз и хранится на сервере.
    Триггер (trigger) это хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено действием по модификации данных: добавлением INSERT, удалением DELETE строки в заданной таблице, или изменением UPDATE данных в определенном столбце заданной таблицы реляционной базы данных.
    Алгебра Кодда/А - реляционная алгебра, базирующаяся на теории множеств и являющаяся основой логики работы баз данных.
    Tutorial D абстрактное воплощение концепции D: D является концепцией набором требований, выдвинутых Дейтом и Дарвеном к тому, что является языком запросов к реляционной СУБД в их понимании.
    Нормальная форма свойство отношения в реляционной модели данных, характеризующее его с точки зрения избыточности, потенциально приводящей к логически ошибочным результатам выборки или изменения данных. Нормальная форма определяется как совокупность требований, которым должно удовлетворять отношение.
    ACID (AtomicityConsistencyIsolationDurability) - описывает требования к транзакционной системе (например, к СУБД), обеспечивающие наиболее надёжную и предсказуемую её работу. Atomicity Атомарность, Consistency Согласованность, Isolation Изолированность, Durability Надежность.
    Транзакция (transaction) группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще и тогда она не должна произвести никакого эффекта.
    Оптимизация запросов это 1) функция СУБД, осуществляющая поиск оптимального плана выполнения запросов из всех возможных для заданного запроса, 2) процесс изменения запроса и/или структуры БД с целью уменьшения использования вычислительных ресурсов при выполнении запроса. Один и тот же результат может быть получен СУБД различными способами (планами выполнения запросов), которые могут существенно отличаться как по затратам ресурсов, так и по времени выполнения. Задача оптимизации заключается в нахождении оптимального способа.
    Индексы - это специальные структуры в базах данных, которые позволяют ускорить поиск и сортировку по определенному полю или набору полей в таблице, а также используются для обеспечения уникальности данных.
    Теорема CAP (известная также как теорема Брюера), в информатике эвристическое утверждение о том, что в любой реализации распределённых вычислений возможно обеспечить не более двух из трёх следующих свойств: 1) согласованность данных (consistency) во всех вычислительных узлах в один момент времени данные не противоречат друг другу; 2) доступность (availability) любой запрос к распределённой системе завершается корректным откликом; 3) устойчивость к разделению (partition tolerance) расщепление распределённой системы на несколько изолированных секций не приводит к некорректности отклика от каждой из секций.
    NoSQL (англ. not only SQL, не только SQL), в информатике термин, обозначающий ряд подходов, направленных на реализацию хранилищ баз данных, имеющих существенные отличия от моделей, используемых в традиционных реляционных СУБД с доступом к данным средствами языка SQL.
    key-value storage - хранение данных по принципу ключ-значение. Применяется в NoSQL.
    Шардинг и репликация. Репликация позволяет создать полный дубликат базы данных. Шардинг это другая техника масштабирования работы с данными, суть его в разделении базы данных на отдельные части так, чтобы каждую из них можно было вынести на отдельный сервер.
    ORM (англ. Object-relational mapping, рус. Объектно-реляционное отображение) технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных».
    ERD - диаграмма сущность-связь (ER-диаграмма) (entity-relationship diagram, ERD); а так же ERM - модель сущность-связь (ER-модель) (entity-relationship model, ERM).
    OLAP (online analytical processing, аналитическая обработка в реальном времени) технология обработки данных, заключающаяся в подготовке суммарной (агрегированной) информации на основе больших массивов данных, структурированных по многомерному принципу.
    Всё нужно, всё изучить :)

    Тестирование

    Модульное тестирование, или юнит-тестирование (unit testing) процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.
    Функциональное тестирование это тестирование ПО в целях проверки реализуемости функциональных требований, то есть способности ПО в определённых условиях решать задачи, нужные пользователям. Функциональные требования определяют, что именно делает ПО, какие задачи оно решает.
    Нагрузочное тестирование (load testing) определение или сбор показателей производительности и времени отклика программно-технической системы или устройства в ответ на внешний запрос с целью установления соответствия требованиям, предъявляемым к данной системе (устройству).
    Интеграционное тестирование (Integration testing, иногда называется англ. Integration and Testing, аббревиатура англ. I&T) одна из фаз тестирования программного обеспечения, при которой отдельные программные модули объединяются и тестируются в группе. Обычно интеграционное тестирование проводится после модульного тестирования и предшествует системному тестированию.
    Тестирование интерфейса пользователя (UI testing) Тестирование графического интерфейса пользователя предполагает проверку соответствия приложения требованиям к графическому интерфейсу, профессионально ли оно выглядит, выполнено ли оно в едином стиле.
    Тестирование - вещь нужная. Изучить надо.

    Инструментальные средства разработки

    Интегри́рованная среда́ разрабо́тки (IDE, Integrated development environment) система программных средств, используемая программистами для разработки программного обеспечение (ПО).
    IntelliSense технология автодополнения Microsoft, наиболее известная в Microsoft Visual Studio. Дописывает название функции при вводе начальных букв. Кроме прямого назначения IntelliSense используется для доступа к документации и для устранения неоднозначности в именах переменных, функций и методов, используя рефлексию.
    Отла́дчик (деба́ггер, англ. debugger) компьютерная программа, предназначенная для поиска ошибок в других программах, ядрах операционных систем, SQL-запросах и других видах кода. Отладчик позволяет выполнять трассировку, отслеживать, устанавливать или изменять значения переменных в процессе выполнения кода, устанавливать и удалять контрольные точки или условия остановки и т.д.
    Популярные отладчики:
    1. AQtime коммерческий отладчик для приложений, созданных для .NET Framework версии 1.0, 1.1, 2.0, 3.0, 3.5 (включая ASP.NET приложения), а также для Windows 32- и 64-битных приложений;
    1. DBX стандартный отладчик уровня исходного кода для языков C, C++, Фортран и Java, доступный для операционных систем Solaris, AIX, IRIX, Tru64 UNIX, GNU/Linux и BSD;
    1. DDD графический фронтэнд к отладчикам DBX и GDB, использующий библиотеку виджетов Motif;
    1. DTrace фреймворк динамической трассировки для Solaris, OpenSolaris, FreeBSD, Mac OS X и QNX; DTrace не является отладчиком в классическом понимании этого термина, так как DTrace не может приостановить работу программы, из-за этого DTrace нельзя использовать для пошагового выполнения программы;
    1. Electric Fence отладчик памяти;
    1. GNU Debugger портабельный отладчик уровня исходного кода и дизассемблер из системы программирования GNU, работающий со многими языками программирования, операционными системами и системными архитектурами;
    1. LLDB отладчик уровня исходных кодов для множества POSIX-совместимых систем;
    1. IDA дизассемблер и отладчик уровня машинного кода для операционных систем семейств GNU/Linux и Windows;
    1. MDB универсальный модульный отладчик уровня исходного кода для Solaris, может использоваться как локальный отладчик ядра;
    1. Microsoft Visual Studio Debugger среда разработки программного обеспечения корпорации Microsoft, включающая средства отладки уровня исходного кода;
    1. OllyDbg бесплатный отладчик уровня машинного кода для операционных систем семейства Windows;
    1. Immunity Debugger отладчик, такой же, как OllyDbg, но с возможностью подключения скриптов на языке Python;
    1. SoftICE отладчик уровня ядра для операционных систем семейства Windows;
    1. Dr. Watson стандартный отладчик Windows, позволяет создавать дампы памяти;
    1. TotalView коммерческий отладчик для Unix;
    1. WinDbg бесплатный отладчик от корпорации Microsoft;
    1. FlexTracer коммерческий отладчик SQL-запросов для различных СУБД.
    strace утилита, отслеживающая системные вызовы, которые представляют собой механизм трансляции, обеспечивающий интерфейс между процессом и операционной системой (ядром). Эти вызовы могут быть перехвачены и прочитаны. Это позволяет лучше понять, что процесс пытается сделать в заданное время. Перехватывая эти вызовы, мы можем добиться лучшего понимания поведения процессов, особенно если что-то идет не так.
    ltrace утилита для трассировки библиотечных вызовов очень похожа на strace, но перехватывает только вызовы к динамическим библиотекам.
    strace и ltrace: доп.инфо 1, доп.инфо 2
    DWARF Debugging Information Format это стандартизованный формат отладочной информации. Подробнее
    Дизассе́мблер транслятор, преобразующий машинный код, объектный файл или библиотечные модули в текст программы на языке ассемблера.
    Декомпиля́тор это программа, транслирующая исполняемый модуль (полученный на выходе компилятора) в относительно эквивалентный исходный код на языке программирования высокого уровня.
    IDA Pro Disassembler (Interactive DisAssembler) интерактивный дизассемблер, который широко используется для реверс-инжиниринга.
    .NET Reflector платная утилита для Microsoft .NET, комбинирующая браузер классов, статический анализатор и декомпилятор, изначально написанная Lutz Roeder.
    Система управления версиями (Version Control System, VCS или Revision Control System) программное обеспечение для облегчения работы с изменяющейся информацией. Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое.
    Git распределённая система управления версиями файлов.
    Subversion (также известная как «SVN») свободная централизованная система управления версиями.
    Mercurial (англ. ртутный, подвижный), он же Hg (от обозначения химического элемента ртути) кроссплатформенная распределенная система управления версиями, разработанная для эффективной работы с очень большими репозиториями кода. В первую очередь она является консольной программой.
    merge/branch/trunk, системы именования файлов и бранчей - это всё терминология из области Систем управления версиями.
    Непрерывная интеграция (Continuous Integration) это практика разработки программного обеспечения, которая заключается в выполнении частых автоматизированных сборок проекта для скорейшего выявления и решения интеграционных проблем.
    Непрерывная интеграция является одним из основных приёмов экстремального программирования.
    Apache Ant (англ. ant муравей и акроним «Another Neat Tool») утилита для автоматизации процесса сборки программного продукта. Является платформонезависимым аналогом утилиты make.
    Code coverage Покры́тие ко́да мера, используемая при тестировании программного обеспечения. Она показывает процент, насколько исходный код программы был протестирован.
    Стати́ческий ана́лиз ко́да (static code analysis) анализ программного обеспечения, производимый (в отличие от динамического анализа) без реального выполнения исследуемых программ. В большинстве случаев анализ производится над какой-либо версией исходного кода, хотя иногда анализу подвергается какой-нибудь вид объектного кода
    Динамический анализ кода (Dynamic program analysis) анализ программного обеспечения, выполняемый при помощи выполнения программ на реальном или виртуальном процессоре (в отличие от статического анализа). Утилиты динамического анализа могут требовать загрузки специальных библиотек, перекомпиляцию программного кода. Некоторые утилиты могут инструментировать исполняемый код в процессе исполнения или перед ним. Для большей эффективности динамического анализа требуется подача тестируемой программе достаточного количества входных данных, чтобы получить более полное покрытие кода. Также требуется позаботиться о минимизации воздействия инструментирования на исполнение тестируемой программы (включая временные характеристики).
    Valgrind инструментальное программное обеспечение, предназначенное для отладки использования памяти, обнаружения утечек памяти, а также профилирования.
    Фаззинг это один из подвидов тестирования безопасности. Это технология тестирования программного обеспечения, когда вместо ожидаемых входных данных программе передаются случайные или специально сформированные данные.
    Верификация и валидация ПО (Frama-C, RAISE (RSL), Coq):
    • Верификация подтверждение на основе представления объективных свидетельств того, что установленные требования были выполнены. Это проверка, проверяемость, способ подтверждения с помощью доказательств каких-либо теоретических положений, алгоритмов, программ и процедур путем их сопоставления с опытными (эталонными или эмпирическими) данными, алгоритмами и программами.
    • Валидация подтверждение на основе представления объективных свидетельств того, что требования, предназначенные для конкретного использования или применения, выполнены.
    • Frama-C открытый, интегрированный набор инструментов для анализа исходного кода на языке Си доступен для загрузки под лицензией GNU LGPL v2.
    • Coq это интерактивная оболочка для доказательства теорем, в которой используется собственный функциональный язык программирования с зависимыми типами – Gallina. Его придумали и реализовали сотрудники французского института INRIA в середине 80-х годов. В настоящее время Coq доступен для GNU/Linux, Windows и MacOS. Исходные коды распространяются на условиях лицензии LGPL v.2.
    • RSL — RAISE Specification Language
    Профайлинг (Profiling) представляет собой автоматизированный анализ того, сколько времени тратится на выполнение различных частей вашей программы.
    Система отслеживания ошибок (bug tracking system) прикладная программа, разработанная с целью помочь разработчикам программного обеспечения (программистам, тестировщикам и др.) учитывать и контролировать ошибки и неполадки, найденные в программах, пожелания пользователей, а также следить за процессом устранения этих ошибок и выполнения или невыполнения пожеланий.
    Документирование кода. Есть немало утилит и библиотек, занимающихся обработкой документации к коду.
    CMake (cross platform make) это кроссплатформенная система автоматизации сборки программного обеспечения из исходного кода.
    Автоматизация сборки этап написания скриптов или автоматизация широкого спектра задач применительно к ПО, применяемому разработчиками в их повседневной деятельности, включая такие действия, как: компиляция исходного кода в бинарный код; сборка бинарного кода; выполнение тестов; разворачивание программы на производственной платформе; написание сопроводительной документации или описание изменений новой версии.