<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Блог программиста]]></title>
  <link href="http://Serganbus.github.io/atom.xml" rel="self"/>
  <link href="http://Serganbus.github.io/"/>
  <updated>2015-01-28T20:23:55+06:00</updated>
  <id>http://Serganbus.github.io/</id>
  <author>
    <name><![CDATA[Сергей Иванов]]></name>
    <email><![CDATA[sega234@mail.ru]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Материалы по D3js]]></title>
    <link href="http://Serganbus.github.io/blog/2015/01/28/d3-materials/"/>
    <updated>2015-01-28T20:03:05+06:00</updated>
    <id>http://Serganbus.github.io/blog/2015/01/28/d3-materials</id>
    <content type="html"><![CDATA[<p>В данном посте собраны материалы по изучению библиотеки визуализации D3, актуальные на дату публикации. Список материалов приведен как на русском, так и на английском языках.</p>

<!--more-->


<h3>Материалы на русском языке</h3>

<p>На русском языке информации по javascript библиотеке визуализации данных D3 крайне мало. А структурированной и полной информации нет вообще. И, тем не менее, можно изучить небольшое <a href="http://serganbus.github.io/d3tutorials/index.html">руководство</a>, которое может дать самый минимум. Также, если хорошо порыться, можно отыскать пару-тройку статей-введений в D3. На этом, пожалуй, информация по D3 для человека, понимающего лишь русский язык, заканчивается.</p>

<h3>Материалы на английском языке</h3>

<h4>От автора библиотеки</h4>

<p>Для людей, понимающих английский язык, информации для ознакомления куда больше. <br/>
Безусловно, лучшим источником информации по любому инструменту разработки или библиотеке является официальная документация. D3, в этом случае, не исключение. Официальная документация находится на <a href="https://github.com/mbostock/d3/wiki/API-Reference">здесь</a>. <br/>
Также автор этой библиотеки делится тонкостями использования D3 в своем <a href="http://bost.ocks.org/mike/">блоге</a>. <br/>
На <a href="http://d3js.org/">официальном сайте</a> библиотеки собрано большое количество <a href="https://github.com/mbostock/d3/wiki/Gallery">примеров</a> ее использования для разного рода визуализаций. Исходный код к ним прилагается. Очень познавательно.</p>

<h4>Сторонние сайты и блоги</h4>

<p><a href="http://www.d3noob.org">http://www.d3noob.org</a> - сайт-набор статей по D3js. Этакий сборник рецептов(советы и рекомендации) использования библиотеки; <br/>
<a href="http://alignedleft.com/tutorials/d3">http://alignedleft.com/tutorials/d3</a> - Краткое руководство-введение. Изучить можно за несколько часов. По окончании чтения достаточно знаний, чтобы самому экспериментировать. Автор Скотт Мюррей; <br/>
<a href="https://www.dashingd3js.com/table-of-contents">https://www.dashingd3js.com/table-of-contents</a> - Более объемлющее и подробное руководство-введение; <br/>
<a href="http://courses.cs.washington.edu/courses/cse512/14wi/d3-tutorial/fundamental.html#/">http://courses.cs.washington.edu/courses/cse512/14wi/d3-tutorial/fundamental.html#/</a> - Еще одно краткое руковоство-введение от одного из ведущих университетов США.</p>

<h4>Обучающие видео</h4>

<p><a href="http://www.youtube.com/playlist?list=PL6il2r9i3BqH9PmbOf5wA5E1wOG3FT22p">http://www.youtube.com/playlist?list=PL6il2r9i3BqH9PmbOf5wA5E1wOG3FT22p</a>
<a href="http://www.youtube.com/playlist?list=PLHfLBrRzKS4q4cU4ewZ2Q1pnJZ2WiKAPq">http://www.youtube.com/playlist?list=PLHfLBrRzKS4q4cU4ewZ2Q1pnJZ2WiKAPq</a>
<a href="https://egghead.io/technologies/d3?page=1">https://egghead.io/technologies/d3?page=1</a></p>

<h4>Книги</h4>

<p><a href="http://chimera.labs.oreilly.com/books/1230000000345/">Interactive Data Visualization for the Web</a>. Автор Скотт Мюррей. Его краткое руководство-введение представляет собой выжимку из этой книги. <br/>
<a href="https://leanpub.com/D3-Tips-and-Tricks">D3 Tips and Tricks</a>. Автор Малкольм Маклин. Опять таки сборник рецептов, советов и рекомендаций, но уже в книжном варианте. <br/>
<a href="http://www.amazon.com/Data-Visualization-D3-js-Cookbook-Nick/dp/178216216X">Data Visualization with D3.js Cookbook</a>. Автор Nick Qi Zhu. Книга обладает наиболее качественно структурированным материалом из всех представленных здесь(по мнению автора статьи). <br/>
Отмечу также, что все книги, которые здесь представлены, доступны бесплатно в pdf формате, однако, их придется поискать.</p>

<p>Если вы хотите поделиться ссылками на свои материалы, пожалуйста, пишите в комментариях.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Масштабирующие функции в D3]]></title>
    <link href="http://Serganbus.github.io/blog/2015/01/20/scales-in-d3/"/>
    <updated>2015-01-20T23:28:30+06:00</updated>
    <id>http://Serganbus.github.io/blog/2015/01/20/scales-in-d3</id>
    <content type="html"><![CDATA[<p>Приветствую! <br/>
В этом цикле статей я попытаюсь доступно объяснить, что такое масштабирование применительно к визуализации данных, зачем оно нужно, и как оно представлено в библиотеке D3. Надеюсь, будет познавательно.</p>

<!-- more -->


<p>При разработке визуализации данных всегда имеется одна и та же ключевая задача, которую вам приходится решать снова и снова: сопоставление входным данным  визуальных образов. Например, необходимо сопоставить недавно купленный смартфон за 18000р с столбиком высотой 240 пикселей, а также ваш последний поход в кафе, который обошелся в 1453р со столбиком высотой, скажем 50 пикселей. В каком-то смысле, это все, что представляет из себя визуализация данных - сопоставление входным данным каких-либо характеристик визуальных образов так, чтобы при взгляде на визуализацию сразу было ясно о чем идет речь.</p>

<p>В первую очередь следует сказать, что в D3 функции масштабирования являются одновременно и объектами. Как объект, они имеют собственные методы, которые необходимы для настройки функций масштабирования. <br/>
Еще необходимо упомянуть, что в D3 использование функций масштабирования для построения визуализаций не является обязательным. Тем не менее, использование их  может невероятно упростить процесс преобразования входного набора данных в визуальные образы.</p>

<p>Но ближе к делу. <br/>
Как мы знаем из курса школьной математики, функция — это правило, по которому каждому элементу одного множества (называемого областью определения) ставится в соответствие некоторый элемент другого множества (называемого областью значений), то есть:
<img class="center" src="http://Serganbus.github.io/images/posts/function.png" width="311" height="209" title="Функция" alt="Функция">
Множество A - область определения; множество B - область значений. <br/>
Так вот: в документации к D3 масштабирующие функции разелены на три вида: <br/>
1. Функции, область определения которых представлена всякого рода числовыми последовательностями. Буду называть их количественными функциями масштабирования(в англ. документации quantitative); <br/>
2. Функции, область определения которых представлена разными множествами. Буду называть их порядковыми функциями масштабирования(в англ. документации ordinal); <br/>
3. Функции, область определения которых представлена датами, то есть временные функции масштабирования. <br/>
Так как описание каждого вида масштабирующей функции само по себе включает много текста, пояснений и изображений, я решил для каждого вида функции масштабирования выделить отдельную запись. По мере выкладывания новой записи, раскрывающей использование той или иной функции масштабирования, в этом посте будут обновляться ссылки.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Продвинутая столбиковая диаграмма с использованием D3.js]]></title>
    <link href="http://Serganbus.github.io/blog/2014/12/13/advanced-bar-chart/"/>
    <updated>2014-12-13T23:49:49+06:00</updated>
    <id>http://Serganbus.github.io/blog/2014/12/13/advanced-bar-chart</id>
    <content type="html"><![CDATA[<p>Приветствую!
Сегодня мы поговорим об обязательных атрибутах продвинутой столбиковой диграммы и о том, как ее реализовывать с использованием библиотеки визуализации данных D3.js. В моем переводе краткого руководства уже затрагивалась тема построения столбиковой диаграммы, однако продвинутой ее назвать язык просто не поворачивается. Кто еще не читал это краткое руководство, оно находится <a href="http://serganbus.github.io/d3tutorials/making_bar_chart.html">здесь</a>.</p>

<p>Допустим, нам необходимо показать, сколько денег мы тратим каждый день в течении месяца. Логично, что для этого дела мы выбрали столбиковую диаграмму. Для начала определимся, что же из себя представляет продвинутая столбиковая диаграмма? Минимальным набором для такой диаграммы является набор столбиков, оси и метки на осях. Хорошо если диаграмма будет иметь легенду(по-русски: подпись). Еще лучше, если диаграмма будет интерактивная. Представьте: наводишь мышью на столбик, а он подсвечивается, да еще и отображается посказка, какое значение отображает этот столбик! И верхом всего будет продвинутая интерактивность. Давайте же выполним задуманное.</p>

<!-- more -->


<p>Делаем все по порядку.</p>

<h4>Этап 1. Простая диаграмма</h4>

<p>Сначала реализуем диаграмму с минимальным набором. Тут расписывать нечего, так как пользуемся лишь знаниями, полученными при чтении <a href="http://serganbus.github.io/d3tutorials/index.html">переведенного руководства</a>.
Смотрим на <a href="http://jsfiddle.net/Serganbus/0gbjxqf2/">результат</a>. Сразу выявляется недочет: подписи на горизонтальной оси накладываются друг на другу, тем самым не давая себя прочитать. Если мы проанализируем в web-inspector&#8217;e, из чего состоит одна метка на оси, то увидим следующее:
<img class="center" src="http://Serganbus.github.io/images/posts/advanced_bar_chart_1.jpg" width="602" height="172" title="Web Inspector" alt="Web Inspector">
То есть, метка состоит из линии и подписи. И подпись у нас никак не корректируется в зависимости от ширины столбика. Выглядит ужасно и очень не информативно. Чтобы это исправить, нам нужно сделать так, чтобы подпись для каждого столбика корректировалась в зависимости от ширины этого столбика.  Концептуально можно выделить такую последовательность действия для решения этой задачи: <br/>
1. Выбираем все метки на горизонтальной оси методом <a href="https://github.com/mbostock/d3/wiki/Selections#d3_selectAll">d3.selectAll()</a>; <br/>
2. Поворачиваем подпись метки на такой угол, чтобы ее ширина была соизмерима с шириной столбика; <br/>
3. Позиционируем подпись метки так, чтобы было ясно, к какому столбику она относится; <br/>
Для реализации пункта 1 модифицируем код создания горизонтальной оси:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>var lHorizontalAxis = chart.append("g")
</span><span class='line'>    .attr("class", "x axis")
</span><span class='line'>    .attr("transform", "translate(0, " + chartHeight + ")")
</span><span class='line'>    .call(xAxis)
</span><span class='line'>    .selectAll("g.tick")
</span><span class='line'>    .call(tickTextWrapping, xScale.rangeBand());</span></code></pre></td></tr></table></div></figure>


<p>Теперь, как видите, я выбираю все контейнеры, хранящие метки, и для полученный выборки вызываю метод <em>tickTextWrapping</em>, в котором технически реализованы пункты 2 и 3. Код метода:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>function tickTextWrapping(aTick, aTextMaxWidth) {
</span><span class='line'>    var lTickTextsWidth = 0;
</span><span class='line'>    aTick.each(function (d) {
</span><span class='line'>        var lTick = d3.select(this);
</span><span class='line'>        lTick.select("text").remove();
</span><span class='line'>        var lTextContainerInitialX = 0;
</span><span class='line'>        var lTextContainerInitialY = 17;
</span><span class='line'>        var lTextContainer = lTick.append("g").attr("transform", "translate(" + lTextContainerInitialX + ", " + lTextContainerInitialY + ")");
</span><span class='line'>        var lText = lTextContainer.append("text").text(d).style("text-anchor", "middle");
</span><span class='line'>        var lTextWidth = lText[0][0].clientWidth;
</span><span class='line'>        var lTextHeight = lText[0][0].clientHeight;
</span><span class='line'>        if (aTextMaxWidth/lTextWidth &lt; 1) {
</span><span class='line'>            var lTextRadian = Math.acos(aTextMaxWidth/lTextWidth) * 180 / Math.PI;
</span><span class='line'>            var lTextIndent = lTextHeight / 2;
</span><span class='line'>            lTextContainerInitialY -= lTextIndent;
</span><span class='line'>            lText.attr("transform", "rotate(" + -lTextRadian + ")").attr("dy", lTextIndent).style("text-anchor", "middle");
</span><span class='line'>            var lTextContainerWidth = -lTextWidth * Math.sin(aTextMaxWidth/lTextWidth) / 2 + lTextContainerInitialX;
</span><span class='line'>            var lTextContainerHeight = lTextWidth * Math.cos(aTextMaxWidth/lTextWidth) / 2 + lTextContainerInitialY;
</span><span class='line'>            lTextContainer.attr("transform", "translate(" + lTextContainerWidth + ", " + lTextContainerHeight + ")");
</span><span class='line'>        }
</span><span class='line'>    });
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>Метод на вход принимает набор меток, а также максимально допустимую ширину метки. Кстати, внутри этого метода можно делать с метками все что душе угодно. Так что советую запомнить этот прием. <br/>
Итак, смотрим на полученный <a href="http://jsfiddle.net/Serganbus/0gbjxqf2/1/">результат</a>. <br/>
Теперь если мы добавим данные о тратах за все дни месяца, у нас все равно получится очень красивая и наглядная диаграмма. <a href="http://jsfiddle.net/Serganbus/0gbjxqf2/2/">Полученный результат</a>.</p>

<h4>Этап 2. Добавляем легенду</h4>

<p>Для большей информативности добавим легенду:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>var lChartCaption = "График расхода денежных средств за ноябрь 2014";
</span><span class='line'>chart.append("text")
</span><span class='line'>    .attr("x", chartWidth / 2)
</span><span class='line'>    .attr("y", -chartMargin.top / 2)
</span><span class='line'>    .style({"text-anchor": "middle", "font": "24px Courier New"})
</span><span class='line'>    .text(lChartCaption);</span></code></pre></td></tr></table></div></figure>


<p><a href="http://jsfiddle.net/Serganbus/0gbjxqf2/3/">Результат с легендой</a>. <br/>
Еще приятнее и информативнее стала выглядеть наша диаграмма.</p>

<h4>Этап 3. Добавляем интерактивность</h4>

<p>Сделаем так, чтобы при наведении курсором на столбик он выделялся. Это делается простым добавлением CSS-стилей:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>svg rect.bar:hover {
</span><span class='line'>    fill: #00C12B;
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p><a href="http://jsfiddle.net/Serganbus/0gbjxqf2/4/">Результат</a>. <br/>
Для достижения большей интерактивности сделаем так, чтобы при наведении куросором столбик не только выделялся, но и отображалась сверху подсказка со значением столбика. <br/>
Для этого мы создаем на для каждого столбика отдельную подсказку, воспользовавшись элементом polygon:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>var labelsContainers = chart.selectAll("g.label")
</span><span class='line'>    .data(dataset)
</span><span class='line'>    .enter()
</span><span class='line'>    .append("g")
</span><span class='line'>    .attr("class", "label")
</span><span class='line'>    .attr("transform", function (d) {
</span><span class='line'>        var lInitialX = xScale(d.label);
</span><span class='line'>        var lX = lInitialX + xScale.rangeBand() / 2;
</span><span class='line'>        var lY = yScale(d.data);
</span><span class='line'>        return "translate(" + lX + ", " + lY + ")";
</span><span class='line'>    })
</span><span class='line'>    .attr("id", function (d, i) { return "label" + i; })
</span><span class='line'>    .style("display", "none");
</span><span class='line'>labelsContainers.append("polygon")
</span><span class='line'>    .attr("points", "0,0 -5,-10 -50,-10 -50,-50 50,-50 50,-10 5,-10");
</span><span class='line'>labelsContainers.append("text")
</span><span class='line'>    .attr("id", function (d, i) { return "date" + i; })
</span><span class='line'>    .attr("x", "0")
</span><span class='line'>    .attr("y", function (d) {
</span><span class='line'>        return -35;
</span><span class='line'>    })
</span><span class='line'>    .style("text-anchor", "middle")
</span><span class='line'>    .text(function (d) { return "Дата: " + d.label; });
</span><span class='line'>labelsContainers.append("text")
</span><span class='line'>    .attr("id", function (d, i) { return "value" + i; })
</span><span class='line'>    .attr("x", "0")
</span><span class='line'>    .attr("y", function (d) {
</span><span class='line'>        return -15;
</span><span class='line'>    })
</span><span class='line'>    .style("text-anchor", "middle")
</span><span class='line'>    .text(function (d) { return "Расходы: " + d.data; });</span></code></pre></td></tr></table></div></figure>


<p>И на каждый столбик вешаем обработчики &ldquo;mouseenter&rdquo; и &ldquo;mouseleave&rdquo;, которые управляют отображением подсказок:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>.on("mouseenter", function (d, i) {
</span><span class='line'>        chart.select("#label" + i).style("display", "block");
</span><span class='line'>    })
</span><span class='line'>    .on("mouseleave", function (d, i) { 
</span><span class='line'>        chart.select("#label" + i).style("display", "none"); 
</span><span class='line'>    });</span></code></pre></td></tr></table></div></figure>


<p>Таким образом, наша продвинутая стобликовая диаграмма готова!
<a href="http://jsfiddle.net/Serganbus/0gbjxqf2/5/">Конечный результат</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[D3. Краткое руководство]]></title>
    <link href="http://Serganbus.github.io/blog/2014/10/23/d3-tutorials-translated/"/>
    <updated>2014-10-23T17:04:39+06:00</updated>
    <id>http://Serganbus.github.io/blog/2014/10/23/d3-tutorials-translated</id>
    <content type="html"><![CDATA[<p>Представляю вашему вниманию <a href="http://serganbus.github.io/d3tutorials/index.html">перевод</a> книги Скотта Мюррея &ldquo;D3 Tutorials&rdquo;. Книга представляет собой быстрый вводный курс в использование библиотеки визуализации D3. Если вы еще не слышали о ней и не знаете ее возможностей, предлагаю вам посетить <a href="http://d3js.org/">официальный сайт библиотеки</a> и ознакомиться с впечатляющими <a href="https://github.com/mbostock/d3/wiki/Gallery">примерами использования</a>.</p>

<p>Так вот, книга представляет собой настолько последовательное описание, что понять его сможет даже тот, кто никогда не программировал. Вообще, книга и рассчитана на таких людей, поэтому если вы знаете язык JavaScript и имеете представление о HTML5 и CSS - прочтение и погружение в суть разработки визуализаций с использованием D3 займет у вас, наверное, несколько часов!</p>

<p>Наслаждаемся <a href="http://serganbus.github.io/d3tutorials/index.html">переводом</a>!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Кто такой программист?]]></title>
    <link href="http://Serganbus.github.io/blog/2014/10/11/who-is-programmist/"/>
    <updated>2014-10-11T13:43:09+06:00</updated>
    <id>http://Serganbus.github.io/blog/2014/10/11/who-is-programmist</id>
    <content type="html"><![CDATA[<p>Размышляя над тем, какие навыки больше всего нужны программисту, в уме нарисовалась занимательная пирамида по подобию пирамиды Маслоу, а позже была перенесена в компьютерное изображение:
<img class="center" src="http://Serganbus.github.io/images/posts/programmer_pyramide.png" width="806" height="402" title="Пирамида программиста" alt="Пирамида программиста"></p>

<!--more-->


<p>Рассмотрим каждый слой подробнее:</p>

<h4>Логика</h4>

<p>Конечно же, самое важное, чем должен обладать программист – это логика. Умение правильно мыслить, выявлять взаимосвязи между явлениями безусловно должны быть атрибутами каждого не столько программиста, сколько толкового технаря.</p>

<h4>Математика</h4>

<p>Если человек обладает логическим мышлением, значит знание математики лишь вопрос времени.
Конечно же, разным специализациям необходимы различные разделы математики, однако, знание математического аппарата на уровне хотя бы школьного курса критически необходимо.</p>

<h4>Формализация</h4>

<p>Перенести любые действия на язык точных наук - дано не каждому. Именно здесь без знания математики, логики, и, возможно, других наук не обойтись. Умение пользоваться декомпозицией сложных задач на более мелкие подзадачи категорически приветствуется.</p>

<h4>Алгоритмы и структуры данных</h4>

<p>Фактически, алгоритмы и структуры данных необходимы для кодирования формализованной модели процесса/объекта/системы.
Строить алгоритмы еще учат в школьном курсе информатики. Там дают понятие термина &ldquo;алгоритм&rdquo;, учат их составлять, даже строят блок-схемы по ним. Но какая это потрясающая вещь, кто-нибудь для себя вынес? А ведь мы с ними сталкиваемся каждый день! Да что уж говорить, нашу жизнь можно описать простым алгоритмом, приводящим неизменно к одному и тому же результату. Рождение-> детство-> юношество-> молодость-> зрелость-> старость-> смерть. Это, наверное, самый надежный алгоритм во вселенной!</p>

<h4>Языки программирования</h4>

<p>Все основные алгоритмы и структуры данных доступны практически(а может и на любом) языке программирования. Здесь уместно сравнение с человеческими языками: их существует огромное множество, однако на каком бы из них ни говорил человек, он сможет выразить все, что угодно! Таким образом, язык программирования является инструментом выражения формализованной модели или алгоритма, следствием выполнения которого является работающая программа.</p>

<h4>Шаблоны проектирования</h4>

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

<h4>Технологии</h4>

<p>Я расположил это понятие на верхушке своего представления о программировании, потому что технологии являются синтезом всего вышеперечисленного. Например, при раскрытии темы веб-технологии оказывается, что это собирательное понятие использования определенного набора языков программирования(скажем, PHP, Java, JavaScript и т.д.), архитектур приложений(например сервис-ориентированные приложения, клиент-серверные приложения) и определенного набора шаблонов проектирования(допустим, MVC, MVVM).</p>

<h4>И это все?</h4>

<p>Описанная выше пирамида предполагает, что последующий уровень знаний требует некоторые знания из предыдущего.
Поэтому, в это представление не вписываются умения владением системами контроля версий, операционными системами и всякого рода методологиями разработки. Это такие вещи, понимание которых делает жизнь проще и краше всегда.</p>
]]></content>
  </entry>
  
</feed>
