Ці книги повинен прочитати кожен, хто вважає себе програмістом!

  1. Зміст статті Користь не у багатьох, але в хороших книгах. Сенека Всі ми прекрасно розуміємо:...

Зміст статті

Користь не у багатьох, але в хороших книгах.

Сенека

Всі ми прекрасно розуміємо: щоб стати професійним програмістом, необхідно читати спеціалізовану технічну літературу. Але на сьогоднішній день є величезна кількість різних видань по програмуванню. Цілого життя не вистачить, щоб здолати і половину з них. Які ж книги потрібно читати в першу чергу? Без будь книг не можна обійтися? У цій статті ми розповімо про тих працях великих авторів, з якими повинен бути знайомий кожен професійний розробник.

У цій статті ми розглянули не всі книги з золотого фонду программерскую думки. Наступні Х книг ти знайдеш в десятому номері.

Пишіть код так, як ніби супроводжувати його буде схильний до насильства психопат, який знає, де ви живете.

Складно знайти гуру програмування, яка не читала «Досконалий код» Стіва Макконнелла. Дійсно, одна книга, хоч і немаленька (трохи менше 900 сторінок), покриває практично всі аспекти розробки ПЗ: від рецептів написання високоякісного коду, механізмів тестування і налагодження до стратегій оптимізації коду і психологічних факторів, що впливають на розробку. Уяви собі: бібліографія книги займає 20 сторінок і містить понад 500 джерел! Книга «Досконалий код» - одне з найбільш корисних і, як наслідок, популярних видань з розробки ПЗ. Вона неодноразово довела це, очолюючи рейтинги книг з програмування ( goo.gl/3q0kx ). Завдяки простій манері викладу, особливому стилю та почуттю гумору Стіва книга читається дуже легко.

Говорячи про проектування і конструювання програмних систем, Макконнелл виробить Головний Технічний Імператив Розробки ПЗ - управління складністю. Простота і ясність вихідного коду і архітектури системи визначають її якість. Велика частина книги присвячена написанню високоякісного коду. Макконнелл, як ніхто інший усвідомлюючи значимість дрібниць, детально описує всі правила, якими необхідно керуватися при написанні хорошого коду. Необхідний рівень абстракції, розробка якісних інтерфейсів класів і пакетів, написання високоякісних методів, вибір вдалих імен змінних, спрощення керуючих структур, коментування коду - ніщо не залишається поза увагою автора. Наприклад, загальним принципам використання змінних відведено цілий розділ книги більш ніж на 100 сторінок. Тільки питання вибору імен змінних присвячений цілий розділ на 30 сторінок. При цьому всі правила і поради даються виключно з практичної точки зору.

У частині, в якій йдеться про якість ПЗ в цілому, Макконнелл формулює Головний Закон Якості ПО: підвищення якості системи знижує витрати на її розробку. Причина зрозуміла - більшу частину часу програмісти займаються читанням і налагодженням написаного коду, тоді як на власне написання йде близько 10% робочого часу. Тому підтримка якості коду системи на високому рівні економить багато часу і тим самим підвищує ККД програміста.

Автор не залишає поза увагою і різні методики розробки. Докладно описується парне програмування, ревізії коду, формальні і неформальні інспекції, розробка на основі тестування. «Рефакторинг» - єдина глава книги, яку можна назвати «слабкою». При розгляді методів рефакторинга наводиться лише довгий список його видів з книги М. Фаулера «Рефакторинг». При цьому немає жодного конкретного прикладу коду. Розділ носить скоріше ознайомлювальний характер.

Говорячи про підвищення продуктивності ПО, автор наводить переконливі доводи проти передчасної оптимізації, коли програміст в процесі розробки інтуїтивно розпізнає «вузькі» місця в програмі і негайно вживає заходів щодо оптимізації на шкоду якості коду. Наведена статистика показує, що в 9 з 10 своїх припущень програміст помиляється.

Підвести підсумки можна словами Джона Роббінса: «Це просто найкраща книга по конструюванню ПО з усіх, що коли-небудь траплялися мені в руки. Кожен розробник повинен мати її і перечитувати від кірки до кірки щороку. Я щороку перечитую її на протязі ось вже дев'яти років і все ще дізнаюся багато нового! »

»

Написати код, зрозумілий комп'ютеру, може кожен, але тільки хороші програмісти пишуть код, зрозумілий людям.

М. Фаулер

Практично будь-яке видання про рефакторінгу посилається на книгу Мартіна Фаулера «Рефакторинг». Дійсно, в цій книзі Фаулер зробив неможливе - в гранично зрозумілою формі доніс до читачів майже повністю вичерпний опис поняття «рефакторинг», його призначення, особливості та методи реалізації.

При чималій обсязі (400 сторінок) книга читається буквально за пару вечорів, від неї просто неможливо відірватися. Головна причина запаморочливого успіху книги - її практична спрямованість. Всі ми знаємо, що найскладніше завдання при подачі матеріалу - привести хороший показовий приклад. У цьому Фаулеру немає рівних. Книга починається з прикладу поліпшення програми, який відразу з головою затягує читача в світ рефакторінга. Всього 40 сторінок прикладу дають нам цілком конкретне уявлення про рефакторінгу, його цілі, принципи та основні методи реалізації. Мартін визначає рефакторинг як «зміна у внутрішній структурі ПЗ, яке має на меті полегшити розуміння його роботи і спростити модифікацію, не зачіпаючи спостережуваного поведінки». Але коли необхідно проводити дану зміну? Які символи ви бачите може бути піддано переробці? Автор дає вичерпні відповіді на ці питання. Він вводить правило «трьох ударів»: «Після трьох ударів починайте рефакторинг». Тобто коли ви робите щось аналогічне в третій раз, це сигнал для початку рефакторінга. Розділ «Код з душком» дає нам чітке уявлення про те, який же код вимагає поліпшення. До ознак такого коду відносяться: довгий метод, великий клас, довгий список параметрів методу, дублювання коду, оператори типу switch, тимчасові поля, відмова від спадщини, недоречна близькість класів і багато іншого.

Фаулер, як прихильник TDD (Test-driven development), присвячує главу книги створення автоматичних тестів і опису середовища JUnit. Якщо виявлена ​​помилка, спочатку необхідно написати автоматичний тест, що виявляє її, і лише потім проводити виправлення. Це дозволить в майбутньому не наступати на одні й ті ж граблі. Аналогічно перед проведенням рефакторінга слід написати тест для поліпшується коду, щоб забезпечити незмінність його поведінки.

Велику частину книги займає каталог методів рефакторинга. Він містить розділи, присвячені складанню методів, переміщенню функцій між об'єктами, організації даних, спрощення умовних виразів і викликів методів, вирішення завдань узагальнення і великим архітектурним рефакторингом. Багато з методів рефакторинга автоматизовані в популярних IDE. Наприклад, Visual Studio надає можливості з автоматичного виділення методу (ExtractMethod), видалення параметра (RemoveParameter), виділенню інтерфейсу (ExtractInterface) та ін. Як крупні рефакторингов рівня системи Фаулер наводить такі: поділ ієрархії успадкування, яка виконує більше однієї задачі, перетворення процедурного підходу до проектування в об'єктно-орієнтований підхід, відділення предметної області від рівня представлення, а також виділення ієрархії, що має на увазі розбиття великого класу на цілу ієрархію значний ьно менших за розміром і більш спеціалізованих підкласів.

Прочитавши цю книгу, більшість програмістів змінює свій підхід до написання коду. Вони стають більш грамотними, акуратними і уважними до свого творіння. Книга обов'язкова до прочитання для всіх програмістів, що прагнуть до досконалості в своєму ремеслі.

Проектування об'єктно-орієнтованих програм - нелегка справа, а якщо їх потрібно використовувати повторно, то все стає ще складніше.

Е. Гамма

Запитайте у досвідченого розробника, яку книгу з об'єктно-орієнтованого програмування вам обов'язково варто прочитати. В абсолютній більшості випадків він порадить саме цю. Відносно даної книги слово «бестселер» звучить недостатньо виразно, адже з моменту її випуску було продано вже понад півмільйона примірників англійською та тринадцяти інших мовах!

Дуже часто початківець розробник самостійно береться за вирішення вже понад тисячу раз вирішеної до нього завдання проектування і винаходить чергову різновид п'ятиколісний велосипеда, істинно пишаючись своїм «нововведенням». Володіння мовою патернів дозволяє вирішити безліч завдань проектування найбільш оптимальним способом, витрачаючи при цьому мінімум зусиль. Всього двадцять описаних в книзі патернів надають інструментарій для вирішення величезного спектру завдань проектування ПО. Матеріал книги досить складний і вимагає від читача певних знань в області об'єктно-орієнтованого проектування. Для освоєння патернів недостатньо просто прочитати книгу, необхідно грунтовно над нею «попітніти». Втім, твої зусилля не пройдуть даром. Книга містить 350 сторінок і складається з двох частин. У першій частині дається загальне поняття патернів проектування, описується їх практичне застосування на прикладі створення візуального редактора документів Lexi. Друга частина книги містить каталог патернів з докладним описом призначення, структури, особливостей реалізації та прикладами застосування кожного патерну.

Колектив авторів відомий як Gang of Four ( «Банда чотирьох»), тому представлені в книзі патерни називають GoF. Автори розбивають всі безліч представлених патернів на три групи: породжують патерни, структурні патерни і патерни поведінки. Породжують патерни вирішують задачу інстанцірованія (створення екземплярів) класів. До найпопулярніших паттернам в даній групі можна віднести AbstractFactory (абстрактна фабрика), FactoryMethod (фабричний метод) і Singleton (одинак).

Структурні патерни призначені для вирішення питань компоновки системи на основі класів і об'єктів. До них відносяться такі найважливіші патерни, як Adapter (адаптер), Bridge (міст), Composite (компоновщик), Proxy (заступник) і Façade (фасад). Патерни поведінки пов'язані з алгоритмами і питаннями розподілу обов'язків між класами. Тут необхідно згадати Strategy (стратегія), TemplateMethod (шаблонний метод), Observer (спостерігач), Command (команда) і Iterator (итератор).

Єдине, що може збентежити читача, - деякі приклади в книзі написані на маловідомому на сьогоднішній день мовою програмування Smalltalk, а для зображення діаграм класів замість звичного UML використовується OMT (Object Modeling Technique).

Гуру ООАіП Мартін Фаулер пише: «Паттерни GoF - це найкраща з коли-небудь виданих книг з об'єктно-орієнтованого проектування. Ця книга надзвичайно впливова в індустрії програмного забезпечення - тільки подивіться на бібліотеки Java і .NET, які буквально кишать паттернами GoF ». Не існує фахівця в області об'єктно-орієнтованого проектування, незнайомого з паттернами GoF, а якщо такий і є, то в цьому випадку його, швидше за все, не можна назвати фахівцем.

Уміння писати код - важка робота. Вона не обмежується знанням патернів і принципів. Над кодом необхідно попотіти.

Р. Мартін

«Чистий код» - одна з найбільш вдалих книг, присвячених написанню високоякісного коду. Розмір книги - 360 сторінок, не рахуючи додатків. При цьому вона настільки захоплююча і доступна, що за два-три вечори запросто прочитаєш її від корки до корки. У дружній манері «дядечко» Боб розповідає нам, якими ж принципами треба керуватися, щоб писати хороший код. Книга рясніє прикладами з реальних додатків, з якими автор стикався у своїй практиці. Серед них такі відомі продукти, як JUnit, FitNesse, JDepend, Ant і TomCat.

Книга розділена на три частини. Перша частина - теорія написання «чистого» коду: прийоми, патерни і принципи, яких необхідно дотримуватися розробнику. Друга частина носить практичний характер і детально описує сам процес «чистки» коду існуючих додатків. Третя частина підводить підсумки всієї книги і містить перелік «запахів коду» і методів їх усунення.

В теоретичній частині докладно описуються принципи іменування змінних, методів і класів, правила створення функцій, написання коментарів, форматування коду, принципи обробки помилок і написання модульних тестів. Цілий розділ присвячений особливостям створення багатопоточних додатків. Роберт дає зрозуміти, що добре написати код недостатньо.

Необхідно підтримувати його чистоту з плином часу, щоб запобігти «загнивання». Тому він вводить «правило бойскаута»: «Залиш місце стоянки чистіше, ніж воно було до твого приходу». Тобто з яким би ділянкою коду ми не працювали, потрібно намагатися в підсумку зробити його якіснішим, ніж він був. В такому випадку, код не буде загнивати і залишиться чистим.

При створенні функцій на перше місце ставляться компактність, правило однієї операції і одного рівня абстракції - очевидні на перший погляд принципи, які так часто порушуються програмістами. Будучи затятим адептом TDD, Мартін вказує на важливість «чистоти» не тільки коду кінцевого продукту, але і коду модульних тестів. Він іронічно зауважує: «Якими відмітними ознаками характеризується чистий тест? Трьома: легкість для читання, легкість для читання і легкість для читання ».

Мабуть, єдиний недолік книги - це її Java-орієнтованість. Всі представлені приклади написані виключно на мові Java. При цьому велика кількість порад і «запахів коду» характерні в основному для Java-коду.

На початку книги Роберт призводить відповіді метрів програмування на питання, що ж таке «чистий код». Греді Буч відповідає: «Чистий код простий і прямолінійний. Чистий код читається, як добре написана проза. Чистий код ніколи не затемнює наміри проектувальника; він сповнений чітких абстракцій і простих ліній передачі управління ». Програмісти, які прагнуть писати «чистий код», просто зобов'язані прочитати цю книгу.

Програмісти, які прагнуть писати «чистий код», просто зобов'язані прочитати цю книгу

Кращий спосіб в чомусь розібратися до кінця - це спробувати навчити цьому комп'ютер.

Д. Кнут

Програміст, у якого немає книги «Мистецтво програмування», як священнослужитель, який не має Біблії. Монографію Дональда Кнута часто називають «Біблією програміста». Вона містить докладний опис і аналіз найважливіших фундаментальних алгоритмів, використовуваних в інформатиці, а також безліч практичних завдань для засвоєння і закріплення представленого матеріалу. Журнал American Scientist включив роботу Кнута в список дванадцяти кращих фізико-математичних монографій XX століття поряд з роботою Ейнштейна з теорії відносності. Успіх книги визначила якість викладу і глибина аналізу загальних питань програмування.

Кнут почав роботу над «Мистецтвом програмування» ще в 1962 році. За задумом автора монографія повинна складатися з семи томів. Поки було видано три перші томи, а також перша половина четвертого. Всі видані на сьогоднішній день матеріали становлять майже 3000 сторінок. Читати книгу зовсім не просто (як, втім, і Біблію), головним чином тому, що всі приклади розглядаються на низкоуровневом мовою програмування - асемблері для гіпотетичного вигаданого автором комп'ютера MIX. Тому у програміста навряд чи вийде використовувати книгу в якості набору готових рецептів для вирішення конкретних завдань. Ця книга дає програміст не рибу, а скоріше хорошу вудку, за допомогою якої він зможе не без певних зусиль самостійно наловити риби.

Перший том присвячений основним алгоритмам і складається з двох глав. Перша глава готує читача до роботи над книгою. Тут розглядаються основні математичні поняття і теореми, на яких базується весь матеріал. Читач знайомиться з «поліненасичених комп'ютером» MIX, його архітектурою і його мовою асемблера. Другий розділ присвячено інформаційним структурам і алгоритмам роботи з ними. Тут розглядаються дерева, багатозв'язкові структури, лінійні списки, в тому числі стеки, черги, деки, циклічні і двічі пов'язані списки та інше.

Другий том містить у собі третю і четверту глави. Третя глава присвячена роботі з випадковими числами і послідовностями. У четвертому розділі описуються питання арифметики, а саме різні види систем числення, арифметика чисел з плаваючою точкою і раціональних чисел, поліноміальна арифметика і інше. Третій том присвячений алгоритмам сортування і пошуку (відповідно, глави 5 і 6). З четвертого тому опубліковані матеріали сьомої глави, яка описує питання комбинаторного пошуку.

Виходячи з планів автора, в четвертий том також увійде восьма глава, в якій розглядаються рекурсивні алгоритми. У п'ятому томі буде містити матеріали за синтаксичними алгоритмам, в тому числі по лексикографічним і синтаксичному пошуку. Очікують видання шостий і сьомий томи будуть присвячені теорії мов і компіляторам.

У своєму відгуку про роботу Кнута Білл Гейтс сказав: «Якщо ви вважаєте себе дійсно гарним програмістом ... прочитайте" Мистецтво програмування "(Кнута) ... Якщо ви зможете прочитати весь цей труд, то вам безумовно слід відправити мені резюме». Цитата зайвий раз підкреслює, що, незважаючи на складність матеріалу, справжній професіонал обов'язково повинен подужати працю Дональда Ервіна Кнута «Мистецтво програмування».

Програмісти-прагматики не ухиляється від відповідальності. Замість цього вони відчувають радість, приймаючи виклики і поширюючи свій досвід.

Ендрю Хант

Книга «Програміст-прагматик» повністю виправдовує свою назву. Вікісловник каже, що прагматик - це той, «хто ставить практичну корисність, вигоду вище за все». Програмісти-прагматики орієнтуються в першу чергу на практичну успішність реалізованих проектів. Автори на підставі свого багатющого досвіду програмування створили структурований набір практичних порад для програмістів. Невеликий розмір книги (270 сторінок) говорить про високу концентрацію важливою для програміста інформації.

Практично всі викладені в книзі теми пояснюються виразними аналогіями, які часом вражають своєю точністю. У книзі проводяться паралелі між неякісним кодом і теорією розбитого вікна, столярним справою і роботою програміста, водінням автомобіля і написанням коду, стріляниною трасуючими кулями і створенням прототипів ПО, ходінням по мінному полю і програмуванням в розрахунку на збіг обставин. В кінці кожного розділу наводяться питання для обговорення та вправи, що зайвий раз підкреслює практичну спрямованість книги.

Одним з найбільш чудових принципів програмування, яким ми зобов'язані авторам, є принцип DRY (Do not Repeat Yourself), що в перекладі на російську означає: «Не повторюй самого себе». Це означає, що кожен фрагмент знання повинен мати єдине і однозначне уявлення в системі. Дотримання цього принципу дозволяє підвищити надійність, доступність і простоту супроводу програмного продукту.

У розділі, присвяченому загальної філософії прагматичного програмування, ми дізнаємося, яким автори бачать програміста-прагматика: він завжди приймає відповідальність за свій код, стежить за станом свого продукту, постійно вдосконалюється, спілкується і знаходить компроміс з користувачами. Глава «Прагматичний підхід» говорить про загальні методиках розробки та оцінки трудомісткості проектів. Найважливіша глава «Гнучкість проти крихкості» розповідає, яким же чином необхідно створювати дійсно гнучкі і стійкі до зміни системи. З глави «Перед тим, як почати проект» можна дізнатися про процедуру формування і затвердження вимог до системи. «Прагматичні проекти» знайомлять нас з критичними аспектами створення реальних проектів, такими як робота в команді, тестування і формування документації.

Єдине, що може зіпсувати враження про книгу, так це недостатньо якісний переклад на російську мову і наявність безлічі помилок. Книгу найкраще читати в оригіналі англійською мовою. Не можна не погодитися з відкликанням Кента Бека: «Головне в цій книзі те, що вона підтримує процес створення програм в хорошій формі. [Книга] сприяє вашому постійному зростанню і явно написана людьми, що знають толк в програмуванні ». Якщо ви прагнете до постійного зростання як програміст, ця книга обов'язкова до прочитання.

Висновок

Значення хороших книг з програмування складно переоцінити. Кожна з описаних книг дозволяє зробити величезний стрибок у розвитку. «Мистецтво програмування» закладає міцний фундамент, навчаючи нас фундаментальним алгоритмам і прийомам програмування. «Досконалий код» дозволяє вийти на новий якісний рівень конструювання ПО. «Чистий код» і «Рефакторинг» вчать нас уважніше ставитися до якості коду і підтримувати його в ідеальному стані. «Програміст-прагматик» підказує, як же реально домогтися практичного успіху при розробці ПЗ. «Паттерни проектування» озброюють важкою артилерією патернів для вирішення безлічі завдань проектування.

Які ж книги потрібно читати в першу чергу?
Без будь книг не можна обійтися?
Але коли необхідно проводити дану зміну?
Які символи ви бачите може бути піддано переробці?
Він іронічно зауважує: «Якими відмітними ознаками характеризується чистий тест?