Search
Write a publication
Pull to refresh
43
0
Артур @arty87

User

Send message

[Перевод] Как я читаю книги по программированию

Reading time4 min
Views140K
Я получил образование по специальности «Электротехника» и единственными языками программирования, которые мы изучали были C/C++, ассемблер и Matlab. После того как я посетил Startup Weekend, я понял, что информатика и разработка программного обеспечения мне небезразличны и решил погрузиться в эти области с головой. Также я осознал, что мне требуется изучить еще несколько языков программирования, помимо тех, которые я изучал в университете.

За прошедшие полтора года я начал изучать Java (для Android), а также Python, JavaScript, HTML и CSS (для web-разработки) и выявил для себя, что лучший способ изучать язык программирования, разбирая книгу или туториалы, — читать все по три раза! Да, именно по 3 раза!!! Чтение нового материала подобным образом, хорошо помогло мне понять новые языки программирования и концепции.
Читать дальше →

Сходство и различие между Mercurial и Git

Reading time6 min
Views119K
По роду своей деятельности я нередко становлюсь свидетелем «священных войн» между коллегами-программистами на тему, какую же систему контроля версий выбрать для того или иного проекта. Роль системы контроля версий особо остро ощущается в случаях разработки и поддержки проектов с длинной историей. Вариантов инструментов много, но я хочу сконцентрироваться на двух, на мой взгляд, наиболее перспективных: Mercurial и Git. Далее попробуем рассмотреть возможности обеих систем с позиции их внутреннего устройства.
Читать дальше →

Жизнь без тестировщиков: миф или реальность?

Reading time5 min
Views31K
Бытует противоречивое мнение, что на проекте обязательно должен быть тестировщик. Но многие известные зарубежные проекты не имеют выделенных тестировщиков, особенно для привычных нашему миру задач. Как же так? Кто в этом случае будет отвечать за качество продукта? Кто будет искать и находить дефекты? Да и вообще, возможно ли такое? Если вас заинтересовали ответы на эти вопросы, то добро пожаловать под кат.

Читать дальше →

Переход с Java на Scala (Clojure, Haskell, Erlang ..) как повышение абстракции программирования

Reading time3 min
Views33K
А что такого можно написать на Scala, чего нельзя на Java?
(из разговора с одним моим знакомым другом, человеком и программистом)
The best reason to learn a new programming language is to learn to think differently.
Chad Fowler

Хочу рассказать не о простоте конструкций Scala по сравнению с Java и не о том, что в 1 строчку Scala я могу уместить 20 строк Java. А наоборот, копнуть поглубже, уронить устои ООП и посмотреть на реакцию благородной публики.
Читать дальше →

Анти-GTD или лекарство от прокрастинации

Reading time3 min
Views101K
Я долго интересовался техниками GTD, тайм-менеджмента, повышения личной эффективности. Они, действительно, позволяют выполнять дела. Но все время чувствовалась какая-то неудовлетворенность. Потом я понял, что очень важно выбрать правильное направление самореализации. Иначе, с применением этих техник можно убежать очень далеко, да не в том направлении. Все это порождает фрустрации, поиски чудесных инструментов, вот даже целый термин прокрастинации появился.

Как избавиться наконец от насилия над собой в виде этих бесконечных техник? Делать то, что хочешь!
Если более развернуто, то обычно советуют работать на пересечении нескольких областей — делать:
  1. то, что хочешь,
  2. на что располагаешь талантом,
  3. то, что служит на благо людей,
  4. то, что приносит деньги.

Это просто идеальная самореализация!

Но как это сделать? Об этом обычно не говорят или неуверенно дают какие-то общие советы. Я долго копал и кое-какую методику все же нашел.
Делюсь методикой под катом

Как начать летать самостоятельно, без риска для жизни

Reading time12 min
Views119K
Прочитал я недавно тут пост Как начать летать, хоть на чем-то, самостоятельно. Вдохновляет. Несомненно. Но мне кажется, что рисков для жизни в этом деле много больше, чем описывает автор. Это мое личное мнение, и, возможно, оно ничем не подкреплено. В комментариях к посту про это сказано не мало слов и останавливаться на этом я не буду.

В этом посте я хочу поделиться с вами не менее вдохновляющим процессом создания летательного аппарата по мотивам тематики «Сделай это сам».
Подробности

Топология на пальцах

Reading time3 min
Views225K
Топология — довольно красивое, звучное слово, очень популярное в некоторых нематематических кругах, заинтересовало меня еще в 9 классе. Точного представления конечно же я не имел, тем не менее, подозревал, что все завязано на геометрии.

Читать дальше →

Об идеальном коде и суровой реальности

Reading time3 min
Views68K
Думаю, никто не будет спорить, что программный код должен быть чистым и «не пахнуть» (code smell), а паттерны проектирования и TDD должны стать верными спутниками любого мало-мальски грамотного разработчика на протяжении его нелегкой, но продуктивной карьеры. Все также знают, что цена ошибки в продакшине возрастает в десятки раз, а также то, что хорошие программисты оптимизируют код, а плохие — покупают новые сервера, а еще то, что 9 женщин не родят одного ребенка за месяц.



Было бы глупо спорить с тем, что писать хороший код — не правильно. Более того, внимательный читатель найдет среди моих прошлых публикаций целый серии статей на тему идеального кода. Но эту заметку я решил написать по причине того, что в последнее время очень часто сталкиваюсь с идеализацией процесса разработки и кучи советов в стиле «пофиг на все, главное — идеальный код». Далее несколько наблюдений и историй из жизни.
Читать дальше →

Поиск часто встречающихся элементов в массиве

Reading time5 min
Views121K
Задача: в массиве длиной N найти элемент, который повторяется больше N/2 раз.

Казалось бы, чего тут думать? Возьмём Dictionary<значение элемента, число появлений>, за один проход по массиву сосчитаем появления каждого элемента, потом выберем из словаря искомый элемент. Решение за O(N), куда может быть ещё быстрее?

Есть один нюанс: для словаря нам потребуется O(N) дополнительной памяти — в несколько раз больше размера исходного массива, и это при реализации словаря хоть хэш-таблицей, хоть деревом. Что будем делать, если наша цель — обработка сигнала неким устройством с маленькой памятью? Массив — замеры уровня сигнала, из которых один — «настоящий» передаваемый уровень, а остальные — шум и помехи. Неужели придётся для определения «настоящего» уровня возиться с хэш-таблицами и деревьями?

К счастью, нет: достаточно O(1) дополнительной памяти, и по-прежнему одного прохода по массиву.
Читать дальше →

Так ли точна математика, как кажется?

Reading time6 min
Views24K
Наверное, данный вопрос задавал себе каждый, чуточку интересующийся математикой человек. Прочитав статью 2 х 2 = 4, было сделано заключение, что эта тема также может понравиться хабралюдям. Речь пойдет об аксиомах в математике, противоречиях и парадоксах. Кому интересно — добро пожаловать под кат.
Читать дальше →

Top 5 раздражающих моментов в работе программиста

Reading time4 min
Views194K
В процессе работы, будучи программистом, в разные периоды я не раз сталкивался с рядом проблем. Во многом из-за непонимания клиентами и руководителями работы программиста. Хочется собрать наиболее раздражающие моменты, которые делают работу невыносимой и портят все удовольствие, и объяснения начинающим менеджерам на доступном языке, как не быть в глазах разработчика обузой.

1. А сколько займет сделать этот раздел (дается ТЗ из одной строки)?

Как правило, отвлекают от работы вопросом, сбивают с потока. Просят назвать срок, когда неизвестна ни задача, ни требования, только одно предложение. И так настойчиво, что, чтобы отвалили, называешь прикидочный срок.

Менеджеру: поймите, что программист строит в голове модель будущей системы. По одному предложению нельзя смоделировать приложение. И только ваша вина, если вы не потрудились уточнить ТЗ (это ваша работа, кстати) у заказчика, а хотите сразу назвать ему срок (и цену). Потому что оценка с потолка невозможна — вроде как ответить на вопрос «сколько времени займет покрасить комнату неизвестной площади?».

2. Ты же ОБЕЩАЛ сделать за два дня, а прошла неделя! (моют мозг по сроку из пункта 1)

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

Менеджеру: ничто так не демотивирует, как обвинение в некомпетентности и лжи. Постарайтесь давать точное ТЗ и бить задачу на простые кусочки, в чем программист с удовольствием поможет (если хорошо попросить). Тогда можно будет более точно управлять сроками.
Читать дальше →

О неверности обобщений, или каждый программист — уникален

Reading time2 min
Views60K
Прочитал пост «Твой программист и твоя жена....», и как программист и управленец, хочу не согласиться с автором. Несмотря на то, что считаю его опыт в организации разработки достаточно интересным.
Если бы ты мог дать пинка под зад человеку, который виновен во всех твоих неприятностях, ты бы потом три дня не смог сидеть.
Неизвестный автор

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

Далее, обобщать уникальных специалистов — это все равно что пытаться рассуждать об музыкантах, к примеру, вообще. Музыканты — это, мол, народ странный, и вот особенно родившиеся после 70х. А то, что кабацкий певец, солист оркестра или выдающийся оперный певец — это три совершенно разных музыканта и тысячи разных людей, как-то в пример не берется.

Но идем дальше.
Читать дальше →

Паттерны ООП в метафорах

Reading time17 min
Views575K
Большинство литературы посвященной паттернам в ООП (объектно-ориентированном программировании), как правило, объясняются на примерах с самим кодом. И это правильный подход, так как паттерны ООП уже по-умолчанию предназначаются для людей, которые знают что такое программирование и суть ООП. Однако порой требуется заинтересовать этой темой людей, которые в этом совершенно ничего не понимают, например «не-программистов» или же просто начинающих «компьютерщиков». Именно с этой целью и был подготовлен данный материал, который призван объяснить человеку любого уровня знаний, что такое паттерн ООП и, возможно, привлечет в ряды программистов новых «адептов», ведь программирование это на самом деле очень интересно.
Статья предназначена исключительно для новичков, так что «старожилы» ничего нового для себя не узнают. В основном статья описывает известные паттерны из книги «Приемы объектно-ориентированного программирования. Шаблоны проектирования.», но более популярным и простым языком.
Читать дальше →

Объектно-дезориентированный язык

Reading time4 min
Views44K

Каждый раз когда речь заходит о Go приходится слышать один и тот же вопрос:
Является ли Go объектно-ориентированным языком?

Честно говоря, меня это окончательно достало. Моя задача — расписать сию тему в данной статье, напечатать ссылку на визитках и раздавать их каждый раз когда фанаты ООП будут спрашивать у меня этот вопрос.
Читать дальше →

Насколько плохим код должен быть?

Reading time6 min
Views74K
Эрик Липперт — ветеран Microsoft, проработавший в компании 16 лет и стоящий за разработкой VBScript, JScript и C#.

На прошлой неделе в комментариях к одной из статей разгорелся спор о роли низкоуровневой оптимизации в программировании, и я вспомнил относящуюся к этому статью Эрика. Она была написана в конце 2003, и хотя реалии с тех пор несколько изменились — принципы остались теми же самыми. Можете мысленно заменить ASP и VBScript на PHP, JavaScript, или на другой скриптовый язык по вашему вкусу.

Эту статью я уже пытался перевести в 2005, но русский текст тогда получился неуклюжий, так что этот перевод — новый и ранее не публиковался, в соответствии с требованиями НЛО. В Переводе блога Эрика Липперта этого текста тоже нет — наверное, для них он слишком стар.


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

Например, за семь лет в Microsoft я получил десятки вопросов, аналогичных по своей сути этому, заданному в конце 1990-х:
У нас есть код на VBScript, и в одной часто вызываемой функции мы определяем оператором Dim несколько переменных, которые нигде в функции не используются. Не замедляется ли каждый вызов функции из-за объявления этих переменных?
Какой интересный вопрос! В компилируемом языке, таком как Си, объявление локальных переменных общим размером n байт всего лишь вычитает n из указателя стека при входе в функцию. Если n будет чуть больше или чуть меньше, затраты времени на вычитание никак не изменятся. Наверное, в VBScript точно так же? Оказалось, что нет! Вот что я написал автору вопроса:
Читать дальше →

Ломаем спички, или Алиса в стране математических ошибок

Reading time5 min
Views77K
Есть у меня любимый форум, посвящённый головоломкам. Недавно я наткнулся там на следующую задачу:

Сидел однажды Вася у себя на кухне и от нечего делать спички ломал. Поломал, поломал и задумался — чему равна вероятность того, что по крайней мере одна спичка будет переломана точно посередине? Запас спичек у Васи неограничен.


Я довольно быстро доказал, что вероятность этого события равна нулю. Гордый собой, я запостил решение и ответ, ожидая плюсика в карму. Оказалось, однако, что авторский ответ совсем другой: 1 — 1/e. Забегая вперёд, скажу, что этот ответ неверен.

Неправильные авторские решения — довольно частое явление в интернет-головоломках. И я ни за что не стал бы писать этот пост, если бы автором задачи, а также её неверного решения, не был британский логик и алгебраист Чарльз Л. Доджсон, более известный под псевдонимом Льюис Кэрролл.
Скандалы, интриги, расследования

Почему мне нравится работать программистом в Луисвилле (или почему я не перееду, чтобы работать в Вашем стартапе)

Reading time8 min
Views119K
Уже некоторое время вверху моего сайта висит слоган:
Нет, я не работаю в Нью-Йорке, Вашингтоне или долине, и меня это полностью устраивает.

Как и со многими (если не с большинством) из вас, со мной регулярно связываются рекрутеры. К сожалению, они не знают обо мне ничего конкретного, кроме того, что сумели найти в моем LinkedIn или GitHub. Если уж они и посещали мой сайт, то определенно не заметили этот слоган. Мне порядком надоело отвечать на тонны одинаковых писем (хотя возможно они чем-то и отличаются) снова и снова, так что, надеюсь, читатели моего блога на этот раз простят мне эгоистичное отступление от основной его темы.

Я разработчик софта из Луисвилля, штат Кентукки, и я здесь до чертиков счастлив.

Коротко об авторе и еще кое-что
Эрни Миллер удаленно работает в крупном американском стартапе Living Social ведущим Ruby on Rails разработчиком. О своей должности он пишет «Build awesome things, and make people happy. That's about it.».

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

Этот пост еще в декабре прошлого года попался мне на глаза и отлично употребился вместе с «Как я нахожу время?».

В то же самое время я посетил Ульяновский RailsClub'Ulyanovsk, а чуть позже побывал в Праге. И на резком контрасте с Москвой, я четко понял, что многое в жизни можно делать по-другому. Автор статьи постарается объяснить — как.

Полезного и приятного чтения!


Читать дальше →

А сложно ли работать программистом?

Reading time4 min
Views152K


Этот вопрос мне часто задают вокруг. Задают родственники, друзья, дети друзей и вообще незнакомые люди. У всех своих цели — кто-то хочет сменить род деятельности, кто-то только выбирает куда пойти учиться, а кто-то желает в первую очередь убедить себя в том, что «вот еще и этим бездельникам ни за что деньги платят». Что же ответить на этот вопрос? Честно говоря, первым делом, конечно, хочется выпятить грудь колесом и двинуть речь о том, что, дескать, окромя нечеловеческого ума и 10 лет глубокой математической подготовки нужно еще иметь природный талант и пахать круглосуточно… Но где-то на третьей минуте этого увлекательного текста включаются мозги и здоровый скептицизм, требующий на время замолчать и немного подумать.

А и правда — сложно ли?
Читать дальше →

Экономим затраты на интернет от Yota

Reading time2 min
Views45K

Пролог


Пару месяцев назад в моем городе запустил свою LTE сеть оператор беспроводной связи Yota. Немного поколебавшись, я решил, что стоит попробовать – в надежде, что с LTE Yota дела обстоят лучше, чем с 3G от операторов большой тройки. И, должен сказать, что пока ничуть не разочаровался в своем решении.

И дело не только в том, что скорость выше, а покрытие города ничуть не хуже. Используя интернет от Yota я трачу меньше денег, чем раньше. Ведь есть в личном кабинете такой замечательный регулятор скорости, который можно поставить на минимум, и увеличивать скорость только тогда, когда это действительно необходимо.
Читать дальше →

Опции JVM. Как это работает

Reading time7 min
Views96K
С каждым днем слово java все больше и больше воспринимается уже не как язык, а как платформа благодаря небезызвестному invokeDynamic. Именно поэтому сегодня я бы хотел поговорить про виртуальную java машину, а именно — об так называемых Performance опциях в Oracle HotSpot JVM версии 1.6 и выше (server). Потому что сегодня почти не встретить людей, которые знают что-то больше чем -Xmx, -Xms и -Xss. В свое время, когда я начал углубляться в тему, то обнаружил огромное количество интересной информации, которой и хочу поделится. Отправной точкой, понятное дело, послужила официальная документация от Oracle. А дальше — гугл, эксперименты и общение:

-XX:+DoEscapeAnalysis


Начну, пожалуй, с самой интересной опции — DoEscapeAnalysis. Как многие из Вас знают, примитивы и ссылки на объекты создаются не в куче, а выделяются на стеке потока (256КБ по умолчанию для Hotspot). Вполне очевидно, что язык java не позволяет создавать объекты на стеке на прямую. Но это вполне себе может проделывать Ваша JVM 1.6 начиная с 14 апдейта.

Про то, как работает сам алгоритм можно прочитать тут (PDF). Если коротко, то:

  • Если область видимости объекта не выходит за область метода, в котором он создается, то такой объект может быть создан на фрейме стека вместо кучи (на самом деле не сам объект, а его поля, на совокупность которых заменяется объект);
  • Если объект не покидает область видимости потока, то к такому объекту другие потоки не имеют доступа и следовательно все операции синхронизации над объектом могут быть удалены.


Для реализации данного алгоритма строится и используется так называемый — граф связей (connection graph), по которому на этапе анализа (алгоритмов анализа — несколько) осуществляется проход для нахождения пересечений с другими потоками и методами.
Таким образом после прохода графа связей для любого объекта возможно одно из следующих следующих состояний:

  • GlobalEscape — объект доступен из других потоков и из других методов, например статическое поле.
  • ArgEscape — объект был передан как аргумент или на него есть ссылка из объекта аргумента, но сам он не выходит из области видимости потока в котором был создан.
  • NoEscape — объект не покидает область видимости метода и его создание может быть вынесено на стек.


После этапа анализа, уже сама JVM проводит возможную оптимизацию: в случае если объект NoEscape, то он может быть создан на стеке; если объект NoEscape или ArgEscape, то операции синхронизации над ним могут быть удалены.

Следует уточнить, что на стеке создается не сам объект а его поля. Так как JVM заменяет цельный объект на совокупность его полей (спасибо Walrus за уточнение).

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

    for (int i = 0; i < 1000*1000*1000; i++) {
        Foo foo = new Foo();
    }

скорость выполнения может увеличится в 8-15 раз. Хотя, на казалось бы, очевидных случаях из практики о которых недавно писалось (тут и тут) EscapeAnalys не работает. Подозреваю, что это связано с размером стека.

Кстати, EscapeAnalysis как раз частично ответственен за известный спор про StringBuilder и StringBuffer. То есть, если Вы вдруг в методе использовали StringBuffer вместо StringBuilder, то EscapeAnalysis (в случае срабатывания) устранит блокировки для StringBuffer'а, после чего StringBuffer вполне превращается в StringBuilder.
Читать дальше →

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity