воскресенье, 23 июля 2017 г.

Инструментарий C++-программиста

Юрий “yurembo” Язев

Интегрированная среда Visual Studio содержит исчерпывающий набор инструментов для разработки различных приложений под популярные настольные, серверные и мобильные платформы. Не только Windows, но и macOS, iOS, Linux, Android. И это прекрасно на самом деле!

Между тем, есть ряд задач, которые Visual Studio не охватывает или решает не очень хорошо. В то же время, для каждой из них есть решение от третьих разработчиков. Я составил джентельменский набор C++-разработчика, в результате использования которого совместно с Visual Studio, на мой взгляд, делает программирование на этом языке продуктивнее, приятнее и менее трудозатратным.

1. У JetBrains есть ReShaper C++, его стоимость составляет $199 в год. С другой стороны, у Whole Tomato  есть Visual Assist стоимостью $99 на все время. Предлагаю остановиться на втором. Visual Assist представляет собой плагин для студии. Он значительно расширяет работу IntelliSense, проводит статический анализ кода, тем самым позволяет выявлять орфографические ошибки до непосредственной компиляции, осуществляет подсветку синтаксиса, расширяет средства форматирования, поиска, переименования. Также он добавляет возможность оптимизации и генерации кода. Предоставляет средства рефакторинга (выделение кода в метод, etc.). Данная тулза оптимизируют процесс кодинга, делает его приятнее, избавляя программиста от многих головняков.

2. Когда программируешь на C++, необходимо следить за указателями во избежание появления утечек памяти. С умными указателями ситуация значительно упростилась, однако проблема не исчерпана. Для обнаружения утечек памяти можно воспользоваться средствами, предлагаемыми разработчиками процессоров: Intel, AMD. Они, особенно первая, предлагают широкий ряд средств. В некоторых случаях они платные. И во всех случаях сложные в использовании. А нам нужна тулза, которую можно юзать, не покидая студию. На самом деле, Visual Studio предоставляет средство для поиска утечек памяти, но оно неудобно в использовании и недостаточно информативно. Для исправления этих невзгод можно воспользоваться свободной утилитой Visual Leak Detector (VLD). Для его использования надо в Visual Studio указать на библиотечный и заголовочный файлы: <vld.h>. В конце выполнения программы под отладчиком Visual C++, VLD выведет отчет по всем обнаруженным утечкам памяти вместе с номерами строк, где они были выявлены. Кроме того, VLD можно установить с помощью NuGet.

3. Разработка, основанная на тестах (TDD), становится предпочтительным (если не основным) методом разработки программного обеспечения. Почему так произошло и что такое TDD – тема отдельного разговора. Для покрытия тестами C++-кода имеется довольно много фреймворков. Среди них: CppUtest, CppUnit и другие. Между тем, самым удобным и содержащим наибольшее количество полезных средств я считаю GoogleTest. Можно скачать с GitHub’а и установить самостоятельно, предварительно построив фреймворк из исходников. А можно воспользоваться тулзой Extension and Update, входящей в Visual Studio, которая автоматом подключит фреймворк к открытому проекту.

4. Если в качестве системы контроля версий ты используешь GitHub, то, чтобы, не выходя из студии коммитить изменения (и осуществлять другие операции с кодом), рекомендую установить свободную тулзу GitExtension. Она добавит в студию дополнительную вкладку, на которой ты можешь работать с GitHub подобно Team Foundation Server. Но закрытый репозитарий на GitHub стоит денег. Если платить жалко, команда разработчиков небольшая (до 5 человек включительно), можно воспользоваться сервисом BitBucket. Он подобен GitHub, однако для маленьких проектов закрыты репозитарий предоставляется бесплатно. Если же надо работать с Git посредством внешнего клиента (предположим ты не используешь Visual Studio), тогда рекомендую использовать клиент SourceTree. Из всего многообразия существующих Git-клиентов этот, на мой взгляд, самый удобный. К слову, он, как и вышеупомянутый сервис, разработан австралийской компанией Atlassian.

5. И последняя по порядку, но не по значимости незаменимая тулза для программирования на C++ - это библиотека Boost. Многое из того, что сейчас находится в стандартной библиотеке языка взяло свое начало в Boost: умные указатели, r-value ссылки, семантика перемещения и прочее. Кроме имеющихся в STL контейнеров, Boost предоставляет дополнительные. Но Boost этим не ограничивается, по большому счету, это библиотека библиотек. И она среди прочего включает расширенные средства для сетевого программирования, математического моделирования, многопоточного программирования, работой с графами, обобщенного и метапрограммирования, различные алгоритмы и мн. др.

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

вторник, 11 июля 2017 г.

Переосмысление STL через паттерны проектирования

Об изучении паттернов и немного о шаблонах

Юрий «yurembo» Язев

Каким образом мы изучаем STL? Обыкновенно это бывает следующим образом: изучив C++, сразу переходим к изучению STL. Хорошо, если при изучении первого, должным образом отнеслись к шаблонам, обычно этого нет. Их синтаксис пугает, их применение не понятно, решаемые с помощью них задачи покрыты мглой.

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

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

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

Учебники по C++ часто кроме самого языка охватывают стандартную библиотеку и содержащую ею STL. Было бы хорошо, если бы там был раздел, посвященный паттернам. Но в таком случае и так не тонкая книга по основам C++ приобрела бы совсем угрожающий вид. Взгляните на «Язык программирования C++. Специальное издание» Бьерна Стауструпа – внушительная книжка. Но в ней нет ни слова о паттернах. Нельзя объять необъятное. C++ как раз относится к этой теме.

Я могу выделить 3 книги по паттернам проектирования. Библией о паттернах заслуженно считается книга 1995-го года выпуска «Приемы объектно-ориентированного проектирования. Паттерны проектирования», написанная широко известной «бандой четырех», куда входят: Гамма, Хелм, Джонсон, Влиссидес. В ней рассмотрены 23 самых распространенных паттерна, предназначенных для «общего пользования». Материал хорошо структурирован: есть описание каждого паттерна, область его применения, пример использования вместе с исходным кодом на C++ или Smalltalk (ныне незаслуженно забытый язык; yurembo лет 5 назад пытался его изучить, но его применению на нашлось места). Тем не менее, для тех персонажей, кто впервые сталкивается с паттернами, книжка тяжело читается.

Много лет спустя вышла книжка «Паттерны проектирования» Эрика и Элизабет Фриман. У издательства O’Reilly, которое издала эту книгу, есть особая категория «Head First». В книгах, попадающих под эту категорию, материал подается особым образом. Если в процессе чтения обычной книги по программированию читатель ведет беседу с автором, то в «Head First» кроме автора на страницах книги можно встретить других персонажей, которые ведут диалоги между собой наподобие комиксов. Плюс уместные, логически верные иллюстрации помогают лучше усвоить предлагаемый материал.

Материал книги построен относительно языка Java, то есть все примеры приведены на этом языке. Однако для их понимания будет достаточным лишь поверхностного знания языка. Поскольку в первую очередь я ориентирую этот пост на C++-программистов. В книге подробно с примерами и доскональным объяснением описаны 14 паттернов проектирования. Сначала я рекомендую прочесть эту книгу, а потом, когда будет общее понимание паттернов, как их использовать и с чем их едят, для более глубокого усвоения материала перейти к библии «банды четырех».

Примерно в том же году, что предыдущая книжка, в другом издательстве вышла книга «Принципы, паттерны и методики разработки на языке C#» Роберта и Мика Мартин(ов). Рекомендую ее товарищам, которые программируют на C#. Сам ее еще не читал, не было необходимости, но говорят: «хорошая книга».

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

Между тем к этим трем книгам, посвященным использованию паттернов проектирования на разных языках программирования, я могу прибавить еще одну книженцию. Много-много лет назад по своей неопытности (только-только начал изучать C++) я купил книгу «Современное проектирование на C++» Андрея Александреску, предназначенную явно не для начинающих программистов. Эта книга взорвала мне мозг и на многие годы вперед заставила меня искать ответы на появившиеся вопросы, за что я ей и автору благодарен. Книг посвящена обобщенному программированию на C++ с использованием шаблонов, так же в ней описана разработка компонентов библиотеки, созданной автором, на основе паттернов проектирования.

В упомянутых выше книгах обсуждаются паттерны «общего пользования». Они будут одинаково полезны во всех областях разработки программного обеспечения. Вместе с тем существует такие паттерны, которые являются полезными в узком направлении разработки специфического ПО. Например, в программировании многопоточных приложений есть свои паттерны, которые будут бесполезны в других видах ПО. Есть отдельная область применения паттернов – GameDev. Использование общих паттернов там имеет свою специфику. Кроме того, в игрострое есть свои особенные паттерны, которые не будут иметь большого смысла в других областях. Таких областей применения паттернов проектирования ровно столько, сколько видов ПО существует: мобильное, системное, веб и многое другое. Везде есть свои наблюдения, общеизвестные решения распространенных задач, поэтому везде есть паттерны.

И под конец. Изучение STL не представляет проблемы, имеется огромное количество учебников по теме. Все эти книги довольно старые, но при этом они нисколько не утратили своей значимости, вот некоторые из них: «C++ и STL. Справочное руководство» Дэвида Мюссера, Жилмера Дерджа, Атула Сейни. Прекрасное, довольно краткое, но при этом подробное описание STL с примерами использования. Мюссер, к слову, участвовал в разработке черновых версий библиотеки.
«Обобщенное программирование и STL: использование и наращивание стандартной библиотеки шаблонов STL» - более подробное руководство по теме.
«C++. Стандартная библиотека» кроме STL включает описание стандартной библиотеки. Книга еще старее, приведенных выше, но при этом в ней есть описание «скользких» мест C++, которые не освещены в других более современных изданиях.
И моя любимая книга по теме: «Эффективное использование STL» Скотта Мейерса. Крутой чувак. В этой книге он дает 50 классных советов по использованию STL. Каждый из них подкреплен интересным примером.

суббота, 1 июля 2017 г.

О языках программирования и влиянии искусственного интеллекта
Юрий “yurembo” Язев

Развитие цифровых технологий и искусственного интеллекта прямым образом отражается на средствах и методах программирования. На заре информатики и цифровых машин мы (очень обобщенно yurembo имеет в виду программистов) писали программы с помощью перфокарт, то есть прямо в машинных кодах. Затем появился язык ассемблера. На следующем витке развития появились первые языки высокого уровня, позволяющие писать программы на языке близком к человеческому: Fortran, Algol, Basic, Cobol и другие. Следующим уровнем стало структурное программирование, внедрившее процедуры, функции и само-собой структуры, представляющие составные и самостоятельные типы данных: Pascal, C. Одновременно развивались функциональные языки программирования: Lisp, Prolog. Потом появилось ООП, основанное на четырех монументальных принципах: абстракции, инкапсуляции, наследовании и полиморфизме. Это такие современные и не очень языки программирования: Smalltalk, C++, Java, C#.

Одновременно с этим в области баз данных корпорацией IBM был создан язык SEQUEL (позднее переименованный в SQL). По-сути, он не относится ни к алгоритмическим, ни к функциональным языкам, представляя собой отдельный класс. С его помощью общение с машиной в целях получения конкретных данных происходит на еще более высоком, близком к межчеловеческому уровне.

Пока в области алгоритмических языков круче ООП ничего не придумано. Однако происходит бурное развитие функциональных языков: Haskell, F#. Осуществляется разработка систем для упрощения и ускорения разработки с помощью современных и востребованных ООП языков, создание конструкторов, позволяющих собирать программы из готовых блоков, различные CASE-средства. Высокоуровневые компиляторы - это интеллектуальные работники. По этой картине видно, как преобразовывались технологии программирования, улучшались средства разработки программного обеспечения вместе с эволюцией цифровых технологий.