среда, 30 марта 2011 г.

Переводы №1 (Назад, к основам)

Перевод интересной статьи Джоэля Спольски о неэффективности применения функций strcat, malloc, об алгоритме маляра Шлемиэля и о том, что не стоит использовать XML для хранения больших объёмов данных.

Кто такой Шлемиэль? Это персонаж из старого анекдота:

Маляр Шлемиэль подрядился красить пунктирные осевые линии на дорогах. В первый день он получил банку краски, поставил её на дорогу, и к концу дня покрасил 300 метров осевой линии. "Отлично!" сказал прораб, "быстро работаешь!" -- и заплатил ему копейку.

На следующий день Шлемиэль покрасил 150 метров. "Мда, это, конечно, не так здорово, как вчера, но приемлемо." -- сказал прораб и заплатил ему копейку.

На следующий день Шлемиэль покрасил 30 метров. "Всего лишь 30!" заорал прораб. "Это никуда не годится! В первый день было в десять раз больше! В чём дело?"

"Ничего не могу поделать," -- говорит Шлемиэль. "Каждый день я ухожу всё дальше и дальше от банки!"


суббота, 26 марта 2011 г.

Цитаты разных человеков

  • Если вы не можете объяснить что-то шестилетнему ребёнку, значит, вы сами этого не понимаете © Эйнштейн
  • Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию © Джеральд Вайнберг
  • Если для понимания того, что происходит, нужно увидеть реализацию, это не абстракция © Ф. Дж. Плоджер
  • Есть два способа разработки проекта приложения: сделать его настолько простым, чтобы было очевидно, что в нём нет недостатков, или сделать его таким сложным, чтобы в нём не было очевидных недостатков © C. A. R. Hoare
  • Работая над проблемой, я никогда не думаю о красоте. Я думаю только о решении проблемы. Но если полученное решение некрасиво, я знаю что оно неверно © R. Buckminister Fuller
  • Интерфейсы классов должны быть полными и минимальными © Scott Meyers
  • Я никогда не встречал человека, желающего читать 17 000 страниц документации, а если бы встретил, то убил бы его, чтобы он не портил генофонд © Джозеф Костелло
  • Требования подобны воде. Опираться на них легче, если они заморожены 
  • Не стоит недооценивать важность метафор. Метафоры имеют одно неоспоримое достоинство: описываемое ими поведение предсказуемо и понятно всем людям. Это сокращает объём ненужной коммуникации, способствует достижению взаимопонимания и ускоряет обучение. По сути метафора - это способ осмысления и абстрагирования концепций, позволяющий думать в более высокой плоскости и избегать низкоуровневых ошибок © Фернандо Дж. Корбати

Статья про отладку в xcode

Cтатья про отладку приложений 2008 года. Фууу! Старьё!
Читать!

Рубен Люциус Голдберг

Кто этот человек?

Есть два способа достижения целей – простой и трудный. И вот что удивительно: большинство людей всегда выбирают именно тот, что сложнее (c)

среда, 16 марта 2011 г.

Параллельное присваивание

На примере языка Lua.

-- Multiple assignments allows one line to swap two variables.

print(a,b)
a,b=b,a
print(a,b)

-------- Output ------
1 2
2 1

Неплохо, так то..

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

t = a
a = b
b = t


четверг, 10 марта 2011 г.

Изучая иностранные языки

Making a basic .NET COM component is very straightforward.
Чито? Straightforward?? Что за страшное слово!? Когда видишь фразу COM component в связке со словом straightforward, думаешь, что открыв словарь ты увидишь что-то вроде "straightforward - сложно, блядь. очень". 


straightforward - простой.

среда, 9 марта 2011 г.

Язык программирования C и шуточки

char **argv
  argv: указатель на указатель char

int (*daytab)[13]
  daytab: указатель на массив[13] типа int

int *daytab[13]
  daytab: массив[13] указателей на int

void *comp()
  comp: функция, возвращающая указатель на void

void (*comp)()
  comp: указатель на функцию, возвращающую void

char (*(*x())[])()
  x: функция, возвращающая указатель на массив[] указателей на функцию, возвращающую char

char (*(*x[3])())[5]
  x: массив[3] указателей на функцию, возвращающую указатель на массив[5] типа char


вторник, 8 марта 2011 г.

inline-функции и макроподстановки

inline-функции:

При объявлении функции внутри программы C++ позволяет вам предварить имя функции ключевым словом inline. Если компилятор C++ встречает ключевое слово inline, он помещает в выполнимый файл (машинный язык) операторы этой функции в месте каждого ее вызова. Таким образом, можно улучшить читаемость ваших программ на C++, используя функции, и в то же время увеличить производительность, избегая издержек на вызов функций.

макроподстановки:
#define max(A, B) ((A)  > (B) ? (A) : (B))
Хотя внешне он напоминает вызов функции, на самом деле max разворачивается в тексте путём подстановки. Вместо формальных параметров (A или  B) будет подставлены фактические аргументы, обнаруженные в тексте. Возьмем, например, следующий макровызов:
x = max (p+q, r+s);
При компиляции он будет заменён на следующую строку:
x = ( (p+q) > (r+s) ? (p+q) : (r+s));
...
Если внимательно изучить способ подстановки макроса max, можно заметить ряд "ловушек". Так, выражения в развернутой форме макроса вычисляются дважды, и это даст неправильный результат, если в них присутствуют побочные эффекты наподобие инкремента-декремента или ввода вывода. Например, в следующем макровызове большее значение будет инкрементаровано два раза:
max(i++; j++)   
(c)The C Programming Language

понедельник, 7 марта 2011 г.

Тестовое задание

После пятиминутного собеседования в одну очень-очень известную компанию мне сказали, что отправят тестовое задание по C++! (weeehoooo) Как же я удивился, что программист на C++ должен знать как устроено приложение на WinAPI, как писать приложения на ATL, WTL, да ещё и с использованием GDI+ - какой же я наивный чукотский мальчик.