March 6th, 2011

humster

rikosha

О пользе и вреде специализации для разработчиков

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

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

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

И это одна из наибольших опасностей, лежащая в специализации. Специализация в конкретной технологии – это ваша личная инвестиция. Ваш текущий уровень жизни, ваши средства к существованию во многом зависят от конкретной технологии. Конечно же, вы можете перейти на что-то другое, но вам будет необходимо привыкать к меньшему, чем то, что у вас уже было, вероятно, на некоторое время, это коснется и денег и вашего роста как специалиста. Откровенно говоря, скорее всего именно поэтому вы так привязаны к текущей технологии. Когда вы столкнетесь с плохими новостями, касающимися будущего вашей технологии, скорее всего у вас появятся первые симптомы отказа принимать эти новости. Недавние новости об изменении стратегии Silverlight, в частности, реакции на это изменение – это чудесный тому пример. Специалисты Silverlight писали блоги и убеждали людей в достоинствах технологии и то, что мы все не должны придавать слишком большого значения последним заявлениям Microsoft. Это классический отказ принять действительность и это произойдет и с вами, если вы, по любой причине, будете эмоционально привязаны к технологии.

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

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

Давно мне нравтся читать блогераrikosha в ЖЖ.Он пишет очень отменно и интересно!Недавно мне на глаза попалась вышеперечисленная статья и чтовы бы думали мне очеь это понраислось сами почитайте!
humster

webshara.ru

Задача RMQ весьма часто встречается в спортивном и прикладном программировании. Удивительно, что на Хабре ещё никто не упомянул эту интересную тему. Попробую восполнить пробел.

Аббревиатура RMQ расшифровывается как Range Minimum (Maximum) Query – запрос минимума (максимума) на отрезке в массиве. Для определённости мы будем рассматривать операцию взятия минимума.

Пусть дан массив A[1..n]. Нам необходимо уметь отвечать на запрос вида «найти максимум на отрезке с i-ого элемента по j-ый».
Рассмотрим в качестве примера массив A = {3, 8, 6, 4, 2, 5, 9, 0, 7, 1}.
Например, минимум на отрезке со второго элемента по седьмой равен двум, то есть RMQ(2, 7) = 2.

В голову приходит очевидное решение: ответ на каждый запрос будем находить, просто пробегаясь по всем элементам массива, лежащим на нужном нам отрезке. Такое решение, однако, не является самым эффективным. Ведь в худшем случае нам придётся пробежаться по O(n) элементам, т.е. временная сложность этого алгоритма – O(n) на один запрос. Однако, задачу можно решить эффективнее.



Постановка проблемы


Для начала уточним постановку задачи.

Что значит слово static в заголовке статьи? Задачу RMQ иногда ставят с возможностью изменения элементов массива. То есть к запросу взятия минимума добавляется возможность изменения элемента, или даже изменения элементов на отрезке (например, увеличения всех элементов на подотрезке на 3). Такой вариант задачи, называемый dynamic RMQ, я рассмотрю в последующих статьях.

Замечу здесь же, что задачу RMQ подразделяют на offline и online версии. В offline-варианте есть возможность сначала получить все запросы, проанализировать их каким-нибудь образом и только потом выдать на них ответ. В online-постановке запросы даются по очереди, т.е. следующий запрос поступает только после ответа на предыдущий. Заметим, что решив RMQ в online-постановке, мы сразу получаем решение и для offline RMQ, правда, может существовать более эффективное решение для offline RMQ, не применимое для online-постановки.

В этой статье мы будем рассматривать static online RMQ.

Недавно мне на глаза попалось очень интересное предложени http://webshara.ru/ заманчиво!Тем кто в теме находится поймет меня!
humster

alpari

Большое спасибо за советника и др.! Конечно же, код интересен и актуален. То, что предложенная Альпари Collapse )
humster

alan 999

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

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

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

И это одна из наибольших опасностей, лежащая в специализации. Специализация в конкретной технологии – это ваша личная инвестиция. Ваш текущий уровень жизни, ваши средства к существованию во многом зависят от конкретной технологии. Конечно же, вы можете перейти на что-то другое, но вам будет необходимо привыкать к меньшему, чем то, что у вас уже было, вероятно, на некоторое время, это коснется и денег и вашего роста как специалиста. Откровенно говоря, скорее всего именно поэтому вы так привязаны к текущей технологии. Когда вы столкнетесь с плохими новостями, касающимися будущего вашей технологии, скорее всего у вас появятся первые симптомы отказа принимать эти новости. Недавние новости об изменении стратегии Silverlight, в частности, реакции на это изменение – это чудесный тому пример. Специалисты Silverlight писали блоги и убеждали людей в достоинствах технологии и то, что мы все не должны придавать слишком большого значения последним заявлениям Microsoft. Это классический отказ принять действительность и это произойдет и с вами, если вы, по любой причине, будете эмоционально привязаны к технологии.

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

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

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

allan999
humster

секционные ворота

Наверняка каждому встречалась задача нахождения k-ого наименьшего элемента в массиве. k-ый элемент характеризуется тем, что он больше (или равен) k элементов массива и меньше или равен N-k оставшихся элементов (где N – число элементов в массиве).

Задача нахождения k-ого наименьшего элемента обычно связывается с задачей сортировки, так как очевидный метод нахождения этого элемента состоит в сортировке N элементов и выборе k-ого.

Но мы с вами пойдём немного другим путём. Я предполагаю, что читатели знают, как работает алгоритм быстрой сортировки, но на всякий случай напомню. В массиве выбирается случайный элемент x, и выполнется просмотр массива слева, пока не найдётся элемент a[i]>x, затем выполняется просмотр справа, пока не будет найден элемент a[j]=x. Описанная процедура применяется рекурсивно для левой и правой части и продолжается до тех пор, пока не будет получен полностью отсортированный массив. (Немного подробнее о эффективных алгоритмах сортировки).

Процедура разделения, используемая в быстрой сортировке, даёт потенциальную возможность находить искомый (k-ый) элемент гораздо быстрее.
Этот алгоритм работает следующим образом. На первом шаге вызывается процедура разделения с L=1 и R=N (т.е. разделение выполняется для всего массива), причём в качестве разделяющего значения x выбирается a[k]. После разделения получаются значения индексов i,j такие, что

a[h]x для всех h>j
i>j

Недавно мне попалось интересное предложение
секционные ворота недорого!На сайте представленно много всего интересного!


секционные ворота