суббота, 7 февраля 2015 г.

Scalability and portability

Почему важны метрики кода такие как масшабируемость (scalability) и портируемость (portability)? Взглянем на результаты исследований IBM.

Видно, что программная разработка (количество строк кода/чип) увеличивается каждые 5 лет в 2 раза над аппаратной разработкой (количество транзисторов/чип) достигнув переломной точки где-то в 2010 году.

Потому будущие системы должны минимизировать затраты на повторные разработки из-за изменений в аппаратной архитектуре.

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

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

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

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

среда, 18 сентября 2013 г.

Качество кода (или взгляд по-русски)


Сподвиг к написанию твит http://zeroturnaround.com/rebellabs/there-is-more-to-code-quality-than-just-pretty-vs-ugly/?utm_content=buffer1b258&utm_source=buffer&utm_medium=twitter&utm_campaign=Buffer#!/
и желание уже наконец-то расшифровать (может кому-то поможет?) на понятном русском языке буржуйские загадочные термины и слова касательно характеристик кода и программного продукта в целом. Постараюсь привязать инструменты и методы, которые помогают улучшить тот или иной параметр качества. Примеры кода будут позже. Сейчас же на скорую руку написал свои первые мысли на сей счет. Между прочим, указанную статью я еще не читал, а потому может включу сюда, если увижу там что-то чего я смог упустить.

Fitness
~~~~~~~
Это типа отсутствие жирка. Жирок конечно необходим в экстремальных условиях, но для спортсмена требуется поддерживать себя в форме, чтобы показывать стабильно хорошие результаты. Так и здесь, в коде, требуется убирать излишества, которые затрудняют понимание кода и отдаляют нас от начальных целей и основопологающих идей. Более того, тестировать универсальные вещи сложнее, так как нужно специально выдумывать искуственные сценарии для тестирования. В противоположность этому, task centric-код полагается на уже имеющиеся сценариии использования кода для решения конкретной задачи и, потому, не требуется выдумывать тесты, так как они уже под рукой.
Безусловно, возникает вопрос по библиотекам, универсальным фреймуоркам, но у них тоже есть свои клиенты, свое сообщество пользователей, а потому придумать сценарии использования не так уже сложно, если известно для чего будут использоваться библиотеки и фреймуорки.
Жирок убрать сложно, если плохо определено назначение кода. Возникает желание сделать кода максимально готовым ко всему. Это и есть причина такого жирного и универсального кода.
Буржуи любят термин “high cohesion”, т.е. дословно “высокая зацепленность кода” или более понятно это означает, что код должен фокусироваться на выполнении конкретной задачи, а не заниматься посторонними вещами. Типа специалиазация и еще раз специализация.
Поможет в этом частично TDD. Сначала тесты, а затем код.

Correctness
~~~~~~~~~~
Все просто, в коде не место ошибкам, код должен правильно решать задачи. Поможет только тест, т.е. формализуем в тесте постановку задачи и сверяем с ответом. Погружаем наше решение в тест и смотрим результат проверки решения. Погружаем вновь и вновь пока не получим на выходе “Тест пройден”. Правда между последовательными погружениям не забываем исправлять код, а иначе войдем в бесконечность или, что более точно, пока компьютер не перегорит.
Для поиска логической ошибки в коде потребуется посидеть с отладчиком изучая, возможно, используемые сторонние библиотеки.

Performance
~~~~~~~~~~
Код должен выполняться за приемлемое время. Если меня кто-то неожиданно делегирует представлять страну в Олимпийских играх в дисциплине Марафон, то это будет очень странным решением, так как выбрали очевидно не того человека, так как даже если сильно захотеть, то гены у меня не те, чтобы соревноваться не то что с Абебе Бикила, а даже с обычным рядовым бегуном, например, с Бочариком.
Короче, дело к ночи, точнее к работе, а потому кратко скажу, что надо выбирать соответствующие задаче алгоритмы и структуры данных. Сперва лучше не гнаться за супер-пупер алгоритмами дающими менее порядка величины улучшения по сравнению с простыми, но не супер-пуперскими алгоритмами и структурами. Ниже, в разделе о сопровождении ПО, поясняется почему нежелательно изощряться без лишней необходимости.
Инструментов для распознавания правильно используемых алгоритмов и структур, увы, нет. Тут только экспертиза поможет.
Есть правда нефункциональные требования к продукту. Выдавать веб-страницу на экран пользователя через максимум секунду, а лучше через пол-секунды, после его желания увидеть произведение дизайнера. Желание обычно формируется через нажатие ссылки, кнопки или ввода адреса в адресной строке браузера. Или, например, сделать закрытие операционного дня за 2 часа, чтобы бухгалтеры смогли вернуться домой вовремя, чтобы утром встать выспавшимися и бодрыми для повышения экономических показателей банка и, соответственно, для улучшения аппетита у акционеров этого банка при виде роста котировок акций банка.
Вообщем, очень хорошо, когда есть нефункциональные требования. Это есть источник того, что может позволить верифицировать код по метрикам группы Производительность системы.
Для замеров существует масса инструментов типа JMeter, а также любых самописных инструментов и системных утилит. У юниксоидов, как мне кажется, выбор лучше и проще.
Да, забыл совсем. Есть еще очень хорошие инструменты FindBugs, PMD, которые позволяют найти широко распространенные ошибки в коде, в т.ч. касающиеся многопоточного кода.

Clarity
~~~~~~~~
Типа ясность и прозрачность кода для чела впервые увидевшего оный или для того кто настрогал этот код а теперь вернулся его почитать, чтобы понять логику работы.
Нет ничего очевиднее, что простота и ясность важна. “Говорите яснее”, “короткое и лаконичное описание” - часто слышим, но редко этому следуем. Собственно, изъясняться на правильном русском тоже талант, который, к сожалению и ах, ныне редко встретишь ИТ-специалистов и не только ИТ. Код, собственно, в этом отношении ничем не должен отличаться от требования изъясняться “по-русски”.
Частично здесь может помочь checkstyle и разные метрики типа cyclomatic code complexity. Конвенция о стиле кода (соглашение по кодированию) - это субкультура. Не может быть единой для всех. Появляется с согласия основателей и пионеров кода, которые привыкли к определенному стилю.

Maintainablity
~~~~~~~~~~~
Дословно - способность поддерживаться (кем-л. или чем-л). Ну а на нашем великом языке синонимом этому словосочетанию является издревле испокон века - простота. Да, да, простота. Простота во всем! Так как простота позволяют любому с улицы. Ладно, ладно, не с совсем уж с улицы, а сразу из университета. Да-к вот, любой студент пришедший в компанию может легко и без красных глаз разобраться в коде. Сложный критерий качества продукта, согласен. Ведь всем всегда очень хочется задействовать весь арсенал современных инструментов, которые только-только вышли на рынок.
Потому стандарты важны. Потому важно обучение стандартам в вузах.
Регулируется простота процессом контроля за используемыми инструментами и библиотеками. Никаких самописных аналогов допускать не следует прежде чем не найдется веских оснований для этого. А если сильно хочется что-то самописное, то следует изучить лучшие практики созданию подобных продуктов, а потом садиться за комп. Желательно свой шедевр выставить на всеобщее обозрение, чтобы сообщество разработчиков всего мира смогли вылить на вас все о чем они думают после знакомства с вашим изобретением. Возможно после всего этого мнение об использовании своей писанины изменится в сторону использования популярной и аналогичной тулзы.
“Простота - залог здоровье, а здоровье прежде всего”.

Beauty
~~~~~~~
“Красота спасет мир!”. Это ясно. А еще не помню кто из физиков сказал такое, но было сказано следующее близкое по смыслу. “Если я вижу красивое уравнение, то сразу склонен верить, что истина где-то рядом”.
Сложно измерить красоту. Красота в коде доставляет удовольствие заниматься с этим произведением искуства. Начинаешь чувствовать свое величие и возможность прикоснуться к прекрасному.
Очень хорошо помогает улучшать эстетику кода - вынос его на всеобщее обозрение под любой подходящей публичной лицензией.
Как мне кажется, весь синтетический сахар появляющийся сейчас способствует формированию вкуса и красоты у разработчиков. Код становится лаконичным и более функциональным. Объектно-ориентированная парадигма была в моде, а сейчас больше движение в сторону функционального подхода. Это движение в свою очередь появилось, по моему пониманию, из-за все более дешевой памяти и доступности многопроцессорных архитектур.
Красота - это радость для глаз! :)

Извините за бесчисленные грамматические ошибки и свое несовпадающее с вами видении данной темы. Буду рад замечаниям и дополнениям.
А если вспомнить еще про Майера с его терминами reliability, scalability, robustness и т.д., то данные обрывки мысли можно обогатить и структурировать в отдельную статью.

среда, 13 февраля 2013 г.

Задаче о колодце и дисках


За 18 минут решил задачку на codility. Этот сайт мне порекоммендовал коллега для тренировки алгоритмики. Решение получилось вот такое
class Solution {
  public int falling_disks ( int[] A,int[] B ) {
    int N = A.length;
    int M = B.length;
    for(int i = 1; i < N; i++){
      if (A[i - 1] < A[i]){
        A[i] = A[i - 1];
      }
    }
    int k = 0;
    int j = N;
    while (k < M && j > 0){
      while (A[--j] < B[k]){
        if (j == 0){
          return k;
        }
      }
      k++;
    }
    return k;
  }
}
Там даже сертификаты выдают за это дело. Вот мой типа.

пятница, 15 июня 2012 г.

Я такой, какой я есть!

Интересное направление зародилось в психологии благодаря силам наших братьев славян из славного города Киева. И название ей - томалогия. Вот выдержка из нового трактата по поводу неполноценности и как оно формируется в детстве.

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

У такого человека существует страх быть отражённым неблагополучно. Он зависит от отражения и постоянно тревожится, беспокоясь о том, чтобы быть отражённым согласно своей собственной идее о полноценности. Если его полноценность отражена, он человечен, если нет, если кто-то отражает его не так, как он хочет, то у него возникает злость, защитная ненависть, бравада, он начинает конфликтовать.

Идея неполноценности входит только тогда, когда происходит отказ от самого себя. Это случается в раннем возрасте, когда ребёнок начинает сравнивать себя с другими детьми, когда родители, учителя, воспитатели провоцируют ребёнка на такое сравнение, показывая, что «Вовочка лучше, чем ты – он аккуратен, а ты неаккуратен. Он отличник, а ты троечник, он усидчив, а ты нет».

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

Ребенок полноценен, невинен и простодушен. Ему обязательно будут доступны все его внутренние богатства, весь его внутренний потенциал, однако для этого понадобится время. И у взрослых должно быть колоссальное терпение, любовь и уважение к детям. Дети - это будущее, и они будут жить в совершенно другом мире, в другие годы, в другом информационном пространстве.

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

Мозг человеческий, это научный факт, может вместить в себя все библиотеки мира, это не проблема для ума. И все научные умы трудятся над тем, чтобы ум ребёнка упаковать информацией так, чтобы ни один компьютер с ним не сравнился. Ценится память. Человек ценится по памяти, он не ценится по уникальности, по индивидуальности, по своей собственной неповторимой комбинации, как личность, как будущее человечества. Он ценится и оценивается просто по своей памяти. Если мы сдаём экзамен, то просто оценивают нашу память, а то, что сейчас мы выйдем и всё забудем - это ерунда.

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

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

Человек, ребёнок, который развивается согласно самому себе, будет осуществлён особым способом, согласно собственной природе. Это станет его удовлетворением, он станет самой удовлетворённостью. На земле нет удовлетворенных людей только потому, что, сколько бы человек ни трудился и как бы он ни использовал свои мозги, это не затрагивает его сердце, его суть.

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

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

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

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