• 50 цитат о программировании всех времён

    • Перевод
    Перевёл после прочтения комментариев к статье «О ненависти к C++». В цитатах можно найти ответы на большинство возникших там вопросов.

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

    49. Lisp — это не язык, а строительный материал.
    — Alan Kay

    48. Ходить по воде и разрабатывать программы, следуя спецификации, очень просто… если они заморожены.
    — Edward V Berard
    Читать дальше →
  • Мониторинг производительности PHP-кода с помощью Pinba

      Давайте представим себе типичный, набирающий популярность стартап, использующий, например, PHP или Python. Сначала все находится на одном сервере — PHP (или Python), Apache, MySQL. Затем вы выносите MySQL на отдельный сервер, устанавливаете nginx для раздачи контента, возможно, добавляете memcached для кеширования и еще несколько серверов приложений…

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

      Чтобы получить ответы на эти вопросы, в Badoo был разработан сервиc мониторинга и статистики в реальном времени — Pinba. В данной статье мы расскажем о нашем опыте использования его для мониторинга и профайлинга нашей системы.
      Читать дальше →
    • Ремесло программиста. Золотые правила

        imageДанный пост представляет собой выдержку «золотых правил» из примечательной книги Питера Гудлифа «Ремесло программиста».

        Кто-то освежит память, кто-то сверится как с чек-листом, а кто-то заинтересуется и прочтет книгу. Т.к. пост получился достаточно объемным, можно добавить его в закладки и периодически к нему возвращаться.
        Читать дальше →
      • А как же всё-таки работает многопоточность? Часть I: синхронизация

        • Tutorial
        картинка для привлечения внимания(пост из серии «я склонировал себе исходники hotspot, давайте посмотрим на них вместе»)
        Все, кто сталкивается с многопоточными проблемами (будь то производительность или непонятные гейзенбаги), неизбежно сталкиваются в процессе их решения с терминами вроде «inflation», «contention», «membar», «biased locking», «thread parking» и тому подобным. А вот все ли действительно знают, что за этими терминами скрывается? К сожалению, как показывает практика, не все.

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

        Перед прочтением глубокого описания полезно убедиться в том, что вы в достаточной мере разбираетесь в Java Memory Model. Изучить её можно, например, по слайдам Сергея Walrus Куксенко или по моему раннему топику. Также отличным материалом является вот эта презентация, начиная со слайда #38.
        Читать дальше. Много.
      • TeaCSS – очевидный подход к созданию стилей

          Введение


          Хотя CSS-подобных языков не так уж и много – на слуху и на плаву сейчас и вовсе одни Sass и Less, я все же начну с ответа на вопрос «А зачем нужен еще один?».

          Если коротко, то TeaCSS не плодит новых сущностей, ведь этот тот же CSS, в который в качестве языка добавили JavaScript.

          У этого подхода есть свои плюсы и минусы.

          Плюсы – практически никаких подводных камней. Файл tea преобразуется в JavaScript, наполненный простыми командами вывода. Этот JavaScript можно отлаживать, смотреть в FireBug и вообще его поведение предсказуемо. В этом и состоит очевидность подхода, в вебе уже и так превалирует JS, поэтому вам не придется учить ничего нового.
          Читать дальше →
        • Практика прототипирования в софтверной компании

            imageНет, это статья не об игре про заражённый вирусом Манхэттен и его мутантов. Речь пойдёт о прототипах другого рода — прототипах программного обеспечения.

            Прототипирование ПО становится всё более популярным и часто используемым процессом в российских IT-компаниях. Причины видятся следующие: с одной стороны – это определенная дань моде, с другой – прототипирование обещает компании ряд весомых преимуществ.

            Однако сделать процесс прототипирования полезным и эффективным — непростая задача. Встречаются подводные камни, появляются вопросы. Кто и когда должен прототипировать? Как делать прототипы? Как их использовать? Ответы на эти вопросы и последующие шаги определяют успешность и полезность нововведения. Если они будут неверными – прототипирование может стать не только вредным, но и крайне дорогостоящим процессом.

            В статье я хочу поделиться опытом построения процесса прототипирования в моей компании. Расскажу, как мы ответили на озвученные вопросы и каких успехов достигли.
            Читать дальше →
          • О прямоугольных координатах и гексагональных сетках

            Думаю, никому не нужно объяснять, насколько широко в играх (и не только) используются гексагональные сетки. Как для заданной шестиугольной ячейки найти координаты ее центра и вершин — достаточно очевидно. Обратное же преобразование (т.е. поиск ячейки, в которую попала данная точка с координатами x и y) уже не столь тривиально. О нём и пойдет речь в данном топике.
            Читать дальше →
          • Phonegap + NativeControls = нативное iPhone приложение на Javascript

            PhoneGap многим известный фреймворк, который позволяет писать приложения под мобильные устройства на яваскрипте. О нем не раз писалось на хабре, поэтому останавливаться на его описании не будем.

            Интересной особенностью является то, что под него можно писать свои плагины. Если конечно таких плагинов уже нет. Таким образом можно реализовать нативные элементы платформы, которых изначально нет в PhoneGap.

            Рассматриваемый плагин ранее был включен в PhoneGap, но с недавнего времени его необходимо доустанавливать отдельно. Речь идет об NativeControls. Сразу оговорюсь что в данной статье речь пойдет об использовании плагина для iOS. Под андроид использование аналогично.

            NativeControls позволяет добавлять нативные UITabBar и UIToolBar (сначала я подумал что это UINavigationBar). Реализовано это таким образом, что центральная часть приложения это UIWebView – в котором собственно и располагается веб-приложение. И к этому UIWebView добавляются UITabBar и UIToolBar. И они взаимодействуют между собой в двустороннем порядке. Ниже я опишу основные методы взаимодействия между «веб-частью» приложения и «нативной» частью.
            Перейдем к делу.
            Читать дальше →
          • Решение задачи «Яндекс интернет математика — 2011». Определение визуальной схожести изображений

              В апреле-мае 2011 года компания Яндекс проводила очередной тур конкурса Яндекс интернет математика. Тема тура: «Определение визуальной схожести изображений».
              Я публиковал новость про объявление победителей и обещал в скором времени описать решение поставленной задачи нашей командой — LookLikeIt, которая заняла 12-е место в финальном рейтинге.

              И вот, не совсем скорое время наступило!
              Читать дальше →
            • Алгоритмы LZW, LZ77 и LZ78


                Хочется продолжить свою предыдущую тему об алгоритмах сжатия. В этот раз я расскажу об алгоритме LZW и немного об его родственниках алгоритмах LZ77 и LZ78.

                Алгоритм LZW


                Алгоритм Лемпеля — Зива — Велча (Lempel-Ziv-Welch, LZW) — это универсальный алгоритм сжатия данных без потерь.
                Читать дальше →