Книга Майкла Физерса «Эффективная работа с унаследованным кодом»

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

Цитата из книги С. Макконнелла «Совершенный код»

Книга Майкла Физерса Эффективная работа с унаследованным кодом book michael feathers

Везет тем программистам, которые начинают вести проекты с нуля, тогда можно развернуться по-полной и писать код так, как считаешь нужным – cначала тщательно спроектировать структуру, нарисовать классы в виде UML-диаграмм и неспешно приступить к кодированию с использованием принципа TDD (Test-driven development), когда сначала пишутся тесты, а потом уже начинают писать основной код. Но чаще программистов нанимают для работы над уже существующей программой, которую до тебя писал криворукий программер (ведь код, написанный не тобой по определению считается плохим) без тестов, с непонятными (тебе) хаками, ужасным наименованием переменных, да и вообще читать этот код невозможно, и лучше его переписать с нуля (см. первую фразу). Такой код называют унаследованный, хотя его автор вполне может быть жив-здоров.

Правда, даже если проект начинался с нуля, то через некоторое время (если проект тогда еще будет на плаву) его код может стать унаследованным для других программистов, да даже и для тебя самого. А во всем виноваты заказчики, которые сами не знают чего хотят (а их кто-нибудь об этом спрашивал?), постоянно меняют требования (ну не нравятся им фиолетовые кнопки в правом углу на розовом фоне), хотят получить еще вот эту «маленькую возможность», из-за которой приходится переделывать половину программы. А время то поджимает, тесты писать уже некогда, слово «рефакторинг» произносится с содроганием, возможности добавляются с помощью великого копипаста, а о том, что половина имен классов уже не соответствует их настоящему поведению уж и не говорится.

Если вам знакома такая ситуация, то книга Физерса «Эффективная работа с унаследованным кодом» для вас будет полезна. Она посвящена тому, что делать, если надо работать с кодом, который написан небрежно и не покрыт полностью тестами. Основная ситуация, описываемая Физерсом – надо добавить новую возможность или изменить поведенение кода, который не то что страшно трогать, но даже иногда непонятно, как он вообще работает.

Читать далее ‘Книга Майкла Физерса «Эффективная работа с унаследованным кодом»’ »

Книга Chris F.A. Johnson «Pro Bash Programming»

Ерунда этот ваш английский – там половина слов из C++.
Программерская мудрость.

Книга Chris F.A. Johnson Pro Bash Programming pro bash programming  243x300Поближе познакомиться с bash я собирался уже давно, все-таки использовать Линукс и не уметь пользоваться одним из основных его инструментов – странно (хотя это говорит о том, что Линукс стал совсем дружелюбным к пользователю). Сначала я начал читать перевод Advanced Bash-Scripting Guide, но все-таки хотелось найти что-то в более удобном формате для чтения по дороге на работу. Русскоязычных книг по bash мне так и не попались (не считая книг, где ему посвящены только отдельные главы), но зато наткнулся в электронном виде на книгу Chris F.A. Johnson «Pro Bash Programming. Scripting the GNU/Linux Shell». Чтением этой книги решил убить двух зайцев – и про (pro Книга Chris F.A. Johnson Pro Bash Programming icon smile ) bash получше узнать, и английский потренировать, благо в Pocketbook 902, на котором я читал эту книгу, есть словари, куда можно при случае заглянуть.

Сама книга оказалась довольно неплохой, правда, местами этой книге не хватает въедливости, как у той же Advanced Bash-Scripting Guide, про некоторые конструкции и команды хотелось бы почитать поподробнее, не заглядывая в документацию, но для начала Pro Bash Programming вполне сойдет. Ее структура – от простого к сложному, в приведенных примерах используются только те конструкции, которые уже были описаны раньше (использование неописанных конструкций раздражало в Advanced Bash-Scripting Guide, из-за чего он читался как справочник), а последние главы посвящены практическому применению того, что было изучено в первой половине книги. Приятно, что автор пишет, какая конструкция в какой версии bash появилась, а какие команды не входят в стандарт POSIX, чтобы можно было оценить требования к среде, где будет выполняться тот или иной скрипт.

Давайте теперь коротко пробежимся по содержанию книги.

Читать далее ‘Книга Chris F.A. Johnson «Pro Bash Programming»’ »

Сумбурное описание алгоритма роя частиц

В последнее время я готовлю статейку для выкладывания на сайт про метод оптимизации, который называется метод роя частиц. И пока я думал, как этот алгоритм можно описать на пальцах или каких-то жизненных аналогиях, то воспаленный мозг родил вот такое описание. Я что-то сомневаюсь, что его стоит включать в конечный вариант статьи, но пусть он останется хотя бы здесь для истории.

Чтобы понять алгоритм роя частиц, представте себе большую поляну с земляникой (это наша область поиска решения), и нам надо найти то место на поляне, где земляники больше всего (глобальный экстремум). Будем считать, что сама земляника не кончается, и при съедении ягоды, она вырастает снова. Теперь представьте себе, что по этой поляне случайным образом (с вертолета) разбросали бабушек-собирателей земляники (агентов алгоритма). Сначала каждая бабушка идет в случайном направлении и с каждым шагом замечают, сколько земляники находится вокруг нее. Но с каждым новым шагом скорость и направление движения бабушки изменяют так, чтобы с одной стороны направиться в ту сторону, где она сама видела больше всего земляники (авторы алгоритма назвали этот аспект поведения «ностальгией»), а с другой – старается приблизиться к наилучшей области с наибольшим числом земляники, найденной среди всех бабушек (глобальное лучшее значение). В идеале через некоторое количество шагов все бабушки должны собраться в одной области с наибольшим числом земляники. В реальности кто-то может остаться в области, достаточно хорошей, но не в глобально лучшей, но главное, чтобы глобальный экстремум был найден хотя бы одной бабушкой.

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

Читать далее ‘Сумбурное описание алгоритма роя частиц’ »

Книга С. Макконнелла «Совершенный код»

Книга С. Макконнелла Совершенный код complete bookНаконец-то, дочитал книгу Макконнелла «Совершенный код», о который слышал много лестных отзывов. Честно говоря, особого восторга она у меня не вызвала, хотя подобную книгу должен прочитать каждый программист, и чем раньше, тем лучше. Но давайте обо всем по порядку.

В этой книге Макконнелл охватывает весь процесс разработки программного обеспечения, включая, проектирование софта, непосредственно написание кода, отладку программы, оптимизацию, взаимодействие с начальством, заказчиком и коллегами и даже есть глава про личные качества программистов. Цель этой книги – помочь писать такой код, который бы поняли другие программисты, которые после вас в нем будут разбираться.

Самыми полезными мне показались главы про непосредственно написание кода, где автор описывает общие принципы, как надо и как не надо писать код: почему вредны длинные функции, большая вложенность циклов и других управляющих конструкций, почему надо избегать оператора goto (хотя в некоторых редких случаях Макконнелл оправдывает его применение). Здесь не будет никаких особенных откровений, во многих книгах это уже описывалось (кстати, библиография, приводимая в конце книги, очень обширная – целых 43 страницы), но часто это было обрывочно, а в «Совершенном коде» все собрано в одном месте.

Читать далее ‘Книга С. Макконнелла «Совершенный код»’ »

Про изменения на сервере ЖЖ

pro-izmeneniya-na-servere-zhzh

Когда-то давно я выкладывал статьи про взаимодействие с сервером ЖЖ (Основы работы с сервером livejournal.com, Еще раз про авторизацию на сервере livejournal.com и Бот для отправки комментариев), а на этой неделе СУП’овцы что-то поменяли, что примеры из этих статей перестали работать.

Первое изменение заключается в том, что, если раньше для общения с сервером можно было использовать адрес как http://www.livejournal.com/interface/flat, так и http://livejournal.com/interface/flat (для flat-протокола) и, соответстенно, http://www.livejournal.com/interface/xmlrpc или http://livejournal.com/interface/xmlrpc (для протокола XML-RPC), а теперь надо обязательно указывать адрес с «www».

Второе изменение касается авторизации как посетителя. Если раньше на сайте была хорошая авторизация, когда на сервер передается не сам пароль, а его хеш, созданный из пароля и случайного числа, полученного от сервера, то теперь форма для авторизации на странице сайта передает пароль в явном виде. К счастью, старый способ можно по-прежнему использовать (если добавить www к адресу сервера: http://www.livejournal.com/login.bml), но сама авторизация на сайте теперь не безопасна.

Например, вот как выглядит измененный код авторизации для Бота на Python без использования безопасной авторизации:

Читать далее ‘Про изменения на сервере ЖЖ’ »

Книга «Пионеры программирования»

Книга «Пионеры программирования» book pioner 229x300Недавно прочитал книгу «Пионеры программирования» Федерико Бьянкуцци и Шейна Уордена. Книга довольно необычная по своей сути – это просто сборник интервью, взятый у авторов различных языков программирования. Здесь собраны интервью, взятые у 27 человек, имеющих непосредственное отношение к созданию 17 языков программирования:

  • C++ (Бьёрн Страуструп);
  • Python (Гвидо ван Россум);
  • APL (Эдин Д. Фалкофф);
  • Forth (Чак Мур);
  • Basic (Томас Курц);
  • AWK (Ал Ахо, Брайан Керниган, Питер Вайнбергер);
  • Lua (Роберто Иерусалимский и Луис Энрике де Фигейреду);
  • Haskell (Пол Худак, Джон Хьюз, Саймон Пейтон-Джонс и Филип Уодлер);
  • ML (Робин Милнер);
  • SQL (Дональд Чемберлен, который теперь работает над XQuery);
  • Objective-С (Том Лав, Брэд Кокс);
  • Java (Джеймс Гослинг);
  • C# (Андерс Хейлсберг);
  • UML (Айвар Якобсон, Джеймс Рамбо, Гради Буч);
  • Perl (Ларри Уолл);
  • PostScript (Джон Уорнок и Чарльз Гешке);
  • Eiffel (Бертран Мейер).

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

Читать далее ‘Книга «Пионеры программирования»’ »

Книга Р. С. Мартина и М. Мартина «Принципы, паттерны и методики гибкой разработки на языке C#»

Книга Р. С. Мартина и М. Мартина Принципы, паттерны и методики гибкой разработки на языке C# martin 211x300На днях дочитал книгу двух Мартинов (Роберта и Мики) «Принципы, паттерны и методики гибкой разработки на языке C#». Очень стоящая книга, охватывающая все этапы проектирования софта. Несмотря на то, что в названии фигурирует C#, и все примеры действительно написаны на нем, книгу можно (нужно) читать всем, кто занимается программированием и проектированием. К языку C# описание никак не привязано. Более того, в книге открытым текстом сказано, что изначально некоторые примеры были написаны на C++ или Java, а затем для книги переписаны на C#.

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

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

В книгу включена одна интересная глава, которая в оригинале была оформлена в виде статьи. Эта глава описывает процесс проектирования и кодирования (эти два процесса перемешаны) программы для подсчета очков при игре в боулинг. Эту главу нужно обязательно показывать тем, кто хочет понять что из себя представляет проектирование софта, а особенно стоит показать начальству, чтобы оно прониклось как происходит рождение программы, и что написание программы – это не просто кодирование в императивном стиле (a la Pascal, Fortran и т.п.).

Читать далее ‘Книга Р. С. Мартина и М. Мартина «Принципы, паттерны и методики гибкой разработки на языке C#»’ »

wxPython и Drag’n'Drop файлов в Linux

wxpython-i-dragndrop-fajjlov-v-linux

В промежутках между работой и сном постепенно доделываю OutWiker, очередную версию которого собираюсь в скором времени выложить. Одним из изменений в этой версии будет то, что теперь можно будет перетаскивать прикрепленные файлы из окна OutWiker’а в другие приложения. Но когда я только начинал добавлять эту возможность, то не думал, что потрачу на нее столько сил и нервов, и все из-за одной мерзопакостной ошибки в wxWidgets.

Началось все хорошо. Сидя под Windows, реализация возможности перетаскивать файлы в другие приложения заняла считанные строки:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def onBeginDrag(self, event):
	"""
	Начало перетаскивания файлов
	"""
	data = wx.FileDataObject()
 
	for fname in self.getSelectedFiles():
		# Добавляем вложенные файлы в список.
		data.AddFile (fname)
 
	dragSource = wx.DropSource (self)
	dragSource.SetData(data)
 
	result = dragSource.DoDragDrop ()

Читать далее ‘wxPython и Drag’n’Drop файлов в Linux’ »

Стивен Леви. «Хакеры. Герои компьютерной революции»

Стивен Леви. Хакеры. Герои компьютерной революции hackers 178x300

Про существование этой книги я узнал в ЖЖ от Стивен Леви. Хакеры. Герои компьютерной революции userinfogremlinable из комментариев к записи про книгу Линуса Торвальдса. Знаете, давно я не получал такого удовольствия от чтения околокомпьютерных книг, причем «Хакеры», пожалуй, самая грустная IT-книга, которая мне попадалась. С легкой руки журналистов и телевизионщиков сейчас слово «хакер» стали применять к любому моральному уроду, который скачал генератор вирусов. А вот судя по книге, это слово появилось в конце 50-ых, начале 60-ых годов прошлого века в жаргоне программистов, работающих в Массачусетском Технологическом Институте (МТИ, MIT) и обозначало людей, которые досконально знали работу вычислительных машин того времени (назвать их словом «компьютер» у меня не повернутся пальцы). Даже не просто досконально знали, но и буквально фанатели от работы за терминалом.

Эта книга охватывает четыре десятилетия: с конца 50-ых по начало 80-ых годов и начинается с описания клуба технического моделирования железной дороги в том самом МТИ, а первые компьютеры (надо же, повернулись Стивен Леви. Хакеры. Герои компьютерной революции icon smile ), которые упоминаются – IBM 704 и TX-0 (картинка), потом появились PDP-1 и PDP-6. В книге довольно здорово показано развитие и компьютеров и хакеров в первоначальном смысле этого слова, в основном развитие показано через биографии хакеров.

Книга разделена на три части и посвящена трем поколениям хакеров: первая часть посвящена 50-60-ым годам и хакерам из лаборатории искуственного интеллекта в МТИ, показаны их повадки и среда обитания Стивен Леви. Хакеры. Герои компьютерной революции icon smile .

Читать далее ‘Стивен Леви. «Хакеры. Герои компьютерной революции»’ »

История одного глюка или дело о букве «Р»

istoriya-odnogo-glyuka-ili-delo-o-bukve-r

На днях столкнулся со странным глюком, найденным в OutWiker‘е, на исправление которого вместе с поимкой виновника ушло два вечера.

Не буду долго описывать то, как я наткнулся на этот глюк, лучше перейдем сразу к его сути. А суть состоит в том, что для хранения и парсинга настроек страниц в программе используется стандартный класс ConfigParser (с некоторой тонкой оболочкой над ним, но в данном случае это не важно) – очень уж в нем удобно разбирать строки вида xxx = yyy. Так вот, неожиданно оказалось, что если yyy кончается на русскую букву «Р», то при преобразовании yyy в unicode бросается исключение о том, что кодек utf8 не может преобразовать строку, так как данные неожиданно закончились (’utf8′ codec can’t decode byte 0xd0 in position __: unexpected end of data). Причем, в середине строки буква «Р» нормально преобразовывалась. Добавление пробела к концу строки, которая кончалась на «Р», ничего не дало, зато навело на мысль, что дело может быть в обрезании строки при выкидывания начальных и концевых пробелов, переводов строк и т.п. При этом все остальные русские буквы на конце обрабатывались без проблем.

Читать далее ‘История одного глюка или дело о букве «Р»’ »

Под заказ толщиномеры: толщиномер краски и других типов краски.