Нужна ли математика программисту?
Нужна. А, кроме неё, нужна сферическая геометрия, география, музыка и банковское дело. И я сейчас не шучу.
Дело в том, что программисты редко решают задачи для самих себя: мы работаем в банковских сервисах, сервисах бронирования отелей, картографических сервисах и прочих Яндекс.Почтах. Получается, что мы решаем задачи наших пользователей.
Для решения чисто программистских задач у нас есть алгоритмы и паттерны: если посмотреть на код интернет-магазина цветов и банковского сайта он будет очень похож. Будут использоваться одинаковые условия, одинаковые циклы и даже паттерн MVC будет один и тот же.
Важнее то, что стоит за этими вещами: понимание как работает система в целом. Если посмотреть на вещи с этой стороны, то станет понятно, что программист — это младший специалист в области, в которой работает сайт.
Ещё пять лет назад Артём Поликарпов доказал, что каждый фронтендер немного дизайнер. Нам нужно понимать как устроены шрифты: что такое гротеск, чем он отличается от антиквы, что такое интерлиньяж, кернинг, разрядка, капитель. Понимать, что такое сетки и что такое композиция. Кроме этого, разбираться в UX — мы должны знать что такое оптимистичный UI, где поставить прелоадер и зачем это всё нужно пользователю.
Но быть только дизайнером — мало. Дело в том, что пользователи взаимодействуют с нашими сайтами: в интернет-магазинах они вводят данные своих банковских карт, на картографических сервисах прокладывают маршруты и измеряют расстояния, на музыкальных сайтах они транспонируют тональность песен и настраивают гитару по тюнеру. И всё это должен кто-то запрограммировать. Получается, что у программиста должны быть специальные знания.
Например, правильность номера банковской карты определяется по алгоритму Луна — это теория кодирования.
Чтобы найти расстояние между двумя точками на карте, заданными широтой и долготой, нужно воспользоваться формулой дуги большого круга — это сферическая геометрия. Ещё этой формулой очень часто пользуются в морской навигации.
С картами, вообще, связано очень много интересного. Например, Яндекс.Карты используют эллиптическую проекцию Меркатора, а все остальные географические сервисы — сферическую, поэтому если вы захотите наложить слой Яндекс.Пробок на любую другую карту у вас не сойдутся улицы и вам нужно будет знать, как трансформировать одну проекцию в другую.
Кстати, о трансформациях. Помните CSS-фильтр matrix
? Те самые числа в странном порядке, которые непонятно как влияют на поведение вашего блока? Это матрицы перехода из линейной алгебры. Если разобраться что такое матрицы и как перемножать их между собой, то вы сможете очень эффективно писать трансформации не пользуясь алиасами.
.neo {
transform: matrix(0, -1, 1, 0, 50px, 50px);
}
С кругозором понятно — изучайте всё, что хотите, потому что в любом случае это вам пригодится. Но есть ли какая-то общая область, которая нужна всем программистам? Да, такая область есть, она называется «дискретная математика». Наука, которая лежит в основе информатики.
Я не говорю, что нужно учить диксретку досконально. Для программиста важнее широта взглядов и понимание, где посмотреть, чем узкие знания в какой-то отдельной области. Но помнить несколько основных тем не помешает.
Во-первых, изучите булеву логику. Вы пишете условия каждый день и хорошо бы понимать, как они работают, например, для того, чтобы эффективно их упрощать.
Ещё одна хорошая тема из дискретки — это графы. Очень многие программистские задачи решаются с помощью графов. Даже скучный и привычный DOM — это дерево, частный случай графа. И здесь неплохо бы понимать хотя бы как по деревьям можно ходить.
Например, вы знаете, что querySelector
использует поиск в глубину? Это значит, что когда он заходит на узел DOM-дерева, он пытается посмотреть сначала его дочерние узлы и только потом соседние. Это значит если вы будете искать с помощью querySelector
первый элемент на странице, то необязательно это будет элемент верхнего уровня, найденный элемент может находиться на любой вложенности.
<main>
<section>
<div id="underdog"></div>
</section>
<div id="favorite"></div>
</main>
const firstDiv = document.querySelector('div');
firstDiv.id === 'underdog';
Ещё одна тема из дискретной математики — алгоритмы. Теория алгоритмов изучает что такое алгоритмы и оценку их эффективности. Представьте, у вас есть список людей, у которых вам нужно посчитать средний рост. Список задан в виде массива объектов.
const people = [
{ name: 'Иван', height: 183 },
{ name: 'Марья', height: 155 },
];
Первое решение, которое может прийти в голову — это с помощью метода map
собрать другой массив, массив ростов этих людей, а потом с помощью метода reduce
посчитать их сумму и поделить на количество.
const averageHeight = people
.map(it => it.height)
.reduce((acc, it) => acc + it) / people.length;
Но это решение будет неэффективным, потому что вы будете использовать два прохода по массиву, вместо одного. Вы могли бы сразу использовать reduce
для того, чтобы сложить сразу все показатели по росту.
const averageHeight = people
.reduce((acc, it) => acc + it.height) / people.length;
На деле оценка эффективности алгоритмов это немного более сложная тема, она учитывает и какой алгоритм вы используете и объём входных данных, но направление мысли вы поняли. Умение оценить эффективность алгоритмов поможет вам писать код, который будет хорошо работать или на старых телефонах и компьютерах или который не будет тормозить при работе со сложными алгоритмами, например, с большими визуализациями.
Итого: учите всё подряд, что попадётся вам под руку. Для начала изучите дискретку, потому что она будет вашим основным инструментом в работе, а потом сосредоточьтесь на задачах вашего бизнеса и вы откроете для себя очень много нового в бизнесе, математике, строительстве и медицине.
Видеоверсия
Вопросы можно задавать здесь.
Комментарии (267)
pm_wanderer
14.09.2017 19:32+9В общем программист должен уметь все. А для этого надо всю жизнь ходить на курсы HTMLAcademy и учиться писать CSS через матрицы))
Только вот зачем тогда все прочие люди на проекте?
Zakyann
14.09.2017 19:40+2Что программисту нужно 100% — это логика. Без этого — увы никак (если программированием не называть рисование формочек, само собой).
Математика же, обычно, нужна постольку-поскольку. Всегда можно нанять узкоспециализированного аутсорсера, если что. А держать такого в штате, обычно, накладно. Может для каких-то CAD'ов — максимум.
Итого: учите всё подряд, что попадётся вам под руку.
Плохой совет. Намного эффективнее изучать только то, что ограничено рамками текущей задачи, а не всё подряд.norlin
14.09.2017 19:46+13На 10 году работы программистом внезапно нашёл область, где действительно нужна математика. В частности, тригонометрия и линейная алгебра… И эта область – разработка игр.
aamonster
14.09.2017 20:39+3У меня в своё время в анализе изображений ТФКП внезапно вылезла. Причем не в связи с преобразованием Фурье, а для простого и быстрого детектирования наличия и направления полосок текстуры (и сегментации в соответствии с ним)
Zakyann
14.09.2017 21:51-7преобразование фурье, свёртки и прочую мелочевку я как-то особо за математику и не считаю. сотни готовых библиотек.
ohotNik_alex
15.09.2017 09:36+5был у меня такой коллега))) слава Богу уже работаем порознь. орал зачем ему знать основы — он и так умный)
написал свой атомик на Java, потому что оракловские медленно работают… они, видите ли работают через синхронизацию…
мало того, что работало с ошибками (ни разу не запустил чтобы проверить), так еще и скорость по бенчмарку показал на ДЕВЯТЬ порядков ниже…
если вы не видите пользы в математике — это совсем не значит, что она не нужна. это просто означает, что в вашей работе будет много велосипедов.
а готовые библиотеки не панацея. как это странно не прозвучит, но надо знать внутреннюю структуру всего, что используется в критических местах, чтобы писать эффективно.
пример из жизни — когда я был маленьким и глупым — получил тестовое задание от яндекса… посчитать количество чисел на офигенно большом отрезке, в которых цифры не повторяются… решение в лоб считало на 8 ядрах около 5 часов… после некоторых манипуляций с точки зрения алгоритмов — 20 секунд...))) убитое время научило в чем разница между быдлокодером и программистом.
Pycz
15.09.2017 10:29<zanuda_mode="on">
Вы уверены, что на 9 порядков? Может быть в 9 раз? Просто на 9 порядков — это в 1000000000 раз медленнее…
<zanuda_mode="off">
ohotNik_alex
15.09.2017 10:32+2сам был в шоке. уверен.
Zakyann
15.09.2017 12:37-3О! Мать иматики великие собрались :)
Итак — пусть по бенчу оптимальный алгоритм считает нечто 10 секунд (10^1).
Неоптимальный — (10^10) секунд.
Воспользуемся гуглом для того, что бы посчитать сколько это:
otvet.mail.ru/question/29213929
«примерно 31 год и 8 месяцев»
Вы ждали ответ 31 год? :) Математики собрались,… Яблоку негде упасть :)
Вы там прежде, чем плюсы и минусы расставлять, хотя бы в азах 11тилетки разобрались :)
Школота. Рано вам всем программировать что-то сложнее 2+2.mayorovp
15.09.2017 13:00+1Напоминаю: речь идет об атомике, атомарной переменной. Это не какой-то алгоритм. Время одной операции тут измеряется микросекундами, если не наносекундами. Т.е. порядок тут 10^-6, если не 10^-9. Соответственно, на 9 порядков дольше — это от 10^0 до 10^3.
Нет, я, конечно тоже не понимаю как можно так накосячить с атомиком чтобы он 15 минут на операцию тратил — но технически тут ничего невозможного нет.
Написали же однажды партнеры самозамедляющуюся очередь с квадратичным временем на операцию...
Zakyann
15.09.2017 13:17Ок, пусть и так. Вы верите в 15 минут ожидания одной операции? Это физически возможно?
mayorovp
15.09.2017 13:23+1В коде которых коллег я видел много бреда. И я не вижу причин по которым в том коде, который я не видел, не было бы все еще хуже.
ohotNik_alex
15.09.2017 16:52+1откуда 15 минут? речь о нескольких операциях в секунду вместо пары десятков миллиардов за то же время.
не заметили сразу потому что не сверхкритический модуль и без ограничений по времени (когда выполнится — тогда и выполнится).
да и заметили-то из-за ошибок. а так бы и работало это чудо дальше.mayorovp
15.09.2017 17:04+1Хм, 10 миллиардов атомарных операций в секунду — это вообще как? Это ж больше тактовой частоты процессора...
ohotNik_alex
18.09.2017 09:38открываем спецификацию, исходники и разбираемся… а можно просто взять jmh и сделать самому — вопрос 5 минут.
кроме того, вы считаете, что операции чтения тоже блокируют объект? отличный способ выстрелить себе в ногу получился бы.
0xd34df00d
15.09.2017 17:50У меня совсем недавно был случай, когда скрипт для анализа логов отрабатывал за 8 часов. Пришел, переписал, стало в 50 раз меньше кода и время работы в 7 минут.
VMichael
15.09.2017 10:47-5Улыбнуло.
Теперь то вы точно не быдлокодер, запилили таки расчет чисел на большом отрезке.
Тепрь нужно узнать в чем различие между просто быдлом и нормальным человеком.
Zakyann
15.09.2017 12:17+1Я не говорю о том, что математику знать не нужно. Я говорю о том, что не нужно заниматься велосипедостроительством. Математических библиотек для основных расчетов написано невероятное множество, на всех основных языках и под все основные платформы. Крайне маловероятно, что кто-то напишет что-то лучше имеющегося. Изучайте лучше нейронки. Вот где математика нужна. Там еще кот не и начинался валятся.
ohotNik_alex
15.09.2017 16:02+2боюсь, что вы в этой сфере не работали и не до конца понимаете необходимость алгоритмов. соболезную.
далеко не всегда может подойти библиотека.
возьмем простейшую систему, занимающуюся сверхскоростными вычислениями. пусть это будет высокочастотная торговля. нет сомнений, что там можно прикрутить какие-то алгоритмы, которые дадут кучу важной информации и чемодан денег.
только вот ключевое слово тут — "высокочастотная". буквально это значит, что вычисление через определенный промежуток времени уже может быть никому нафиг не нужным.
да… придет программист и повесит таймаут. все, что считалось дольше миллисекунды в топку и забыть. ок. ошибки не будет. только будут большие потери в мощности и куча ненужной работы.
потом придет другой программист, сядет, разберется и скажет "ребята… вот 90 процентов сделок мы можем отсеять если..". чтобы так сделать нужно разбираться в том, что происходит. нужно это все по возможности ЗНАТЬ.
просто прикрутить библиотеку может любой первокурсник.
для продуктов с 10 пользователями в час это не актуально. им допустимо жить под лозунгом "фулскан. и пусть весь мир подождет."
Zakyann
15.09.2017 16:11Пафос оценил. Повторюсь: я говорил про основные расчетные алгоритмы математики.
ohotNik_alex
15.09.2017 16:24ок…
более основного алгоритма, чем перемножение, вы врятли найдете…
только вот берем убогую машинку со считанными килобайтами памяти и ловим снижение его производительности. переписываем вручную на перемножение Карацубы — вуаля… скорость при малодоступных ресурсах выше, а результат тот же. (на высоких мощностях не работает, а кое где и вредно — ждем реализации проекта Amber)
еще раз повторяю — необходимость возникнет при ограниченных ресурсах. мало памяти. мало времени, много данных, миллионы параллельных сессий… любое допущение стандартного метода выйдет боком уже не на доли миллисекунды. если бы гугл выдавал вам ответ 10 минут — стали бы вы им пользоваться? даже если гарантированно будет ответ в первой же строке.Zakyann
17.09.2017 10:101. Даже на такой относительно специализированный алгоритм уже есть множество статей и реализаций (первые найденные, наверняка можно и готовую, оттестированную, библиотеку найти):
habrahabr.ru/post/124258
habrahabr.ru/post/262705
habrahabr.ru/post/121950
Ну давайте еще одну реализацию, с блэк-джеком и остальным, сделаем :)
2. Может показаться удивительным, но ограничение ресурсов есть всегда и везде, только лишь в большей или меньшей степени.ohotNik_alex
18.09.2017 09:45то есть вы утверждаете, что нашли бы все эти статьи ДО того, как поставили бы задачку написать код для какого-нибудь микроконтроллера? и особенно до того, как я этот метод упомянул?
не зная теории? я обычно верю людям на слово, но все же…
особенно я бы поржал с оправданий "это не у меня ошибка! это там! в библиотеке!!! где-то в ней! найти не могу — я в исходниках не разбираюсь".
я немного неграмотный специалист, видимо. не могли бы вы мне указать где в этих статьях БИБЛИОТЕКИ, да еще и тесты? я вижу просто красивый код, который вы бы скопипастили. библиотек не вижу.
Zakyann
15.09.2017 12:28Быдлокодерство — это изобретение собственных кривых велосипедов вместо использования нормальных имеющихся в том числе.
CrazyFizik
16.09.2017 22:00+1Просто при разработки игр требования несколько жестче — с одной стороны необходимо писать производительный код, а с другой стороны — игра это маленькая математическая симуляция выдуманной реальности. Поэтому сразу все всплывает.
Но в других областях математика тоже постоянно всплывает, просто принято обычно все это маскировать «а давайте возьмем вот это фреймоворк» — иногда это даже спасает, или просто люди пишут говнокод не пытаясь разобраться в вопросе и быстрей коммитеть. Было дело — общался с чуваком, который писал какую-то штуку типа онлайн-магазина (в группе разработчиков естественно) и к тому моменту когда он дошел до истории как они прикручивали вейвлет-преобразование я уже был офигевший.
Все зависит от задач и от того насколько добросовестно подходят к её решению. Вообще в русском языке есть такое понятие как «халтура». Большая часть погроммистов именно что халтурит — кто-то осознано, кто-то неосознано, но халтурят, причем массово — целыми конторами. Благо в IT полно задач, которые при современных условиях (вычислительные мощности, обилие библиотек, фреймворков, развитые инструменты разработки) позволяют халтурить. Но вот игры — как раз задача не из этой области, прокатить на халтурку — не получится (но народ пытается, и даже наблюдаются какие-то успехи на этом фронте...)
Еще игры делаютя при крайне ограниченном бюджете, так что рулят человеке оркестры. В тоже время придя в какой-нибудь Синопсис можно всю жизнь лепить кнопочки и не вникать, что же там делает вон тот яйцеголовый чувак за соседним столом — просто разделение труда и компания может себе это позволить.
Old_Chroft
14.09.2017 21:19-13Что программисту нужно 100% — это логика[...]
Какой идиот плюс комментарию поставил? ЕГЭ дает свои плоды: логику из математики выкинуть — это пиздец, граждане!
Математика же, обычно, нужна постольку-посколькуarchik
14.09.2017 22:06+6Смотря какая логика. Формальная логика это раздел философии, исчисление предикатов или булева алгебра это к математике. Я бы так однозначно не классифицировал логику :)
ttools
15.09.2017 00:10+1Вот только хотел сказать то же самое. И видимо, имелось ввиду исчисление предикатов. Так эта жуть тоже не особо нужна. Можно знать что такое OR и AND, свободно ими оперировать, и не знать такие слова как конъюнкция, дизъюнкция, предикат и не знать вообще, что это из мат. логики
ohotNik_alex
15.09.2017 09:38+1разве что при работе в коллективе для понимания между коллегами. если коммуникаций никаких и не предполагается развитие специалиста через книги / лекции / конференции — тогда есть возможность не знать терминологию.
ttools
15.09.2017 14:31Даже если предполагаются книги/лекции/конференции/общение есть большой шанс не встретить слов конъюнкция и предикат
ohotNik_alex
15.09.2017 16:08не сказал бы, что большой. в общении — да. в книгах — вероятность встретить повыше… не встретить на конференции доклад с упоминанием предиката можно только не придя на нее.
я не призываю учить все, что только попадается. жизни не хватит.
не обязательно на зубок это все помнить. но если к вам обратится человек и употребит этот термин — крайне желательно, чтобы вы понимали о чем речь. хотя бы на уровне знания где искать его определение.
Как говорится:
Страшен не тот, у кого есть ядерная бомба, а тот у кого есть ее чертежи и материалы.
GlukKazan
15.09.2017 12:07+1А законы де Моргана нужно знать или можно не знать?
ttools
15.09.2017 14:38-2Хотел сначала написать, что я вот например не знаю, потом погуглил и вспомнил, что в ВУЗе это было. С тех пор мне ни разу не пригодилось это знание. Но я — это частный случай
GlukKazan
15.09.2017 15:14Мне всю жизнь регулярно пригождаются.
С тех пор как папа в детстве вдолбил.ttools
15.09.2017 16:36Можете привести пример задачи, где вам это пригодилось?
GlukKazan
15.09.2017 17:30+1Очевидно, упрощение логических выражений. Люблю, знаете ли, писать довольно сложные логические выражения в if-ах. Иногда к ним приходится применять отрицание. А лишние скобки только мешают. Ну и «Теорию автоматов» тут сыну недавно объяснял, тоже пригодилось. Полезные законы, берите, не сомневайтесь.
VMichael
15.09.2017 17:37Потом программисты после вас «любят» втыкать, чего это вы там напихали, вместо того, что бы сделать более читабельно.
GlukKazan
15.09.2017 17:41Вот так, не видя кода, Вы быстренько провели мне codereview и вынесли вердикт. Завидую, я так не умею. До сих пор «другие программисты» не жаловались. А если вдруг кто-то из них не знает законов де Моргана, я им с удовольствием объясняю.
Zakyann
15.09.2017 17:44+1Вот — код бы увидеть ) Что бы было что обсуждать.
GlukKazan
15.09.2017 17:46Да мне не жалко. Смотрите.
michael_vostrikov
16.09.2017 16:21-2А где именно вам там пригодилось хитрое преобразование по законам де Моргана?
GlukKazan
17.09.2017 16:42Оно не хитрое. Оно общеупотребительное.
michael_vostrikov
17.09.2017 17:54Мой вопрос был к тому, что там у вас везде обычные простые условия, которые пишутся так сразу без всяких преобразований.
GlukKazan
17.09.2017 18:13Я помню, что такие случаи при разработки (конкретно этого проекта) были, но по всему репозиторию искать, просто для того чтобы пальцем ткнуть, большого желания нет. Возможно потом было отрефакторено.
GlukKazan
17.09.2017 18:20Ну вот, чтоб далеко не ходить, из сегодняшнего коммита:
if ((piece !== null) && (piece.player == board.player)) {...}
Вполне может получиться, что напахал с условием (много раз так получалось) и надо было сверху добавить отрицание. Если «де Морган» впитался в костный мозг — сразу меняем && на || и меняем условия на противоположные. Часто так получается лучше чем один уродливый not над всей скобкой. Ну это тривиально, в самом то деле.lair
17.09.2017 18:42Ну, конкретно в этом случае это тривиально без законов де Моргана, потому что правило составлено из одного бизнес-правила и одной проверки на
null
. И когда "напахал с условием" не факт, что отрицать надо все сразу. А иногда "уродливый not над скобкой" лучше читается, потому что понятно, какое именно условие отрицается. Особенно если оно потом рефакторится в отдельный предикат.GlukKazan
17.09.2017 19:34Большое достоинство таких законов в том, что им пофигу тривиально оно в данном конкретном случае или не очень. Они просто работают. И их полезно знать.
Когда уродливый not лучше читается, я его оставляю.
michael_vostrikov
17.09.2017 18:45Это так что-ли?)
if ((piece === null) || (piece.player != board.player))
Правильно выше сказали, насчет втыкания и читабельности. Я вот даже сходу затрудняюсь, как назвать это условие.
isCurrentPlayer = ((piece !== null) && (piece.player == board.player)); if (isCurrentPlayer) { ... } if (!isCurrentPlayer) { ... }
VMichael
15.09.2017 17:49Это опыт.
Есть люди, которых хлебом не корми, дай «упростить» и засунуть в строку как можно больше, потом смотри, гадай ребусы де Моргана.
Ну это как вариант, к вам наверняка не относится, хотя не исключено.GlukKazan
15.09.2017 17:57Может быть и относится. Люблю засовывать в каждую строку побольше. С институтского Паскаля на перфокартах пошло. Там где у других студентов была стопка перфокарт толщиной в сантиметр, у меня их было всего с десяток. Важно было даже не это, а то, что в перфокартах всегда были опечатки. А поскольку у меня перфокарт было меньше, меньше приходилось и исправлять. Как бы там ни было, я давно и успешно работаю в софтверной компании и на мой код никто (уже давно) не жалуется. Вот когда я был юниором — было дело.
ttools
15.09.2017 17:44Если вы серьёзно делаете так в условиях в своём коде в if выражениях, то я не завидую тем, кто будет его читать и отлаживать
GlukKazan
15.09.2017 17:48Это Ваше право — завидовать кому-то или нет, но владеть навыками упрощения логических (а заодно и арифметических, чего уж там) выражений полезно. Дистрибутивный закон ещё не забыли?
0xd34df00d
15.09.2017 17:48+1Проверка эквивалентности двух выражений с некоторыми ограничениями через приведение к ДНФ/КНФ.
ttools
15.09.2017 17:59-2Я понимаю, что лабораторная задача, поставленная таким образом потребует именно тех знаний, ради закрепления которых она и была придумана. А вот что-нибудь жизненное было бы интересно
0xd34df00d
15.09.2017 18:01+1Это и была жизненная задача (вернее, решение жизненной задачи, одно из возможных). Не во фронтенде и не в CSS, увы.
ttools
15.09.2017 18:12и как задача была поставлена изначально?
0xd34df00d
15.09.2017 18:31Наваять штуковину для регрессионного тестирования одного сервиса. При вдумчивом рассмотрении оказывается, что сервис возвращает нечто, похожее на логическое высказывание.
Myxach
18.09.2017 12:15прочитал я про них… законом назвали то, что любому логическому мыслящему человеку в голову придет во время работы?
GlukKazan
18.09.2017 12:25+1Ну прочитайте ещё. Там их довольно много этих законов. И все используются для формального преобразования логических выражений. Разумеется, «логически мыслящий» человек вполне в состоянии вывести любой из них, но… Зачем ему тратить на это время? Вполне достаточно их знать (ну, или один раз вывести самому, а потом знать).
mayorovp
15.09.2017 17:38+1А вот, к примеру, тому кто делает моды для игр серии TES и "приравненных" к ним (Fallout 3+) — нужно знать как работать с конъюнктивными нормальными формами. Потому что условия в редакторе задаются именно в формате КНФ вместо интуитивно понятных ДНФ.
ttools
15.09.2017 17:57-1Довольно специфичная задача, такие не очень то часто встретишь
GlukKazan
15.09.2017 18:00+1Большая часть программистской деятельности складывается из довольно специфичных задач.
ttools
15.09.2017 18:11Это так. Но у нас же контекст обсуждения «нужна ли математика программисту». А специфические задачи программирования могут быть связаны не только с математикой или вообще не с математикой
GlukKazan
15.09.2017 18:17+2Согласен. Даже согласен с тем, что есть такие программисты, которым серьёзная математика ни разу за всю жизнь не пригодилась. В этом плане, статья немного наивна, но, на мой взгляд, посыл даёт правильный. Помимо этого, математика — это весело! Серьёзно, я искренне сочувствую программистам, которым не нужна математика.
Zakyann
14.09.2017 19:46+3Нам нужно понимать как устроены шрифты: что такое гротеск, чем он отличается от антиквы, что такое интерлиньяж, кернинг, разрядка, капитель. Понимать, что такое сетки и что такое композиция. Кроме этого, разбираться в UX — мы должны знать что такое оптимистичный UI, где поставить прелоадер и зачем это всё нужно пользователю.
Я, например, зеленого понятия обо всём этом не имею :) Что мне не мешает активно и успешно делать отличные интерфейсы, под веб в том числе.MacIn
14.09.2017 20:52+1Что мне не мешает активно и успешно делать отличные интерфейсы, под веб в том числе.
Может быть, эта успешность только в вашем воображении?Zakyann
14.09.2017 21:25-3Врятли за плохие результаты будут хорошо платить, согласитесь :)
ohotNik_alex
15.09.2017 09:41+5это только до тех пор, пока не сравнили) придет к вашему начальству аутсорс и скажет "а мы сделаем так, что сайт будет грузиться в 4 раза быстрее". и сказочке конец)
оплата в нашей сфере отнюдь не всегда показатель высокого класса специалиста. порою это показатель расточительства руководства)Zakyann
15.09.2017 12:22-1Видишь ли, я и есть начальство :) Я — совладелец продуктовой софтверной компании. А платят нам наши клиенты. Конкуренция у нас — выше крыши. Не как у 1С с их монополией. На аутсорс мы кое-что и отдаём и довольно хорошо платим.
ohotNik_alex
15.09.2017 16:15+1как интересно) сначала намеки, что вам платят за ваш код, потом "я совладелец". уж определитесь как-то....)
а если начальник, ну тем более) сидит штат. чинит за начальником его код. и никто не скажет, что работает через одно место просто потому, что написавший решает кадровые вопросы.
покажите мне хоть один коллектив, где начальнику указали на его некомпетентность используя всю глубину русского языка не имея подписанного заявления на руках и приглашения на другое место) то что все молчат еще не означает собственной крутости. все познается в сравнении.
да и что за фамильярность и переход на "ты"?
зы вспомнил на предмет "у меня высокая зарплата". одно из старых мест моей работы. сидел человечек и получал до фига денег. только не за то, что он писал что-то немыслимое. все в рамках. а просто за то, что продукт был откровенным нагромождением как письмо дяди Федора и он единственный, кто там хоть как-то разбирался. буквально ему платили за то, что он единственный был готов работать говнокопателем. все случаи индивидуальны)
Zakyann
15.09.2017 16:52-1Что не так? Я совладелец и сооснователь компании. И, да, мне платят за мой код в том числе. 60-70% кода всех проектов написаны мной. Про зарплату я нигде не говорил, учитесь внимательно читать. Но говорил, что платят хорошо.
чинит за начальником его код. и никто не скажет,
Всяко бывает. Но чаще наоброт, когда ревью гита делаю. И да, мы еще никого за чужое отличное мнение не увольняли. Слушаем всех, постоянно обсуждаем всё. Хотя последнее слово за владельцами, само собой.
указали на его некомпетентность используя всю глубину русского языка
Странные у вас понятия об IT компании :) На уровне совкового строитреста где-то.ohotNik_alex
18.09.2017 10:02+1за чужое отличное мнение не увольняли
ну еще бы кто-то так официально объявил. был свидетелем как за высказывание об управленческих способностях назначили "наказание" — ходить точно минута в минуту на работу и после рабочего дня еще отдельно заходить и отчитываться. т.е. расписание с 9. отдел приходит обычно в 10-11 (кому как удобно). а этот человек должен явиться в 9 утра, потому что начальник ему позвонит на рабочий номер и не дай бог тот трубку не снимет. а потом 8 рабочих часов уже прошли, но надо сходить и рассказать что делал. это же не увольнение. это просто охота на ведьм и видел я подобное несколько раз.
смех был когда сотрудник ушел и директору передали "а вообще-то он у нас половину инфраструктуры обслуживал и никто кроме него этого не умеет".
60-70% кода всех проектов написаны мной
мммм… ну еще бы свой код идеальным не казался. я уже выше говорил — все познается в сравнении. наймите человека с опытом 10+ и быстро получите отповедь насколько все криво и допотопно написано. таким людям откровенно пофиг кто перед ними — работу найдут за неделю если что.
На уровне совкового строитреста где-то
ну что ж поделать, если у нас такие требования на окладах под 200к. куда ж нам до вашего передового продукта из трех программистов. (или двух? 60 процентов это очень высокий показатель, говорящий о почти полном отсутствии штата)
theWaR_13
14.09.2017 22:08Я может быть из другого фронтенда, но со статьей не согласен. Никогда в мои задачи как фронтенд-разработчка не входило вот это все, что описано в статье (интерлиньяж, кернинг и пр). В мои задачи входила разработка архитектуры приложения с использованием фреймворков или без них. После того, как основная часть готова, приходит макет от дизайнера (который как раз таки все это знает) и это просто накладывается сверху без особых разбирательств. Нет, это конечно же не тупое копирование шаблона из psd в css, можно и поинтересоваться всегда почему так, а не иначе. Однако, это совсем не обязательно и необходимо крайне редко.
Hardcoin
14.09.2017 21:05+1Вы не знаете, что такое кернинг и делаете UI? Можно мне тоже пример работ? Возможно, у вас талант, но талант плюс знания дали бы больше. Или вы пользуетесь заготовками от людей, которые знают, что это такое.
pm_wanderer
14.09.2017 21:36+6Где в CSS есть кернинг, который кроссбраузерный?
Уж лучше пусть будет стандартный шрифт, чем измененный дизайнеров, который потом в CSS не воспроизведешь)SerafimArts
15.09.2017 05:53Не кроссбраузерный, но вполне рабочий вариант: https://caniuse.com/#search=font-feature-settings
-moz-font-feature-settings: "kern=1,liga=1,calt=1"; font-feature-settings: "kern" 1, "liga" 1, "calt" 1;
Zakyann
14.09.2017 21:56Или вы пользуетесь заготовками от людей, которые знают, что это такое.
Я уже писал про UniGUI. Вот им и пользуюсь. Он позволяет отстранится от большинства браузерных особенностей и заниматься непосредственно дизайном форм + кодингом логики.
VioletGiraffe
14.09.2017 22:19+9Погуглил, что такое кернинг. Каким образом это касается кого бы то ни было, кроме разработчиков шрифтов?
Hardcoin
15.09.2017 09:57Ещё это касается того, кто выбирает шрифт. Что бы выбирать не по принципу "вроде красивый", а осмысленно. Ещё про засечки надо бы знать. Не очень глубоко, но общее представление имеет смысл иметь.
VioletGiraffe
15.09.2017 10:02Наверное, вы правы. А как осмысленно выбирать шрифт по кернингу? Мне не очевидно. Он просто должен нормально выглядеть.
Hardcoin
15.09.2017 10:18Я могу только более внимательно взглянуть не на шрифт в целом, а на детали. Для этого не нужно знать само слово "кернинг", конечно, просто нужно смотреть совпадают ли расстояния между буквами на разных участках страницы (если там разные шрифты). Но для этого про такую мелкую деталь надо бы знать, тем более, что узнать про нее можно за 10 минут.
При этом я не хочу сказать, что такие мелкие детали нужно знать всем. Кто никогда не проектирует интерфейсы, им не обязательно.
justboris
15.09.2017 12:31+2Ой, и снова здравствуйте!
Это же вы на UniGUI интерфейсы делаете? Из готовых блоков, с дизайном 10-летней давности?
Zakyann
15.09.2017 16:59Скоро на 6-ку перейдут ExtJS, будет новее. Обещают до нового года. Мы пишем не чистые веб сайты, а веб-клиенты к своим программам. Результат отличный. Копию того же GMail'а на унигуе можно вполне и быстро накидать. Гугл так безнадёжно устарел?
PapaBubaDiop
14.09.2017 20:09+6Нужна ли математика программисту?
Пользователи NumPy недоуменно переглянулись…
vasIvas
14.09.2017 20:20-2При программировании интерфейсов (отображения), как только переходишь черту однообразности, без математики, хотя бы уровня отличника 11 класса, никуда. Пока разработчик берет готовое, я не буду даже говорить об архитектуре, которая, как ни странно, у всех разная, он не подозревает, что ДАЖЕ обычный прелодер, например 3D, вынесет ему мозг. Мне вообще кажется что 90% фронтэндов не понимают матрицы. В сторону canvas, там вообще никуда. Все примеры, которые выкладывают для демонстрации своих фраймворков, естествно демонстрируют самые сильные стороны, которые в реальных проектах в таком виде не используются. на phaser можно онлайн танчики на 10 пользователей сделать за день, на 500 пользователей, придется отказываться от phaser и писать свой движок. В реальности готовое можно использовать только в том виде, в котором тебе дают.
А что будет, если кому-то на работе предложат реализовать алгоритм с первого курса по вписыванию прямоугольников в пространство, как в галерее мансури. Если не знаешь математики, то даже лучше не тратить время, а увольняться, притворившись, что мне с вами не интересно :)pm_wanderer
14.09.2017 20:36Спорно. Я думаю все движется в сторону унификации интерфейсов и всякие красивости на канвасе не всегда нужны. Ну а галерея масонри реализуется через display: grid тремя строками CSS)
bro-dev
14.09.2017 20:28Программисту не нужно то что легко гуглится.
MacIn
14.09.2017 20:53+1то что легко гуглится.
И это точно не математика.bro-dev
14.09.2017 22:33+1Это точно та часть математики которая и нужна программисту, ему не нужно решать сложные задчи, ему нужны способы решения типичных задач, которые есть в изобилии.
ohotNik_alex
15.09.2017 09:44+2если он никогда не учил паттерны — как же он узнает, что поставленная перед ним задача типична?
TheYellingChives
15.09.2017 11:38Любая задача типична. Если задача не типична и программист не знает этого/не понимает этого — тот кто дал ему задачу ошибся в уровне программиста.
bro-dev
15.09.2017 11:46Если не получилось загуглить значит нетипична, тогда нужно обращаться к спецам этой области, тут уже знание математики не поможет нужно этим заниматься всерьез.
ohotNik_alex
15.09.2017 16:31серьезно?
простите, а запрос как должен выглядеть?
обеспечение единственной точки доступа к ресурсу базы данных приложения (выскочит, разумеется, одиночка)
обеспечение распараллеливания вычислений данных и их суммирование как результата с сортировками и другими преобразованиями (выскочит map-reduce)
или вы предлагаете писать по любой проблеме на StackOverFlow, чтобы другие ребята решали за вас? зачем такой спец тогда вообще нужен? за умение писать на форумах?
или вы текст задачи в строку поиска вбивать предлагаете?
я не пытаюсь как-то острить или обидеть. я хочу понять что мне нужно вбить в гугл чтобы выскочило "о! ваша задача уже решалась — вот готовый код для копипаста.".
Zakyann
15.09.2017 17:10Умение использовать нормальные готовые решения, либо довести их до таких — это одно из того, за что готовы платить в софт. компаниях. На собственном опыте.
Всего всё равно не найти. Но то, что можно найти, позволяет лицензия и нормально работает — использовать можно и нужно.ohotNik_alex
18.09.2017 10:11прежде чем их использовать — о них нужно знать.
или вы считаете программистом человека, который перед каждой задачей идет на форум и спрашивает не подскажет ли кто типовое решение?
вручили бы вам в 7 классе учебник по аналитической геометрии, физике твердых металлов и музыкальному сольфеджио. поставили задачи, для решения которых в этих учебниках все есть — помогло бы?) даже если бы сказали, что время не ограниченно.
основная проблема будет тут состоять в том, что дешевле найти человека, который это знает и сразу применит, а не ждать пока капуша что-то там в гугле нароет. производительность опытного программиста 6+ выше студента в 10 раз (была где-то статья на хабре) минимум. не все проекты позволят себе такую роскошь, как ожидание.
bro-dev
15.09.2017 17:39Не совсем понял, из того что вы написали следует что программист не должен знать программирование, но я такого не утверждал.
ohotNik_alex
18.09.2017 10:16простите, вероятно я не так выразился. я вижу, что вы этого не утверждали.
я просто не понимаю как определить через гугл, что задача нетипична.
можно знать некоторый стек типовых задач (все знать нельзя, разумеется) и пользоваться этим знанием для решения задач, которые явно подходят под известный шаблон.
но обратная задача — определить по задаче заранее неизвестный шаблон проектирования — мне кажется нерешаемой в принципе.
математики мое утверждение касается лишь в той мере, что она развивает память (как абсолютно любое знание) и учит систематизировать технические знания. более серьезная помощь с ее стороны крайне сильно зависит от поставленной задачи.
Gilvoth
15.09.2017 11:39+2«В поисковике найдётся всё» может и сыграть злую шутку в ответственный момент.
CrazyFizik
16.09.2017 21:06+21. Начнем с того что надо знать что гуглить. Как правило все практические задачи покрывают сразу несколько разделов математики. Ну вот я сейчас потихонечку пилю задачку где захвачено сразу: глобальная оптимизация и мета-эвристические алгоритмы (метод имитации отжига, генетические алгоритмы, роевой интеллект и т.д.), задачи на обход графа (дискретная математика в принципе базовый минимум для программиста), задачи на раскраску графов, дискретная оптимизация, градиентные методы (Нелдер-Мид, BFGS и т.д.), компьютерная/вычислительная геометрия и внезапно еще потребовалась физика и метод конечных элементов, хотя задача к физике не имеет никакого отношения, ну и т.д. Вообще задача не особо сложная, давно известная и уже 100500 раз решенная, но конечным решением никто естественно не поделится, а охватывает она целую кучу разделов математики :-)
2. Некоторые вещи гуглятся с трудом, если не знать конкретно, что это такое. Если Вы загуглите Kraftwerk 2, то Яндекс и Гугл буду подсовывать второй студийный альбом германской группы Крафтверк, а не алгоритм быстрой оптимизации упаковки. Добавления слов optimization и algorithm поможет слабо (хотя Гугл уже начнет подавать надежды), и так пока не добавите что-нибудь типа VLSI, placement, force-directed и прочие ключевые слова из контекста именно этого алгоритма, хотя и тут гугл с яндексом будут подсовывать много хлама. И это ситуация, когда название алгоритма известно точно, а если еще нет, то что тогда? Наедятся на то что 1 млрд обезьян чисто теоретически могут написать Войну и Мир?
3. Чтобы применять алгоритм, нужно знать тонкости, нужно понимать как работает алгоритм, какие у него особенности. Программисты никогда не слышавшее про вычислительную геометрию на вопрос определения точки внутри многоугольника, начинают выдавать простыни тормозящего говнокода, а потом еще и удивляются почему алгоритм отрабатывает не все случаи, после чего начинают добавлять костыли, когда всего-то надо написать 19 строчек кода включая комментарии, скобочки и пропуски широко-известного Winding number algorithm (который впрочем тоже имеет ограничения применения). Но это еще простая и рутинная задача, а если что-нибудь посложнее? Ну я уже неоднократно наблюдал как погроммисты пренебрегавшие в свое время математикой, по 2-3 недели не могут написать Simulated Annealing — алгоритм 30-и летней давности и уровнем математики 1-го курса любого вуза. Крайний раз чувак перепутал знак «больше»-«меньше» и долго не мог понять почему не работает, когда ему об этом сообщили.
4. Алгоритм — это не более чем абстрактная заготовка. Нет никаких универсальных алгоритмов, а любой метод описывает только общие принципы решения задачи. А вот для каждой конкретной задачи придется все равно писать специфическую реализацию. Это только для учебных задач можно переписать из книжки простой алгоритм и он даже заработает.
5. Возвращаясь к Гугл нельзя не отметить, что зачастую по теме выдается всякий шлак. Если запросить чего-нибудь про Генетические алгоритмы, то там в большинстве случаев будет научпоп 70-ых годов про бинарные хромосомы и одноточечный/многоточечный кроссовер. Ну вот для решения задачи коммивояжера (около 2-х лет проработал на проекте где эта задачка была одной из основных частей ПО) это уже работать не будет, благо эта задачка учебно-типовая гугл осилит, а если что-то посложнее? А вот для чего-то посложнее операторы мутации и кроссовера (а это все математические операторы) придется разрабатывать самому в зависимости от задачи (см. пункт 4).
6. Алгоритмов много, просто тьма. Одну и туже задачу можно решить несколькими десятками алгоритмов, каждый из которых имеет свои достоинства и недостатки — без знания предметной области и без определенного математического бэкграунда оптимального решения не будет никогда (если вообще появится, знаю пару кодерских контор, которые так зафейлили очень жирные заказы). Еще очень распространенная проблема, когда алгоритмы применяют неправильно. Или другой пример, сейчас пошла мода на нейросети и все давай пихать их во все щели, даже туда, где обычный МНК справится.
7. Все любят петь про библиотеки. Так вот хорошие и быстрые библиотеки, которые нас избавят от написания своей реализации умножения матриц, уже стоят денег, ну от 8 до 32 тыщ. долларов за 1 рабочее место. И все равно надо понимать, что и для чего это делается, иначе будет пустая трата денег.
8. Ну и последнее. Программирование — это всего лишь часть прикладной математики, не более чем инструмент для реализации тех или иных математических методов решения практических задач. Научить синтаксису языка N можно любую обезьяну, вот только программируют не ради программирования.Gryphon88
17.09.2017 01:09Можно чуть подробнее про сильно платные библиотеки? Я пользуюсь BLAS/CuBLAS, понимаю, что она не идеальна (как любое ПО), но базовые вещи закрывает уверенно.
CrazyFizik
17.09.2017 16:27Тут все упирается в вопрос что Вам нужно.
Можно быть стильным, модным молодежным и использоваться халявный Python/NumPy — только вот скорость там будет мягко говоря уровня черепахи.
BLAS — сейчас де-факто стандарт API для создания библиотек линейной алгебры. Так что BLAS'ов на самом деле много, тот Intel MKL (который тоже бесплатный) этот BLAS содержит, есть Boost C++, который в себе содержит тот же самый uBLAS, вроде как тоже бесплатный, но вот Intel MKL будет уже быстрее.
Основные проблемы начинаются когда:
1) Нужно больше функционала чем просто перемножение и вращение матриц, Фурье и т.п., что можно и самому без особого труда написать. Например, работа с гигантскими разряженными матрицами, просто гигантские матрицы, всякие хитрые солверы (например, какую-нибудь хитрую реализацию Нелдера-Мида), там вообще много чего может быть. Например, в Matlab, в Global optimization toolbox для генетических алгоритмов используется запатентованный Mathworks оператор мутации, а результаты с ним заметно лучше. В общем всегда в платных библиотеках функционала куда больше и там есть то, исходники чего Вы никогда не найдете.
2) Производительность — Intel MKL это уже хорошо и быстро, но иметь компилятор C/Fortran от Intel — лучше, а это уже денег стоит (там разное лицензирование и уже цены от 4 и до 32 тыщ долларов). В общем реально высокопроизводительные вещи стоят уже денег. Всегда.
3) Всякие мелкие тонкости, например, совместимость — ну вот самая распространенная проблема это совместимость по бинарникам. Вставляли недавно одну бесплатную билиотечку, которая реализует L-BFGS, причем с возможность наложения ограничений (вообще BFGS unconstrained алгоритм, но математики не просто так хлеб едят) и еще всякие вкусные солверы (я бы сказал что нетривиальные, я писал проще) и тут начались проблемы с ошибками памяти (причем только под Windows и совсем какие-то рэндомные). Берем исходники, вставляем их в наш проект, немного их правим, компилируем — все работает зашибись, вот только лицензия там GPL… В итоге все сводится к тому, что надо: а) платить, или б) писать самим, а это тоже время-деньги, или в) искать другое решение, которое внезапно оказывается тоже платным.
А еще есть всякие штуки типа многопоточности, векторизации и т.д.
4) Нужны дополнительные компоненты. Есть вот даже такой термин Business Intelligence(или просто BI) — нужно обрабатывать большие объемы данные, анализировать их и выводить в удобно-читаемом виде. Там Вам будет и математика и кучу интерфейнсых мозголомок. Начинаем писать такие штуки сами — тратим время и соответственно деньги. Начинаем использовать халявные библиотеки — все зашибись пока данных не становится слишком много, даже банальная отрисовка графика (только отрисовка!) начинает вешать всю систему (см. п.2), а ведь эти графики должны быть интерактивными… Естественно есть куча готовых высокопроизводительных компонент, например, BI Dundas, который стоит денег… много денег (на сайте даже цены не указаны, т.к. с каждой компании разработчиков бабло стригут индивидуально)
5) Язык программирования. Это отдельная тема. Хорошо быть C/C++ или Fortran программистом. Fortran де-факто язык математического программирования для которого написано десятки тысяч самых разных библиотек, С/С++ тоже неплох и на него оперативно переписывают фортрановские библиотеки. Но вообще и Fortran и C/C++ программисты дорогие, найти их сложно, на C/C++ ее и разработка часто оказывается дороже. Зато каждую обезьяну можно научит писать на Java и C# — таких программистов полно, а вот с библиотеками… гхм, ну вот например .NET до версии 4.5 не поддерживал SIMD, сейчас вроде как начал поддерживать, но как-то не возбуждающе. Выбор библиотек здесь уже куда более куций, библиотеки которые дадут и перфоманс и легкое внедрение — стоят уже деньги, например, ILNumerics или NMath. Можно взять какой-нибудь Accord.NET, но он будет медленный (см. п.2)
6) Особенности лицензирования — то что можно быку (творить всякие безобразия), то не позволено Юпитеру, а Цезаря за это так вообще в Сенате закололи. Например, Advanced Simulation Librar — офигенная штука для высокопроизводительных симуляций бесплатная, пока ты ей дома пользуешься для лабораторок каких-нибудь, а вот для коммерческого пользования рано или поздно придется платить. Или, например, ALGLIB (Delphi, C/C++, C# и т.д.) имеет двойную лицензию — можно использовать на халяву, но там не будет ни многопоточности, ни векторизации, ни интеграции с MKL, ни нативных HPC (higth-perfomance computing) — т.е. медленно, а самое главное халява по GPL, либо платите бабки и все это будет и даже исходники дадут (см. п.1,2,3)
Т.е. все зависит от потребностей и возможностей. Что бы сразу было все, работало быстро и легко интегрировалось (самые главные качества любой библиотеки) — стоит денег или это белый единорог. За какие-то базовые вещи никто денег брать не будет — понятно что за БПФ никто не заплатит, его итак можно быстро написать. С линейной алгеброй дела будут обстоять еще сложнее — т.к. быстро крутить-верететь матрицами сложно.
В любом случае, даже обходясь совсем-совсем готовой библиотекой надо понимать что там внутри происходит. Например, Вы можете найти псевдобратную матрицу с помощью: LU-разложение, разложения Холецкого, QR-разложения, SVD. LU-разложение работает только с невырожденными матрицами, т.е. на практике малоприменимый метод, разложение Холецкого работает только для положительно-определенных матриц и точность оставляет желать лучшего, а QR-разложение в общем-то неустойчивое (для устойчивого нужно использовать модифицированный алгоритм Грама-Шмидта), самым точным и надежным будет SVD-разложение… и самым медленным (а еще оно в своей основе использует QR-разложение). Ну в нахождение псевдообратной матрицы необходимо для получения МНК-решения системы линейных уравнений, а такие задачи встречаются абсолютно везде, фактически любую практическую задачу пытаются свести к МНК.Zakyann
17.09.2017 20:01-1Платное — оно обычно не просто так платное. Если задача, где нужно использовать эту библиотеку, позволит заработать 30-40 тысяч зелени и выше, почему бы и 4-10 не заплатить? А не позволит — то зачем ею вообще заморачиваться? Даже на бесплатных либах? Академический интерес? Ну ок — посчитаете рано или поздно, однопоточно. Странное у всех отношение какое-то к платным инструментам, честное слово. Платные инструменты позволяют экономить время и/или деньги. Иначе бы их просто вообще никто не покупал.
CrazyFizik
17.09.2017 22:57Ну на то и расчет. Обычно все упирается в производительность и набор функций, чтоб самим время-деньги сэкономить, иначе может выйти дороже (если вообще выйдет).
Для академических целей прайсы кстати очень демократичные, а можно и вообще бесплатно получит. Обычно различают: академические цели, коммерческое использование малыми компаниями, коммерческое использование большими компаниями (вот тут ценник становится просто конским.
Но тут правда еще одна проблема может вылезти — купить-то можно, а потом окажется, что там чего-то нет.
Ну а если говорить о совсем-совсем ПО для математиков, то это: Matlab, Mathematica, Mapple. Стоят тоже конских денег. Например, бесплатная альтернатива Matlab — это Octave, которая таки несколько медленнее и не имеет (пока еще) всего функционала. Они на самом деле крайне удобны для математического программирования — прежде всего за счет синтаксиса и богатых библиотек для всяких рисовалок, вот только коммерческий продукт на них фиг напишешь — все равно потом придется брать какой-нибудь язык общего назначения и переписывать на нем и вот тут выясняется, что Mathwork требует конских бабок за свои продукты не просто так…
Мне иногда кажется, что развитие языков свернуло куда-то не туда…
Хотя вот сейчас появилась Julia, которая, если будет развиваться дальше наверное переломит существующую практику.
Gryphon88
17.09.2017 23:27Спасибо, я хотел узнать, когда не хватает бесплатных альтернатив, я узнал, когда не хватает.
michael_vostrikov
17.09.2017 06:33Программисты никогда не слышавшее про вычислительную геометрию на вопрос определения точки внутри многоугольника, начинают выдавать простыни тормозящего говнокода, а потом еще и удивляются почему алгоритм отрабатывает не все случаи
Более вероятно, что программисты загуглят "point in polygon", прочитают википедию, загуглят названия алгоритмов, и выберут подходящую реализацию.
Возвращаясь к Гугл нельзя не отметить, что зачастую по теме выдается всякий шлак.
А вот для этого нужно умение анализировать информацию и разбираться в предметной области. А не учить все подряд из всех разделов математики.
CrazyFizik
17.09.2017 16:57Более вероятно, что программисты загуглят «point in polygon», прочитают википедию, загуглят названия алгоритмов, и выберут подходящую реализацию.
Хз, за 10 лет наблюдений обнаружил, что находят только 2 самых простых способа: использование скалярного произведения или райкастинг. И то, и то — школьный уровень, человек и без гугла должен сообразить. Первый работает только для выпуклых многоугольников, для второго надо учитывать граничные случаи.
А вот для этого нужно умение анализировать информацию и разбираться в предметной области. А не учить все подряд из всех разделов математики.
Вода.michael_vostrikov
17.09.2017 18:30Ну то есть все-таки используют готовые решения, а не пишут простыни тормозящего говнокода.
человек и без гугла должен сообразить
Зачем мне писать свой кривой велосипед, если можно взять проверенную реализацию, в которой учитываются граничные случаи?
Вода.
Не вода, а подтверждение моей точки зрения, что важнее анализ и проектирование, а не доскональное знание одной предметной области. Если математику будет нужно сделать подключение к БД на C#, а Гугл будет выдавать всякий шлак, как ему математика поможет найти среди него правильное решение?
CrazyFizik
17.09.2017 19:48+2Зачем мне писать свой кривой велосипед, если можно взять проверенную реализацию, в которой учитываются граничные случаи?
Я в другом посте привел простой пример — обращение матрицы, это наверное одна самых распространенных операций вообще:
1) Разложение Холецкого — работает только с положительно-определенными симметричными матрицами
2) LU-разложение — работает только с невырожденными матрицами
3) QR-разложение — может работать с разными матрицами, но не все реализации устойчивые (я встречал в стандартных библиотеках разные варианты) и скорость выполнения уже не айс
4) SVD — переваривает все и с высокой точностью, но медленно, очень медленно.
Возьмете стандартную библиотеку, а там будут реализованы все 4 способа, какой выберите если никогда не слышали алгоритмы факторизации матриц? По-умолчанию разработчики либ обычно подсовывают SVD, шоб пользователь не испытал батхерд, когда попытается засунуть любую случайно сгенерированную матрицу.
Что касается определения точки в многоугольнике, то самых разных вариаций решений этой задачи я уже видел десятка 2, а в библиотеке может оказаться несколько реализаций:
а) Для выпуклых многоугольников (это самое простое)
б) Для простых многоугольников
в) Для ортогональных многоугольников (т.к. для них можно написать просто сверхсветовую реализацию)
г) Для многоугольников общего вида и
если можно взять проверенную реализацию, в которой учитываются граничные случаи?
и это может оказаться самая медленная реализация из возможных (а может и нет, если писал гений оптимизированных вычислений), если она действительно будет переваривать все виды многоугольников да еще на длинных вычислениях. На основании чего разработчик будет делать выбор, если его знания ограничены первыми 6-ю классами школы?
Или другой пример, в FarseerPhysics (теперь VelcroPhysics) и Box2D используются 2 разных подхода для бинарных операций над полигонами общего вида, а еще для Convex ecomposition в первом используется и Ear clipping algorithm, и Bayazit algorithm, а в Box2D только Ear clipping algorithm. Какой сами будите использовать, какой другу посоветуйте?..
Святая вера в идеально стандартное решение — это уже какая-то религия походу.
Если математику будет нужно сделать подключение к БД на C#, а Гугл будет выдавать всякий шлак, как ему математика поможет найти среди него правильное решение?
Подключение БД к C# — это рутина, которая итак описана в MSDN и книжках по .NET, туда его гугл и отправит. А вот на основании чего он будет делать выбор в пользу Array, Dictionary, LinkedList, List, Queue, Stack и т.д. вот это уже куда интереснее, погроммисты которые учились на погроммиста в универе и в отличии от меня не забивали на какую-нибудь дискретку и тому подобное, знают эту разницу без привязки к языку. Внезапно это все математика и там начинаются такие вещи как вычислительная сложность вставок, удаления, поиска, получения по индексу и прочие страшные О.
Гугл будет выдавать всякий шлак, как ему математика поможет найти среди него правильное решение?
Если он ище вопрос по математике и алгоритмам, то:
а) Он сможет задавать более уточняющие запросы, т.к. знает что примерно надо найти, так что шлака внезапно станет меньше
б) Он отфильтрует весь шлак и школьный говнокод
в) Некоторые вещи (по которым он специализируется) он и искать не будет по памяти сразу сделает (если память хорошая)
д) В отличии от чувака с улицы он будет в курсе, что полезные вещи не только на Гугле ищутся, а например, на IEEEXplore или ScienceDirect, наверняка кто-то знает еще больше.
Не вода, а подтверждение моей точки зрения, что важнее анализ и проектирование, а не доскональное знание одной предметной области.
Ок, Гугл! Используя только анализ и проектирование, напишите мне программку, которая будет мне синтезировать антенную решетку с максимальным уровнем SSL и с учетом всяких дополнительных ограничений (угол качания луча, ширина луча, нули ДН, динамический диапазон и т.д., в общем сам с помощью гугла догадайтесь). Если кажется что это слишком сложно и оторвано от жизни, то хотя бы напишите программу оптимальной расстановки мебели в хрущовке…lair
17.09.2017 23:05А вот на основании чего он будет делать выбор в пользу Array, Dictionary, LinkedList, List, Queue, Stack и т.д. вот это уже куда интереснее, погроммисты которые учились на погроммиста в универе и в отличии от меня не забивали на какую-нибудь дискретку и тому подобное, знают эту разницу без привязки к языку.
Я вот в университете на программиста не учился. И "дискретку", что бы это ни было, забивать не мог, ибо у меня ее тоже не было. Это не мешает мне знать, чем отличаются описанные коллекции.
michael_vostrikov
18.09.2017 07:46какой выберите если никогда не слышали алгоритмы факторизации матриц
Как ни странно, сначала прочитаю про алгоритмы, потом выберу подходящий. Возможно даже на ваш коммент в поиске наткнусь.
и это может оказаться самая медленная реализация из возможных
Может мне ее будет достаточно?
На основании чего разработчик будет делать выбор, если его знания ограничены первыми 6-ю классами школы?
На основании информации, которую он получил за последние пару часов (или дней) изучения задачи.
Святая вера в идеально стандартное решение
Как из "выберут подходящую реализацию" можно сделать вывод про "идеально стандартное решение"?
Подключение БД к C# — это рутина, которая итак описана в MSDN и книжках по .NET, туда его гугл и отправит.
Там так-то тоже разные способы есть. Библиотеки, фреймворки.
Если он ищет вопрос по математике и алгоритмам, то
Так он ищет про организацию работы с БД.
Используя только анализ и проектирование, напишите мне программку, которая будет мне синтезировать антенную решетку
"Извините, я не специалист в этой области. Обратитесь, пожалуйста, к другому специалисту". Поэтому мне понадобится много времени на анализ именно этой области. Если согласны оплатить это время, пожалуйста.
Задачами на проектирование я с вами меряться не буду, потому что они требуют подробного описания.
Zakyann
17.09.2017 10:47+1Программисты никогда не слышавшее про вычислительную геометрию на вопрос определения точки внутри многоугольника, начинают выдавать простыни тормозящего говнокода, а потом еще и удивляются почему алгоритм отрабатывает не все случаи
О! Как раз наша тема, в том числе. У нас в компании работает программист, который как раз отлично знает нужные нам части математики. Собственно — для этого и брали.
Его реализация алгоритма была страницы две кода, недели 1.5-2 по времени. Работала, правда, безупречно. Моя же, нагугленная за час, реализация была такой:
function DotInPolygon(X, Y: integer; const Polygon: TPointDynArray): boolean; var i, j: integer; begin Result := False; j := 0; i := Length(Polygon) - 1; while i >= 0 do begin if not ((Polygon[i].X < X) xor (X <= Polygon[j].X)) then if Y - Polygon[i].Y < (X - Polygon[i].X) * (Polygon[j].Y - Polygon[i].Y) / (Polygon[j].X - Polygon[i].X) then Result := not Result; j := i; Dec(i); end; end;
Он очень удивлялся такой реализации :) Впрочем — польза от его алгоритма тоже была — погоняли на множестве тестов и убедились что оба алгоритма работают совершенно одинаково. Знание математики при незнании алгоритмов и неумении пользоваться гуглом иногда может помешать разработке.
Так вот хорошие и быстрые библиотеки, которые нас избавят от написания своей реализации умножения матриц, уже стоят денег, ну от 8 до 32 тыщ. долларов за 1 рабочее место.
Ссылки бы было интересно увидеть на либы и цены.CrazyFizik
17.09.2017 18:01-2Моя же, нагугленная за час, реализация была такой
Crossing number algorithm, Франклин (вроде даже еще живой), думаю это года 70-80, вытекает напрямую из теоремы Жордана (XIX век). Такой сейчас любой школьник на Паскале напишет и без гугла даже (внезапно). Ничего особенного.
Гуглите дальше, пока не нагуглите без операции деления (я даже подсказку дал).
погоняли на множестве тестов
Плохо гоняли. Вы заставили меня усомниться в эффективности Ваших тестов. Работать будет только для простых многоугольников (гуглите что такое простой многоугольник если не знайте), что также напрямую вытекает из теоремы Жордана. Ну да, еще и деление.
Ссылки бы было интересно увидеть на либы и цены.
Вы же вроде бы гугл-гуру? Разве нет?
Пожалуйста
тыц
Можете потыкать на этой страничке, чтоб посмотреть как меняется цена не забудте еще добавить НДС (18%) и не забываем что ценовая политика зависит от того, кто покупает. Дистрибьютер кстати тоже маржу иметь хочет. Кстати это без Rogue Wave IMSL, на это придется отдельно раскошелится (благо стоит не дрого), а есть еще и другие аддоны.
тыц
тыц
тыц
тыцlair
17.09.2017 18:04Работать будет только для простых многоугольников
Ну так может там в задаче только простые многоугольники и есть?
CrazyFizik
17.09.2017 18:43Может и есть, но об этом ничего не сказали, значит тут 2 случая:
1) Многоугольники общего вида — феил, т.к. задач не решена
2) Чувак просто не понимает возможную сложность и объемы задачи — феил, т.к. люди просто не разобрались в задачи и когда наступит час Х все будут ломать голову над тем, почему все не работает
Плюс пункт 3): там нехорошая операция деления (она вообще-то не такая уж и тривиальная с точки зрения машины), а это уже погрешность вычислений. Так что на простых многоугольниках этот алгоритм тоже может ВНЕЗАПНО зафейлиться — иногда это не критично, иногда нет… хотя есть аналогичные алгоритмы без деления
Соответственно добавим еще и пункт 4) нет никакого обоснования почему решили именно так, а не иначе. Алгоритмов то полно, каждый из них имеет свои достоинства и недостатки — и именно этим надо оперировать, а не:
нагугленная за час
погоняли на множестве тестов
Ну и все это еще приправлено целочисленными аргументами (откуда? зачем? почему?). В общем либо совсем что-то узкоспециализированное, либо очередной говнокод, который потом будет обрастать костылями и в итоге все придет к:
Его реализация алгоритма была страницы две кода, недели 1.5-2 по времени.
Меня всегда такая святая простота умиляла.
Ну и хвалиться что нагуглил такой алгоритм несколько странно: я такую же фигню писал в школе на Паскале, а тогда гуглов не было, а интернет был через соседа по dialup модему. Современные школьники на олимпиадах тоже его вспоминают, студенты у которых были хоть какие-то азы вычислительной геометрии напишут сходу — он простой и элегантный, но уровнем не сильно круче использования скалярного произведения и гуглить тут будет только человек который вообще никогда не слышал про вычислительную и компьютерную геометрию — в этом ничего зазорного нет, но не хвалиться же этим…Zakyann
17.09.2017 20:43Ну и все это еще приправлено целочисленными аргументами (откуда? зачем? почему?). В общем либо совсем что-то узкоспециализированное, либо очередной говнокод, который потом будет обрастать костылями и в итоге все придет к:
Это часть векторного движка. Координаты точки на экране целочисленные.
она вообще-то не такая уж и тривиальная с точки зрения машины
Я в курсе :) В своё время процессора паяли на макетках ещё )
Ну и хвалиться что нагуглил такой алгоритм несколько странно: я такую же фигню писал в школе на Паскале, а тогда гуглов не было, а интернет был через соседа по dialup модему.
Честь и хвала. У меня несколько иные были интересы (больше ассемблер + разное железо). И, как видим, этот алгоритм даже в вузах не дают.CrazyFizik
17.09.2017 21:12Честь и хвала. У меня несколько иные были интересы (больше ассемблер + разное железо). И, как видим, этот алгоритм даже в вузах не дают.
Хз, у меня на 2 или 3 курсе его давали, причем на физфаке. Школьники-олимпиадники тоже его знают — в олимпиады любят такие задачки вставлять. Просто не все помнят, а кто-то может пробухал лекцию. Я вот, например, пробухал алгоритм Каргера как недавно выяснилось (спустя кучу лет). Просто подготовка у нас в стране очень-очень неравномерная. Но вообще компьютерная геометрия — это отдельная и очень большая часть математики на котрую по идее должны натаскивать только на определенных специальностях, ну вот, например, на кафедре автоматизации систем вычислительных комплексов ВМК МГУ, а вот чуваки с какой-нибудь механики мехмата МГУ вряд ли будут в курсе что там и как, зато им можно нейросети давать.
Т.е. специализация. Она у всех разная:
У меня несколько иные были интересы (больше ассемблер + разное железо)
Ну я вот как раз от этого и отошел в сторону программ где не надо соображать, как уложиться в 512 байт RAM (некоторый линейки MSP430 нас радают просто гигантскими размерами RAM и ROM)
Zakyann
17.09.2017 20:35Crossing number algorithm, Франклин (вроде даже еще живой), думаю это года 70-80, вытекает напрямую из теоремы Жордана (XIX век). Такой сейчас любой школьник на Паскале напишет и без гугла даже (внезапно). Ничего особенного.
Так я и не говорю, что тут — какой-то космос. Но вот — человек впервые алгоритм такой видел. Хотя в математике разбирается очень хорошо.
Плохо гоняли. Вы заставили меня усомниться в эффективности Ваших тестов
Я в курсе про ограничения. Формула хорошо работает на любых многоугольниках, кроме тех, у которых есть пересечения граней. И знаю причину — что непонятно, какую часть многоугольника считать внутренней, а какую — нет. Есть дополнительная проверка на пересечения. За ссылки спасибо — посмотрю.CrazyFizik
17.09.2017 22:26Так я и не говорю, что тут — какой-то космос. Но вот — человек впервые алгоритм такой видел. Хотя в математике разбирается очень хорошо.
Все упирается в специлаизацию. Если человек никогда не слышал про компьютерную геометрию — первое что ему придет в голову, считать через скалярное произведение, работать правда будет только если многоугольник выпуклый (convex), то и фиг с этим, да и вообще лучше стараться сводить все задачи к выпуклым если можно — с ними жить проще :-)
Если погуглить дальше то можно будет найти метод трассировки лучей/метод пересечений, вот как раз у Вас из этой серии пример кода, а есть еще другой подход — на количество оборотов причем потенциально эта идея может работать вообще с фигурами, которые описаны гладкими кривыми.
За ссылки спасибо — посмотрю.
Могу и еще накидать. Все на самом деле зависит от целей и задач. Вот где-то рядом чувак отписывался, что ему хватает BLAS/uBLAS, соответственно — это MKL или C++ boost они бесплатные и достаточно быстрые (MKL ИМХО быстрее, но он на самом деле условно бесплатный). Есть еще ROOT, но я им никогда не пользовался.
А вот иногда бывают другие ситуации:
1) Разработчик/заказчик хочет чего-то странного. Обычно это всякие высокоуровневые вещи и хитрые солверы. Ну т.е. одно дело просто матрицы перемножить, другое дело нужно что-то посложнее (ну я хз, например какое-нибудь квадратичное программирование) и что бы не изобретать велосипед и не тратить время проще купить.
2) Нужна супер-пупер производительность. Люди наигрались с Python/NumPy и внезапно узнают, что на других ЯП и с другими библиотеками эти же задачи решаются в 20 раз быстрее (таки реальный замер).
3) Нужны всякие свистелки и перделки. Ну банально без графиков никуда.
4) Внезапно выясняется, что кругом одни Жаба и ДотНет кодеры и никто не хочет писать на С/С++, а уж про Fortran так вообще в РФ забыли (за бугром таки нет, практически вся запрограммированная математика идет от Фортрана). Можно найти халявную библиотеку, но платная библиотека будет лучше. А так был случай когда наткнулись на C#-враппер над C/C++ библиотекой, которая в итоге сама оказалась враппером над библиотекой, написанной на Фортране. При этом исходная фортрановская библиотека была под MIT (таки общенародной достояние), а С-враппер уже под GPL 0_0
5) Людям нужна среда разработки а еще лучше — быстрый компилятор, а еще лучше что бы было все и сразу
Но вообще все же лучше по возможности писать самому: во-первых, слишком много тонкостей по применению и использованию, во-вторых, иногда бывают такие ситуацию, когда единственный доступный гугл — это книжка за много денегZakyann
18.09.2017 00:54Спасибо. Раз вы такой ссылкообильный в математическом программировании :) Может есть ссылки на еще один довольно частный алгоритм. Пока найти не можем, но нужен. Опять же векторный движок. Задача стоит провести некую гладкую линию (сплайн), проходящую через заданные точки. Из инструментов есть только кривые Безье. Думаю, известно, что они не проходят через 'опорные' точки. Стоит задача пересчитать исходные точки в 'опорные' Безье. Может кто-то что-то такое видел?
CrazyFizik
18.09.2017 04:29+1Гы. Вот буквально несколько лет назад такую задачу решал. Да и сейчас маячит.
Я так предполагаю шо сплайн кубический (с квадратичным вроде как достаточно просто должен быть), т.е.
p(t)= (1-t)*(1-t)*(1-t)*x0
+3*t*(1-t)*(1-t)*x1
+3*t*t*(1-t)*x2
+t*t*t*x3;
т.к. контрольные точки x0 и x3 у нас вообще-то известные — они же a и d, а вот x1 и x2 уже будут хз. t = t0, t1, t2, t3, 0<t<1. Зато нам будут известны 2 другие точки, пусть b и c.
b = (1-t1) * (1-t1) * (1-t1) * x0 + 3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2 + t1 * t1 * t1 * x3
c = (1-t2) * (1-t2) * (1-t2) * x0 + 3 * (1-t2) * (1-t2) * t2 * x1 + 3 * (1-t2) * t2 * t2 * x2 + t2 * t2 * t2 * x3
Ну (1-t1) * (1-t1) * (1-t1) * x0 + t1 * t1 * t1 * x3 и (1-t2) * (1-t2) * (1-t2) * x0 + t2 * t2 * t2 * x3 нам известны, так что можно это представить вот так
3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2 = b — (1-t1) * (1-t1) * (1-t1) * x0 — t1 * t1 * t1 * x3
3 * (1-t2) * (1-t2) * t2 * x1 + 3 * (1-t2) * t2 * t2 * x2 = c —
(1-t2) * (1-t2) * (1-t2) * x0 — t2 * t2 * t2 * x3
Получаем систему линейных уравнений.
Обзовем правую часть как вектор-столбец Y = [y1,y2], т.е.
y1 = b — (1-t1) * (1-t1) * (1-t1) * x0 — t1 * t1 * t1 * x3
y2 = c — (1-t2) * (1-t2) * (1-t2) * x0 — t2 * t2 * t2 * x3
мы её можем однозначно вычислить.
Это с одной стороны, а вот с другой стороны
y1 = 3 * (1-t1) * (1-t1) * t1 * x1 + 3 * (1-t1) * t1 * t1 * x2
y2 = 3 * (1-t2) * (1-t2) * t2 * x1 + 3 * (1-t2) * t2 * t2 * x2
Назовем (для компактности) неизвестные переменные как вектор-столбец X = [x1, x2], мы их не знаем. Получится:
A*X=Y
Где A — это матрица
[ 3 * (1-t1) * (1-t1) * t1, 3 * (1-t1) * t1 * t1;
3 * (1-t2) * (1-t2) * t2, 3 * (1-t2) * t2 * t2]
Она тоже одназночно вычислима, соответственно получается, решая эту СЛАУ в матричном виде:
X = inv(A) * Y
inv — это инверсия матрицы.
Почему такие сложности? Та хрен его знает — формально так положено, красиво и компактно выглядит… ну еще потому что получается, что в матрице А торчат полиномы Берштейна и задача по поиску контрольных точек в итоге сводится к решению системы линейных уравнений. Собственно каждая точка сплайна Безье это и есть линейная комбинация контрольных точек и полиномов Брештейна и есть надежда, что так можно окучивать любые сплайны (надо попробовать).
А так для кубического сплайна получиться что-то типа такого (и без всякого обращения сплайнов)
A11 = 3*(1-t1)*(1-t1)*t1; A12 = 3*(1-t1)*t1*t1; A21 = 3*(1-t2)*(1-t2)*t2; A22 = 3*(1-t2)*t2*t2; det = A11*A22 - A12*A21; //В этом месет мы можем проверить точно ли нам сплайн подсунули или циферки от балды y1.x = b.x - ( (1-t1)*(1-t1)*(1-t1)*a.x + t1*t1*t1*d.x); y1.y = b.y - ( (1-t1)*(1-t1)*(1-t1)*a.y + t1*t1*t1*d.y ); y2.x = c.x - ( (1-t2)*(1-t2)*(1-t2)*a.x + t2*t2*t2*d.x ); y2.y = c.y - ( (1-t2)*(1-t2)*(1-t2)*a.y + t2*t2*t2*d.y ); pos[1].x = A22*y1.x - A12*y2.x; pos[1].y = A22*y1.y - A12*y2.y; pos[1].x /= det; pos[1].y /= det; pos[2].x = (-A21)*y1.x + A11*y2.x; pos[2].y = (-A21)*y1.y + A11*y2.y; pos[2].x /= det; pos[2].y /= det;
Можно еще учесть, что t1 = 1/3, а t=2/3, и обозвать A11… как-нибудь по-другому, тогда говнокод станет более читабельным. Можно даже еще проще поступить, сразу вставить t1=1/3 и t2=2/3 в параметрическое уравнение и там получиться без таких сложностей просто решить систему из двух уровнений.
Вроде сходу так получается, хотя могут быть ошибки, но мне уже лень проверять. Но в любом случае с этими сплайнами все можно свести с решению систем линейных уравнений. Такие солверы встречаются вроде как везде. Собственно тут и солвер не нужен Ax=y => x = pinv(A)*y — только матрицу обратить умножить на вектор и все, главное задачку к этому свести, но это будет иметь смысл если количество уравнений больше 3-4 ИМХО
mayorovp
18.09.2017 08:59Работать будет только для простых многоугольников
Судя по используемой структуре данных, иных видов многоугольников в программе возникнуть не может по построению.
VMichael
14.09.2017 20:50+4Уже не первый холивар на эту тему тут.
Из ответов выше:
На 10 году работы программистом внезапно нашёл область, где действительно нужна математика. В частности, тригонометрия и линейная алгебра… И эта область – разработка игр
.
Т.е. 10 лет обходился без математики. Потенциально мог бы и еще 20 лет без нее работать.
У меня в своё время в анализе изображений ТФКП внезапно вылезла
Здорово. Только это весьма узкий сегмент.
Есть области программирования, где без математики никуда.
И есть обширное поле, где и без математики серьезной вполне себе можно обойтись.
Мое мнение, что стоит изучить сначала, нужна ли математика там, куда вы стремитесь попасть или чем вы собираетесь заниматься в будущем, а потом уже тратить свой самый ценный ресурс время, на углубленное изучение разделов математики.
Изучать все подряд, глупо. Этого всего столько, что жизни не хватит изучить только нужное.norlin
15.09.2017 11:49Т.е. 10 лет обходился без математики. Потенциально мог бы и еще 20 лет без нее работать.
Скажем так, за эти 10 лет математика иногда была нужна точечно, для "бизнес-логики". А вот в разработке игр она нужна постоянно и почти везде – от графического движка до логики геймплея и UI.
VMichael
15.09.2017 11:56Конечно, есть сферы, где без нее никуда.
Поэтому я и писал, нужно определиться, куда идешь и изучать соответствующие темы.
У меня был сотрудник с математическим образованием, который закончил факультет математики.
Я его спрашивал, чего ты по профилю не пошел работать (а у нас он был веб программером).
А он, ты знаешь, говорит, ТА математика, это даже не то, что вы ВУЗе учите. Там другой мир. Я защитил диплом успешно, приглашали в аспирантуру, но понял, что это не мое, я там свихнусь просто.
Т.е. к чему я это.
Нужно выбрать свое и двигаться к своему, пробовать, что твое.
А учить все подряд, потому, что кто то считает, что «без математике программисту никуда», это глупо, жизнь пока конечна и ресурс времени нужно тратить экономно.norlin
15.09.2017 12:01+3нужно определиться, куда идешь и изучать соответствующие темы
Я вот вспоминаю себя в годы последних классов школы/поступления в ВУЗ и практически не представляю, чтобы в том возрасте можно было более-менее осмысленно выбирать себе профессию на всю жизнь. Конечно, есть люди, которые чётко знают, кем они хотят быть, уже с детства, но ИМХО это скорее редкость.
VMichael
15.09.2017 12:39+1Выбор профессии это отдельная не маленькая тема :)
Мне повезло, в моем детстве был Дворец пионеров, где было множество совершенно бесплатных кружков и можно было попробовать, что тебе по душе.
Я там занимался в Зимнем саду (уход за растениями и животными), Авиамодельном, Автомодельном, Судомодельном, Радио, Бокс, Стрельба, Танцы, Волейбол, Туристическом, Программирования (или как он там назывался ЭВМ, быть может, уже не помню, в старших классах школы).
Не одновременно, конечно.
Сейчас с этим сложнее. Много чего стало платным или просто исчезло.
0xd34df00d
15.09.2017 17:56+2Без изучения математики не узнаешь, какая она бывает. Я по-настоящему в нее влюбился, когда познакомился с теорией групп.
Shakhmin
14.09.2017 20:50+8Нужна программисту не математика, а умение строить модель из всего на свете.
А уже это умение проще всего воспитывается математикой.
lair
14.09.2017 21:26+2на музыкальных сайтах они транспонируют тональность песен
Хотите полезный совет? Разберитесь в предметной области, прежде чем о ней писать.
barkalov
15.09.2017 00:17А что не так?
www.conversion-tool.com/pitchlair
15.09.2017 00:20+3Тональность не транспонируют, транспонируют композицию (или тему).
barkalov
15.09.2017 01:40Мда. Я думал, будет какое-то откровение, а тут филолог в треде…
lair
15.09.2017 10:59(да нет, что вы, что вы, такой же програмист, как и вы)
Вы никогда не слышали про необходимость выработать и строго придерживаться единой доменной терминологии?
barkalov
15.09.2017 11:14-2Я, признаться, даже не знаю, что такое «доменная терминология». Пробовал гуглить — не помогло.
Но из вариантов:
1. на музыкальных сайтах они транспонируют тональность песен
2. на музыкальных сайтах они транспонируют песни
3. на музыкальных сайтах они транспонируют темы песен
для Хабра я лично выбираю первый, как баланс между точностью и понятностью (контекста). По-моему, вариант вполне нормальный.lair
15.09.2017 11:17+2Я, признаться, даже не знаю, что такое «доменная терминология». Пробовал гуглить — не помогло.
Гуглите ubiquitous language.
для Хабра я лично выбираю первый, как баланс между точностью и понятностью (контекста). По-моему, вариант вполне нормальный.
Вот только для специалиста он совершенно некорректен (и показывает, что автор варианта не понимает, что происходит). В статье, призывающей изучать предметную область, это плохой пример.
ttools
15.09.2017 14:43А какая тут математика? Сложение и вычитание
barkalov
15.09.2017 14:52+1Сложение/вычитание, это если музыка записана в midi.
А если wave, то это Фурье/оконные функции.ttools
15.09.2017 18:05В этом случае не то, чтобы Фурье, скорее умножение и деление, если речь о транспонировании музыки
barkalov
15.09.2017 19:15Так-то, внутри у много чего умножение и деление. :)
А почему не Фурье?
Я знаю алгоритм, как это сделать без Фурье, но мне бы хотелось послушать ваши доводы — может мы о разном говорим.ttools
15.09.2017 20:02Транспонирование — это перенос нот музыкального фрагмента на заданное целое число N полутонов вверх или вниз, т.е. сложение/вычитание в терминах нот. Или N-кратное умножение/деление частоты исходных звуков на 2^(1/12)
lair
15.09.2017 20:11Или N-кратное умножение/деление частоты исходных звуков на 2^(1/12)
… это если у вас полностью равномерный строй, что в реальной жизни встречается крайне редко.
ttools
15.09.2017 20:30Равномерно-темперированный строй вы имеете ввиду? Всё как раз наоборот, встретить отличный от него в наше время довольно сложно. Но это вообще не имеет отношения к транспонированию. Умножать/делить частоту можно на коэффициент как кратный целому соотношению полутонов, так и не кратный, суть та же
lair
15.09.2017 20:46Равномерно-темперированный строй вы имеете ввиду?
Его, родимо-ненавистный.
Всё как раз наоборот, встретить отличный от него в наше время довольно сложно.
Оу, серьезно? Ну давайте посчитаем. Вокал — неравномерный. Все струнные инструменты с нефиксированным звукорядом (т.е., все струнные, входящие в состав большого симфонического оркестра, кроме арфы и фортепиано) — неравномерные. Медные духовые? Нетемперированные. У деревяшек тоже есть микроинтонирование губами и пальцами, поэтому они будут неравномерными. Итого, в оркестре остаются арфа и фортепиано, и, уж поверьте, их тоже настроят неравномерно, чтобы они не конфликтовали со всем остальным "хорошо темперированным" оркестром.
Окей, уйдем из оркестра. Струнные с фиксированным звукорядом, но имеющие больше одной струны (и больше одной ноты на одной струне) — проще говоря, все струнные с больше чем одной струной и ладами — тоже неравномерные (есть люди, которые строят равномерные гитары, но вы не хотите это видеть).
Короче, истинно равномерная обычно только электроника, либо инструмент, над которым специально прыгали, чтобы он был равномерным. А все остальное — "хорошо" темперированное на вкус того, кто в этом месте за интонацию отвечает.
(вуф, я столько раз это уже написал, что скоро сделаю сниппет или пост под ссылку)
Умножать/делить частоту можно на коэффициент как кратный целому соотношению полутонов, так и не кратный, суть та же
Это зависит от того, вы транспонируете в рамках строя, или с его сохранением. Первое — это как если бы у вас был натуральный (или темперированный) рояль, и вы транспонировали руками (было in C, стало in G): благодаря тому, что вы перемещаетесь из одного места неравномерного строя в другое, окраска меняется. Это, кстати, ровно то, что происходит в ХТК.
А то, что вы описываете — это второе, т.е. у вас был натуральный инструмент in C, вы его выбросили, взяли натуральный инструмент in G, и сыграли на нем (любимое дело для духовиков, чего уж).
ttools
15.09.2017 21:16Уверяю вас, вы глубоко заблуждаетесь насчет неравномерно темперированного строя. 99.9999...% музыки, которую вы можете услышать в современном мире по радио, телевизору, живую (включая симфоническую) звучат в равномерно темперированном строе.
ХТК во времена Баха звучал скорее всего в «хорошей темперации» Вейкместера (неравномерная, но близкая, как раз цель такой темперации — более менее одинаковое звучание соотношений в разных тональностях), а сейчас на современных инструментах исполняется в равномерно-темперированном строе.
Задачу транспонирования без сохранения соотношений интервалов для записанной общей волны я бы да, стал решать, используя преобразование Фурье, но это работало бы только для синусоподобных тембров. Для живых инструментов эта задача не является решаемойlair
15.09.2017 21:18Уверяю вас, вы глубоко заблуждаетесь насчет неравномерно темперированного строя. 99.9999...% музыки, которую вы можете услышать в современном мире по радио, телевизору, живую (включая симфоническую) звучат в равномерно темперированном строе.
Основания для этого утверждения?
ttools
15.09.2017 21:30-1Знание
lair
15.09.2017 21:32… полученное откуда? Верифицированное чем?
(А то я же вам тоже "знание" излагал, полученное из образования и личного опыта, и верифицированное, опять же, личным опытом, разговорами с исполнителями, ну и тривиальной логикой местами)
ttools
15.09.2017 21:42Ну как вам сказать. Вот были бы вы здесь мы бы с вами понажимали на клавиши синтезатора, запустили бы программку, посмотрели бы частоты, посчитали соотношения, взяли бы гитару, послушали ушами, что все ноты звучат одинаково, замерили бы частоты и вы бы во всем своими ушами/глазами убедились. А через интернет не знаю. Может здесь есть, кто в этом вопросе понимает, подтвердит, что вы не правы
lair
15.09.2017 21:48Клавиши синтезатора — это как раз та "электроника", которая вполне может быть равномерной. А вот с гитарой интересно… начнем с того, что все гитары разные. Предположим, у вас честная равномерно-темперированная гитара. У вас квинтовый флажолет звучит строго-ровно на октаву выше, чем струна, зажатая на том же ладу?
ttools
15.09.2017 22:02Ну раз вы признаете синтезатор равномерно-темперированным — всё просто. Гитара у меня обычная, не натурально или еще как-то по особому темперированная. Настраиваю струны гитары по синтезатору — ми, си, соль, ре, ля, ми. Далее проверяем все унисоны по всем полутонам синтезатор и гитару. Всё совпадает. Берем записи других инструментов, оркестровые например и подбираем точные ноты на синтезаторе. Все унисоны звучат чисто, естественно кроме мест, где применяются соответствующие приёмы. А флажолеты не очень показательны, для флажолета струна не зажимается
lair
15.09.2017 23:08Настраиваю струны гитары по синтезатору — ми, си, соль, ре, ля, ми.
На слух?..
Берем записи других инструментов, оркестровые например и подбираем точные ноты на синтезаторе.
Сольные или ансамбль/оркестр?
А флажолеты не очень показательны, для флажолета струна не зажимается
Флажолеты показательны именно потому, что они заведомо натуральные.
ttools
15.09.2017 23:44На слух?..
Да, какие проблемы, это же унисоны, небольшие отличия по частоте дают очень диссонантное звучание, легко отличить человеку даже без особого слуха. Вот если бы строй различался, это было бы слышно.
Вот вы утверждаете, что гитара неравномерно темперирована. Значит волчья квинта должна быть где-то? Нет, ее нет, все чистые квинты звучат одинаково чисто, как и полагается равномерным квинтам с еле слышными низкочастотными биениями чуть чаще 1 Гц.
Сольные или ансамбль/оркестр?
Без разницы. Включаю Скорпионс — снимаю гитары на синтезаторе — унисоны ок. Беру флейту из «Одинокого пастуха» Ласта — унисоны ок. Виолончели — тут под рукой у меня сериал «Игра престолов» там виолончель на заставке и трубы с волторнами есть в самой серии -унисоны чистые
Флажолеты показательны именно потому, что они заведомо натуральные
Вот как раз поэтому и не показательные. Гитара ладовый инструмент, а флажолет извлекается на струне которая не прижимается. С помощью такой техники можно извлекать звуки по высоте отстоящие друг от друга на интервалы меньше полутона и вопрос темперации инструмента в этом случае теряет смысл
lair
15.09.2017 23:50Да, какие проблемы, это же унисоны, небольшие отличия по частоте дают очень диссонантное звучание, легко отличить человеку даже без особого слуха.
Да так… далеко не все люди так хорошо слышат унисоны между двумя разными инструментами.
Вот вы утверждаете, что гитара неравномерно темперирована. Значит волчья квинта должна быть где-то?
Почему? Просто не все полутона одинаковые.
Без разницы.
А как вы умудряетесь сверить унисон с заведомо грязным интервалом?
Вот как раз поэтому и не показательные.
Это зависит от того, что хотеть увидеть. Как вы думаете, если флажолеты отличаются от соответствующих зажатых нот, будет ли музыка звучать чисто?
С помощью такой техники можно извлекать звуки по высоте отстоящие друг от друга на интервалы меньше полутона
Я, вообще-то, и на зажатых струнах могу извлекать звуки с интервалами меньше полутона...
Правда, надо признать, что в тезисе "вопрос темперации инструмента [...] теряет смысл" вы правы. Просто потому, что каждый исполнитель своими руками делает ту темперацию, которая ему нравится. А дальше вопрос исключительно того, какому количеству людей нравится равномерная темперация...
0xd34df00d
16.09.2017 00:34Простите, что врываюсь, но что порекомендуете почитать по музыкальной теории для околоматематиков? С прицелом на всякую гитарную ерунду.
lair
16.09.2017 00:35К сожалению, сходу ничего. В голову приходит Способин, но я не уверен, что его осмысленно читать без практики.
(к моему стыду, я давно перестал преподавать)
ttools
16.09.2017 07:51Почему? Просто не все полутона одинаковые.
но они одинаковые и совпадают с синтезатором
Это зависит от того, что хотеть увидеть. Как вы думаете, если флажолеты отличаются от соответствующих зажатых нот, будет ли музыка звучать чисто?
А что вы хотите увидеть, извлекая флажолет? да, он будет натуральным, а не равномерно темперированным, но он извлекается приемом без прижатия струн, им можно вообще любые звуки извлечь
Я, вообще-то, и на зажатых струнах могу извлекать звуки с интервалами меньше полутона...
Можно, если делать подтяжки. Но если ваша задача выяснить вопрос о строе инструмента, то подтяжки делать не надо )
каждый исполнитель своими руками делает ту темперацию, которая ему нравится
Это не так. На некоторых инструментах теоретически возможно играть в неравномерной темперации он теоретически мог бы, но этим занимаются ну может экспериментаторы какие-нибудь только
А дальше вопрос исключительно того, какому количеству людей нравится равномерная темперация...
Это удобно и все уже привыклиlair
17.09.2017 01:59но они одинаковые и совпадают с синтезатором
Ну, у меня не так.
А что вы хотите увидеть, извлекая флажолет?
Да я, собственно, выше спросил: "если флажолеты отличаются от соответствующих зажатых нот, будет ли музыка звучать чисто?"
он извлекается приемом без прижатия струн, им можно вообще любые звуки извлечь
Не любые, а только по обертоновому ряду (я о натуральных флажолетах говорю, конечно же).
На некоторых инструментах теоретически возможно играть в неравномерной темперации он теоретически мог бы, но этим занимаются ну может экспериментаторы какие-нибудь только
А вот и нет. Этим занимаются люди, которых волнует, как звучит то, что они играют. Например, все струнники (которые без ладов).
Это удобно и все уже привыкли
Вы так уверенно за "всех" говорите...
ttools
17.09.2017 08:48Ну, у меня не так.
Значит, что-то у вас не так с инструментами. Попробуйте поиграть на синтезаторе мелодии с записями других инструментов, на которые вы думаете, что они неравномерно-темперированные, должны получиться чистые унисоны, что докажет обратное
Да я, собственно, выше спросил: «если флажолеты отличаются от соответствующих зажатых нот, будет ли музыка звучать чисто?»
Флажолеты это украшение музыки, а не основа, они звучат коротко и не мешают. В музыке не обязательно все звуки должны опираться на звукоряд, например есть ударные и перкуссия которые могут широко применяться в музыке, не имея при этом определенной высоты звучания.
Не любые, а только по обертоновому ряду (я о натуральных флажолетах говорю, конечно же).
С помощью слайдера (или вообще любого твердого предмета в качестве слайдера) на гитаре можно извлекать звуки и флажолеты любой высоты, не обязательно в пределах звукоряда
А вот и нет. Этим занимаются люди, которых волнует, как звучит то, что они играют.
По вашему получается, что 99.9..% музыки произведено теми, кого не волнует
Например, все струнники (которые без ладов).
Это не так. Конструкция инструментов позволяет им играть в любом звукоряде и без звукорядов вообще. Но обычно они играют в равномерно-темперированном звукоряде. Попробуйте поиграть на синтезаторе с записью каких-нибудь композиций для струнных
Это удобно и все уже привыкли
Вы так уверенно за «всех» говорите...
Ну не придирайтесь. «Почти все» — вас так устроит?
lair
17.09.2017 10:26Попробуйте поиграть на синтезаторе мелодии с записями других инструментов, на которые вы думаете, что они неравномерно-темперированные, должны получиться чистые унисоны, что докажет обратное
Я, на всякий случай, повторю, если это ранее не было очевидно: я не считаю "поиграть с синтезатором" достаточной проверкой даже для монодийных записей, а большая часть того, о чем я говорю — не монодийно.
В музыке не обязательно все звуки должны опираться на звукоряд, например есть ударные и перкуссия которые могут широко применяться в музыке, не имея при этом определенной высоты звучания.
Эмм, не надо путать звуки без определенной высоты и звуки с определенной высотой. Если вы воткнете рядом с натуральной квинтой равномерную, будет звучать плохо.
С помощью слайдера (или вообще любого твердого предмета в качестве слайдера) на гитаре можно извлекать звуки и флажолеты любой высоты, не обязательно в пределах звукоряда
Натуральный (естественный) флажолет — это, по определению, извлеченный на открытой струне.
По вашему получается, что 99.9..% музыки произведено теми, кого не волнует
Нет. По-моему получается, что подавляющее большинство музыки произведено людьми, которых не волнует как называется темперация, в которой они производят музыку.
Попробуйте поиграть на синтезаторе с записью каких-нибудь композиций для струнных
Я, знаете ли, пробовал играть на струнных, это намного поучительнее.
Ну не придирайтесь. «Почти все» — вас так устроит?
Тоже нет. Оснований-то для этого утверждения нет.
barkalov
15.09.2017 22:31проще говоря, все струнные с больше чем одной струной и ладами — тоже неравномерные (есть люди, которые строят равномерные гитары, но вы не хотите это видеть)
Вообще-то, гитара — инструмент с равномерно-темперированным стоем by design. Люди по-приколу строят как раз не равномерные, а натуральные гитары (вот у них гнутые лады). Не верите — возьмите тюнер и гитару! Понятное дело, инструмент (струны, пальцы, лады) не идеален, и на тюнере расхождения будут, но он задуман как равномерно-темперированный — и цифры на тюнере будут «плясать» около равномерного строя, а не натурального!lair
15.09.2017 23:16Вообще-то, гитара — инструмент с равномерно-темперированным стоем by design.
Бай какой-такой дизайн?
Не верите — возьмите тюнер и гитару!
Не верю. Взял. Настроил гитару строго по тюнеру (т.е., скажем, первая струна больше не равна флажолету на седьмом ладу пятой). Внезапно, двойные октавы (например, пятый лад второй — шестая) больше не чистые.
barkalov
16.09.2017 09:02Бай какой-такой дизайн?
Бай такой: гитара задумана как равномерно темперированный инструмент.
Внезапно, двойные октавы (например, пятый лад второй — шестая) больше не чистые.
И что? Это стало похоже на натуральный строй? Или на какой-то другой определенный?..
Вы смешали мухи и котлеты. Все инструменты не идеальны. Но это не имеет отношения к тому, в каком строе (каким алгоритмом) транспонировать. Нам важно то, в каком строе инструмент задуман играть, а не то, насколько криво это вышло.
Сантиметровая линейка с погрешностью остается сантиметровой, а не дюймовой, иными словами.
И, таки да, подавляющая часть музыки (если считать, скажем по просмотрам на ютубе, то можем и 99.9999% насчитать, как ttools сказал, но пускай 99.9%) задумана равномерно-темперированной. И должна транспонироваться множителем 2^(N/12).
lair
17.09.2017 02:03Бай такой: гитара задумана как равномерно темперированный инструмент.
Кем задумана? Вы про гитару Торреса, что ли? Так гитара старше, и начиналась она никак не позже Возрождения, когда равномерная темперация была немного не в ходу.
И что? Это стало похоже на натуральный строй? Или на какой-то другой определенный?..
Нет, а почему должно быть?
Все инструменты не идеальны. Но это не имеет отношения к тому, в каком строе (каким алгоритмом) транспонировать. Нам важно то, в каком строе инструмент задуман играть, а не то, насколько криво это вышло.
Нет, нам важно, как на инструменте реально играют. Чтобы, когда мы транспонируем, мы отдавали себе отчет, что именно происходит с инструментом:
- исполнитель играет на том же инструменте, но другие ноты
- исполнитель берет другой инструмент
- исполнитель перестраивает существующий инструмент
подавляющая часть музыки задумана равномерно-темперированной.
Откуда дровишки? Я вот готов утверждать, что подавляющая часть музыки вообще не задумывается о темперации.
barkalov
17.09.2017 10:19Кем задумана? Вы про гитару Торреса, что ли? Так гитара старше, и начиналась она никак не позже Возрождения, когда равномерная темперация была немного не в ходу.
Какая разница, когда что начиналось. Сейчас на гитаре лады расположены по какому закону? Для чего именно так?
И что? Это стало похоже на натуральный строй? Или на какой-то другой определенный?..
Нет, а почему должно быть?
Потому что, это как раз принципиальный вопрос. Ещё раз, повторяю свои слова: «Понятное дело, инструмент (струны, пальцы, лады) не идеален, и на тюнере расхождения будут, но он задуман как равномерно-темперированный — и цифры на тюнере будут «плясать» около равномерного строя, а не натурального!»
Потому что должен быть какой-то строй. Иначе, о чем разговор… Вот какой строй у вашей гитары? Как он называется, если не «равномерно-темперированный»?
Исполнитель уже сыграл. А мы берем аудиофайл и транспонируем. Такой контекст. И вот совершенно не важно нам, насколько хорошо получилось настроить у него инструмент, важно то, что он был формально настроен в равномерно-тепмерированном (± погрешность). И по-этому аудиофайл мы будем транспонировать но законам равномерно-тепмерированого строя. Используя множитель 2^(N/12).- исполнитель играет на том же инструменте, но другие ноты
- исполнитель берет другой инструмент
- исполнитель перестраивает существующий инструмент
Или вы предлагаете иначе? Какой закон используем?
Ну и о чем тогда весь сыр-бор?подавляющая часть музыки задумана равномерно-темперированной.
Откуда дровишки? Я вот готов утверждать, что подавляющая часть музыки вообще не задумывается о темперации.
lair
17.09.2017 10:28Какая разница, когда что начиналось. Сейчас на гитаре лады расположены по какому закону? Для чего именно так?
Предположительно, равномерному. Чтобы можны было играть в любой тональности. Практически же это никогда не достигается, и исполнитель темперирует под то, где он играет, сам.
Исполнитель уже сыграл. А мы берем аудиофайл и транспонируем.
Так какая задача этой транспозиции? Мы предполагаем, что он играет на том же инструменте, но другие ноты, или на другом инструменте?
Ну и о чем тогда весь сыр-бор?
О том, как музыка звучит.
barkalov
17.09.2017 11:13Предположительно, равномерному. Практически же это никогда не достигается, и исполнитель темперирует под то, где он играет, сам.
«Практически» и это тоже никогда не достигается, даже если музыкант — виртуоз. Только это всё, повторюсь, не имеет значения. Важно то, как музыка музыка была задумана быть сыгранной. Если гитарист играет (пусть плохо), темперируя в натуральном строе — значит строй считаем натуральным. И транспонируем соответственно. Без разницы, насколько хорошо у него это вышло. Но по умолчанию у гитары строй задуман равномерно-темперированным. Как и 99.9% музыки из радио.
Так какая задача этой транспозиции? Мы предполагаем, что он играет на том же инструменте, но другие ноты, или на другом инструменте?
Вы слышали как звучит питч-шифтер?
Задача — сменить тональность трека, чтобы можно было свести треки в одной тональности.lair
17.09.2017 11:36Важно то, как музыка музыка была задумана быть сыгранной. [...] Как и 99.9% музыки из радио [по умолчанию задумано равномерно-темперированным]
А откуда вы знаете, как она задумана?
Если гитарист играет (пусть плохо), темперируя в натуральном строе — значит строй считаем натуральным. И транспонируем соответственно.
О. И как вы это будете делать?..
barkalov
17.09.2017 11:57А откуда вы знаете, как она задумана?
Бритва Оккама.
О. И как вы это будете делать?..
А никак. Ну, или можно попробовать механизм pitch-detection, как в автотюне, если мелодия монофоническая. Если сработает — то далее по стандартным правилам натурального строя. А в общем случае — никак.
Собственно, это и есть ещё одно доказательство того, что музыка «из радио» в основном — равномерно-темперированная. Потому что она без проблем транспонируется пост-фактум по линейному закону — спросите ди-джеев. Будь это не так — они этим бы не занимались.lair
17.09.2017 12:28Бритва Оккама
Согласно которой музыка задумана без темперации, да.
А в общем случае — никак.
Вот.
Собственно, это и есть ещё одно доказательство того, что музыка «из радио» в основном — равномерно-темперированная. Потому что она без проблем транспонируется пост-фактум по линейному закону — спросите ди-джеев. Будь это не так — они этим бы не занимались.
Это всего лишь значит, что результат, который они получают после транспонирования, их устраивает. О том, как написана музыка, это не говорит ничего.
barkalov
17.09.2017 17:44«99.9% музыки из радио задуманы быть сыгранными без темперации» — ваши слова, верно?
«Без темперации» это какой строй?lair
17.09.2017 17:48«Без темперации» это какой строй?
Тот, который исполнителю приятнее на слух (то есть скорее всего, какой-то вариант "хорошей" темперации).
barkalov
17.09.2017 18:14А сколько процентов, по-вашему, равномерно-темперированной?
lair
17.09.2017 18:37Мне сложно оценить в процентах, но сюда попадает (почти) вся электроника (не знаю, сколько ее), и ощутимое количество чисто фортепианной музыки, сыгранной на инструментах, настроенных в последние лет двадцать. Я бы сказал, что это меньше половины.
lair
16.09.2017 00:20Уверяю вас, вы глубоко заблуждаетесь насчет неравномерно темперированного строя. 99.9999...% музыки, которую вы можете услышать в современном мире по радио, телевизору, живую (включая симфоническую) звучат в равномерно темперированном строе.
Кстати, а вы правда думаете, что старинная + народная музыка в сумме составляют меньше 0.0001 процента от радио, телевидения и живого исполнения?
ttools
16.09.2017 07:58Я думаю немного не так. Старинная и народная музыка сейчас исполняется в равномерно темперированном строе. Но никто не мешает взять какому-нибудь музыковеду взять настроить допустим фортепиано в неравномерной темперации и сделать передачу о том, как музыка звучала раньше. Это и будет меньше 0.00..1
lair
17.09.2017 02:06Старинная и народная музыка сейчас исполняется в равномерно темперированном строе.
Откуда дровишки?
Но никто не мешает взять какому-нибудь музыковеду взять настроить допустим фортепиано в неравномерной темперации и сделать передачу о том, как музыка звучала раньше. Это и будет меньше 0.00..1
То есть вы не слышали про historically informed performance, факультеты (и академии) старинного исполнительства, Hesperion XX, Кронос-квартет и так далее? Вы считаете, что ирландцы, играя в drop D, сохраняют в бурдоне грязную квинту? Вы считаете, что ансабли духовной музыки (которых в России есть), исполняя партесные концерты, поют в акустически грязном строе, хотя им ничего не мешает петь в чистом?
ttools
17.09.2017 09:15Откуда дровишки?
записи Баха, Вивальди, Полистрино в исполнении современных музыкантов
То есть вы не слышали про historically informed performance, факультеты (и академии) старинного исполнительства, Hesperion XX, Кронос-квартет и так далее? Вы считаете, что ирландцы, играя в drop D, сохраняют в бурдоне грязную квинту? Вы считаете, что ансабли духовной музыки (которых в России есть), исполняя партесные концерты, поют в акустически грязном строе, хотя им ничего не мешает петь в чистом?
Вы странный. Напредполагали, что я что-то там считаю, о том, что от вас слышу впервые. Нет, я не слышал, о том, что вы говорите и не могу ничего считатьlair
17.09.2017 10:35записи Баха, Вивальди, Полистрино в исполнении современных музыкантов
Вот уж Баха сейчас только ленивый не играет в разной темперации (с тех пор, как появились тюнеры и таблицы, это стало доступно любому студенту). А Палестрина (вы же его имели в виду?) — это вообще акапельные хоры, они поют так, как выгодно акустически (мне с месяц назад попадались наставления хормейстерам середины XX века, СССР, так там явно давались указания, нарушающие равномерную темперацию).
Вы странный. Напредполагали, что я что-то там считаю, о том, что от вас слышу впервые. Нет, я не слышал, о том, что вы говорите и не могу ничего считать
Так может того, о чем вы не слышали, немножко больше, чем какая-то там доля процента? В частности, в старинной музыке сейчас исторически-информированное (или аутентичное) исполнительство составляет большую часть — если, конечно, брать всю старинную музыку, а не маленький кусочек барокко, который на общем слуху; собственно, ощутимую часть старинной музыке (те же кантиги или Libro Vermel) кроме ансамблей старинной музыки никто и не исполняет.
barkalov
15.09.2017 21:01Верно. Но в PCM аудиофайле ведь нет «частот». Там же time-domain. И чтобы получить эти частоты, нужен оконный Фурье.
(На всякий случай: если просто проиграть весь аудиофайл в 2^(N/12) раз быстрее, то это будет не то транспонирование, что нужно. Подразумевается, что нужно сохранить темп неизменным, так ведь?)
Есть вариант без Фурье. Нужно проиграть весь аудиофайл в 2^(N/12) раз быстрее, но не «просто», а циклически внутри окна, которое само перемещается по аудиофайлу с изначальной скоростью воспроизведения. Желательно в несколько итераций (смешивая в общий буфер) и обязательно под оконной функцией (нужно генерировать гауссиану). Не забудьте про кубическую интерполяцию.
Это всё, конечно умножения будут. Но не те. Не 2^(N/12) на частоту.ttools
15.09.2017 21:27Всё проще. Сначала умножение 2^(N/12), потом передискретизация в новую частоту с постоянным коэффициентом.
barkalov
16.09.2017 09:05То есть, Фурье всё же нужен, или я вас не понял? На что 2^(N/12) умножать будем?
ttools
16.09.2017 10:02Есть много алгоритмов без применения Фурье. Есть, например, софтовый эффект pitch, который этим занимается в реальном времени.
На что 2^(N/12) умножать будем?
На коэффициент умножается исходная частота дискретизации, сигнал передискретизируется в новой частоте и накладывается на исходную. Алгоритмов наложения разных очень много. Пример, который характеризует основу идеи может выглядеть так:
Допустим есть исходный сигнал в заданной частоте дискретизации и нужно уменьшить частоту вдвое:
пусть measures исходного сигнала будут ABCDEFG,
в выходном сигнале будет AACCEEGG
допустим надо увеличить частоту вдвое для исходного сигнала
AABBAABB
в выходном сигнале будет
ABABABAB
ttools
14.09.2017 21:34+8Есть такой анекдот:Встречает мастер своего преподавателя по вышке лет через восемь после
окончания вуза, разговорились, вспомнили время былое. Профессор
спрашивает:
— Вот я вам читал три года высшую математику, скажи, в жизни тебе мои
знания когда-нибудь пригодились?
Студент, подумав:
— А ведь был один случай.
— Очень интересно, расскажите, я его буду на лекциях рассказывать, что
высшая математика не такая абстрактная наука и в жизни бывает нужна.
— Шел я как-то по улице, и мне шляпу ветром в лужу сдуло. Так я взял
кусок проволоки, загнул его в форме интеграла и шляпу достал!alz72
14.09.2017 21:45+2"Математику уже затем учить надо, что она ум в порядок приводит..." М.В. Ломоносов. В принципе вполне может случиться так что человек всю жизнь проработает программистом и никогда не столкнется с математикой выше средней школы ( хотя вероятность очень мала). Но знание математики пригодиться буквально в любой предметной области !
Bhudh
14.09.2017 22:19+4Да и знание русского языка не помешает.
Чтобы в описании изменений в новой версии или комментариях в коде -тся и ться не путать.alz72
14.09.2017 23:59+1Английский нужнее ...
lair
15.09.2017 00:01+1А вы думаете, что человек, для которого русский родной, может писать по-английски грамотнее, чем по-русски?
(это безотносительно того, корректно ли ваше утверждение, в чем лично я не уверен)
alz72
15.09.2017 00:09Грамота тут ни при чем, как и переход на личности. Так уж получилось что английский — это основа подавляющего большинства языков программирования.
lair
15.09.2017 00:18Вот только знание естественного языка программисту нужно не только (гм) для того, чтобы понимать язык программирования. Так что грамотность все же "при чем".
timiskhakov
15.09.2017 14:10+1А вы думаете, что человек, для которого русский родной, может писать по-английски грамотнее, чем по-русски?
Когда нет практики письма на русском (например, в эмиграции) — да. Простите за занудство.lair
15.09.2017 14:12С этим я, кстати, соглашусь, эмигранты мне уже позже пришли в голову как пример (собственно, сам наблюдал).
Idot
15.09.2017 14:18А вы думаете, что человек, для которого русский родной, может писать по-английски грамотнее, чем по-русски?
Легко! В школьные годы, мечтая стать инженером, забил на русский язык и прочую гуманитарщину. А затем, когда СССР рухнул и стал нужен английский язык, изучил английский язык (на который забивал в школе), и потому такой вот результат.
lair
15.09.2017 14:23… и зачем ему понадобился грамотный английский язык?
Idot
16.09.2017 18:53Потому что когда учишь английский, то ему учат. Это не родной русский язык, которому учиться нет нужды, по той причине, что его и так знаешь, а потому возможно абсолютно не слушать учителя рассказывающего про грамотность.
lair
17.09.2017 02:07Не складывается.
Вот вы выучили английский до состояния начинашки. Зачем вам дальше слушать про грамотность?
Idot
17.09.2017 08:07После "начинашки" = beginner, идут дальше уровни: elementary, pre-intermediate, intermediate, upper-intermediate, advanced.
И когда все их учишь, то ОЧЕНЬ ВНИМАТЕЛЬНО слушаешь препада, а не смотришь в окно и считаешь ворон, как это было на уроках русского языка, который ты и так знаешь, потому что он родной.lair
17.09.2017 10:21Во-первых, зачем учить дальше, не знаю, intermediate? Во-вторых, откуда берется "очень внимательно"? В-третьих, можно получить advanced и все равно писать неграмотно.
Dmitry88
14.09.2017 22:35+1Скажу крамольную вещь, но наверное — не обязательно. Думаю, если вам из лаборатории реактивного движения принесут готовый алгоритм полета Вояджера, то вы скорее всего справитесь с конечной задачей и сможете запрограммировать все маневры. Я к тому, что в текущем мире задачи лучше разделять по исполнительскому мастерству. Один продумывает алгоритм, другой его реализует, третий тестирует и т.д.
mayorovp
15.09.2017 10:21+1Так уже пробовали — вечно хрень какая-то получается. То истребитель "вверх ногами" переворачивается, то авионика зависает...
VMichael
15.09.2017 10:52Нам препод в институте говорил:
Никогда не соревнуйтесь в программировании математики с математиками. Просто потому, что вы не будете знать предметную область так, как знают они.
Тут я с ним согласен. Проще математику обучиться программированию и решать свои задачи.norlin
15.09.2017 11:56+1В данном примере математик, наверно, лучше запрограммирует какие-нибудь математические функции. А вот собрать целиком продукт (содержащий математический модуль), скорее всего, лучше получится всё же у программиста. Зато математик вполне может тесты для проекта подготовить.
evalexdy
14.09.2017 22:54Программисты уже давным-давно из абстрактных «гуру всего» делятся на достаточно узкоспециализированные направления. Тот, кто прекрасен для веба, например, увязнет в разработке драйверов, системщики не считают верстальщиков программистами и так далее.
БОльшая часть работы программиста может решаться грамотной постановкой задачи: если приходит задача, в которой нужно выдать результат сложения А и Б, описан тип и А и Б, а также есть техническое задание на способ сложения (А и Б не обязательно могут быть числами), то математика, может быть, и не понадобится. Другое дело, когда ставится задача сложить А и Б, а по условиям задачи, А и Б — это, например, векторы, вот тогда нужно вспомнить математику. И все эти споры «нужно ли программисту знать бухгалтерию, геометрию, банковское дело и т.д.» в итоге упираются в грамотного проект-менеджера. Другое дело, что лучший проект-менеджер это тот, кто досконально знает программирование текущих задач ;)
AlexZaharow
15.09.2017 01:26+4Ну если математика так нужна программисту, то почему математику так же сильно не нужно программирование?
Я объясню, почему раньше считалось, что математика нужна программисту — потому что раньше компьютеры использовались исключительно для вычислений, поэтому и нужны были люди, которые умели быстро вычислять на компьютере. Да и то, напомню, что раньше программисты компьютеры в глаза не видели — они писали программы, а вводили их в компьютер — операторы.
Ну и тем более, что программистами сегодня обзывают кого угодно, так что вы бы лучше сказали бы, а кто же такие программисты вообще? А то тут холивара уже столько развелось, а ведь образ программиста у каждого свой ;)pm_wanderer
15.09.2017 02:30+1Абсолютно верно. Один кричит, что математика нужна и подразумевает под этим термином сложение и вычитание, а другой доказывает что не нужна, имея ввиду матан.
Hardcoin
15.09.2017 10:07Многим математикам программирование очень нужно. Не даром есть Wolfram Language или R
i360u
15.09.2017 07:07+4Очень люблю математику и совершенно ее не знаю. Все, что было из институтского курса — благополучно забыл. Почему? Потому, что на практике так и не потребовалось. Зато потребовалась куча всякого другого, чему в институтах не учили и не учат. Однако, если попадется соответствующая задача — с удовольствием нырну в тему. Любой спор о том, что нужно или не нужно программисту чаще всего сводится к экстраполяции собственного опыта участников спора на всю отрасль, а это глупо.
Idot
15.09.2017 08:15+2htmlacademy: Нужна. А, кроме неё, нужна сферическая геометрия,
А что сферическая геометрия уже не математика? Или для Вас любая геометрия не математика? facepalm
Old_Chroft: Что программисту нужно 100% — это логика. Без этого — увы никак (если программированием не называть рисование формочек, само собой).
Математика же, обычно, нужна постольку-поскольку.А что логика это уже не математика? facepalm
PS за что Old_Chroft так наминусовали?
Idot
15.09.2017 09:15+2Old_Chroft — обрати внимание, где логика,>htmlacademy — обрати внимание, где геометрия:
Так что вопрос не в том "нужна ли математика программисту?", а в том "какие именно разделы математики наиболее полезны программисту?".
Zakyann
15.09.2017 13:29+1Можно разобрать по формальной логике некоторые утверждения автора:
«Нужна ли математика программисту? Нужна. А, кроме неё, нужна сферическая геометрия, география, музыка и банковское дело.?»
Утверждается, что математика нужна и не уточняется, что нужна не вся. Значит утверждается, что нужна вся. Что по моему мнению, не верно. Я согласен с вашим утверждением.
Дальше: утверждается, что кроме математики нужна сферическая геометрия, то есть автор относит математику и сферическую геометрию к разным наукам, что тоже неверно.
Когда же я утверждаю, что программистам не нужна математика, но нужна логика, я вполне могу иметь в виду, что нужна не вся математика, а только её часть — логика.
Впрочем, что бы окончательно не уйти в софистику, на том и закончим :)
Zakyann
15.09.2017 13:40-2PS за что Old_Chroft так наминусовали?
Кого-то здесь волнует карма? :) Будет неудобно писать, заведу еще один акк. Пусть минусуют, мне вообще пофиг. Зато могу свободно говорить то, что думаю, а не только то, что нравится толпе и она хочет от меня услышать.
Чем самому же ставить мало о чем не говорящие плюсы-минусы — то лучше отписать хоть что-то. Мне эта возможность тоже не нужна. Как и статьи. Лучше себе на сайт напишу что-то :)
wkia
15.09.2017 11:38+1Я каждый раз радуюсь, когда на работе попадается математическая проблема. Примерно раз в шесть лет.
luarviq
15.09.2017 11:38-1Приедьте к нам в Малайзию и попробуйте пройти собеседование в более или менее приличную компанию без знания алгоритмов и структур данных. Погонят рваными тряпками. И это правильно. Сам насмотрелся на таких гаврил — приходит он, значит, и ты ему должен объяснять, почему здесь лучше сделать очередь с приоритетами, а не стек. От этого клинит реально. И не «немного дискретки», как выразился автор, а всю ДК, до изоморфизма графов включительно. Кто ниасилил — для вас творения Михаила Фленова из серии «ХХХХХ глазами хацкера»
luarviq
15.09.2017 11:55-5P.S. Кто-то скажет, что алгоритмы и структуры данных — это не чистый math. Ладно, допустим. Но попробуйте объяснить новичку в JavaScript что такое closure без ряда Фибоначчи. Что вы будете использовать, какой надуманный пример? Да вообще говоря, и рекурсию понять без этого невозможно. В учебниках обычно пишут про манипуляции со стеком и адреса возврата. Но разве это суть рекурсии? А тут мы уже вплотную подходим к проблеме останова, теореме Клини и прочим интересным вещам. Вот вам и math в чистом виде! А то — «я пишу 40 лет и никогда не знал, что такое синус». С чем вас и поздравляю.
mayorovp
15.09.2017 12:05+5Ну и нафига нужен ряд Фибоначчи при объяснении замыканий? А рекурсию объяснять через него и вовсе не следует, разве что в виде: "а теперь посмотрите как делать нельзя".
luarviq
15.09.2017 13:07-5Что делать нельзя? Ряд Фибоначчи считать используя рекуррентные соотношения?
Да. Рекурсию нужно объяснять так. Эта, типа, функция, которая вызывает себя. Но смотри следи за стеком, а то грохнется все. Ну есть еще типа хвостовая рекурсия, которой этот самый стек вообще по барабану, но с тебя хватит. Ты ж в html академию пришел, в конце концовknotri
15.09.2017 13:35+1Да о какой хвостовой рекурсии идет речь? Нет ее пока в браузерах
http://kangax.github.io/compat-table/es6/#test-proper_tail_calls_(tail_call_optimisation)
lair
15.09.2017 12:27+2Для того, чтобы объяснить что-то на примере ряда Фибоначчи, достаточно быстро объяснить, что такое ряд Фибоначчи — а это, для прикладных задач, очень быстро.
barkalov
15.09.2017 12:29+2Я, честно говоря, не вижу сложностей в объяснении closure в js. Оно там выглядит и работает совершенно естественным образом, просто исходя из областей видимости. Понятно даже ребёнку. Сложнее объяснить почему это НЕ работает, например, в С# так-же просто и немногословно (без делегатов).
А в качестве примера рекурсии я использую задачу поиска файла в дереве каталогов. Куда нагляднее, как мне кажется.mayorovp
15.09.2017 13:08А откуда взялось ограничение "без делегатов"?
Не вижу отличий между вот этими программами:
// Javascript var a = 5; foo(() => a); // C# var a = 5; Foo(() => a);
barkalov
15.09.2017 13:33Без делегатов = так-же просто и немногословно.
Но со стрелочными функциями выглядит и вправду симметрично. Но я имел ввиду что-то вроде этого:
function outer() { let a = 1; function inner() { let b = 2; return a + b; } return inner(); }
В Шарпе так уже не поговнокодишь.mayorovp
15.09.2017 13:36Func<int> Outer() { var a = 1; return delegate () { var b = 2; return a + b; } }
В новом шарпе, кстати, хотят локальные функции добавить. Ну или уже добавили — не следил за этой фичей.
Zakyann
15.09.2017 13:47-2Сишарп уже почти Делфи/Билдер :) Еще бы в нём дотнета не было — и можно было бы использовать.
knotri
15.09.2017 13:32Я javascript разработчик с хорошим знанием матана, стрктур данных и алгоритмов.
Но я в душе не представляю зачем вы так усложнили рекурсию и замыкания.
А уж как часто она (рекурсия) применяется в жизни Frontend (не говоря уже про верстальщика). Наверное целых два раза в год.
Zakyann
15.09.2017 16:23К замыканиям ряды Фибоначчи вообще отношения не имеют, разве что как пример реализации. Плохой пример.
0xd34df00d
15.09.2017 18:06А после изоморфизма графов преобразование графов, а там кодекартовы квадраты вылезают, теоркат, вкусняшечка!
Sinatr
15.09.2017 11:43+1Итого: учите всё подряд, что попадётся вам под руку.
Смысл статьи одним предложением.
мы работаем в банковских сервисах, сервисах бронирования отелей, картографических сервисах и прочих Яндекс.Почтах.
Хмм… ничто не подходит, получается я работаю в Яндекс.Почте? Или не программист вообще?
Итого: извините конечно, но это просто ужасная статья, написанная каким-то начинающим узкомыслящим javascript-ером. Желтый заголовок прилагается.AndrewMed
18.09.2017 12:16-2получается я работаю в Яндекс.Почте? Или не программист вообще?
получается что так.
яндекс — самая унылая и жалостливая контора, которую я видел в мире. только она постоянно славливая неиллюзорных звиздюлей от гугла умудряется внутри одной страны находить административный ресурс и жаловаться антимонопольный комитет, указывая на какие-то свои будто бы ущемленные права… сами же в то же самое время устраивают полный жесткач хотя б в том же я.маркете, манипулируя, угрожая и вымогая своим монопольным положением на рынке!!!
будь я на месте гугла — уничтожил бы нах этот яндекс его же оружием — антимонополизацией рынка интернет торговли в россии, а то совсем охерели
wkia
15.09.2017 13:43Итого: учите всё подряд, что попадётся вам под руку. Для начала изучите дискретку, потому что она будет вашим основным инструментом в работе, а потом сосредоточьтесь на задачах вашего бизнеса и вы откроете для себя очень много нового в бизнесе, математике, строительстве и медицине.
Вообще, «итого» должно быть с точностью до наоборот: «сначала сосредоточьтесь на задачах вашего бизнеса, а потом учите всё подряд, что попадётся под руку, если у вас останется на это время».
Gryphon88
15.09.2017 14:42-3Лично я могу вопринимать математику только двумя способами:
— Язык. на котором говорят физики
— Сборник логических головоломок
А дальше всё зависит от того, как глубоко интересуешься физикой и как сильно любишь квесты.
michael_vostrikov
15.09.2017 15:05+1Не надо математику знать, надо уметь разбираться в предметной области, в том числе и в математике. Проблема в том, что предметная область может быть очень большой, и потребуется время, чтобы запомнить все сущности и их взаимосвязи. Поэтому знать надо тот необходимый минимум, который позволит разобраться за приемлемое время.
Пример. Необязательно знать в подробностях все возможные теоремы и операции с матрицами. Надо знать, что матрицы есть и что многие вычисления можно сделать с их помощью. Например 3D-преобразования. Понадобилось — повторил, разобрался, сделал. Или не сделал, тут уж как получится.
В этом кстати польза университетов — они дают знакомство с разными областями.Idot
15.09.2017 17:20+1Не надо математику знать, надо уметь разбираться в предметной области
Знание математики позволяет разобраться в других предметных областях.
Зная её Вы разберётесь и в физике, и в финансах, и в инженерии — везде, где есть какие-либо расчёты.
(А вот, зная физику, Вы в финансах не разберётесь, и наоборот, знание финансов, Вам никак не поможет разобраться в физике.)michael_vostrikov
15.09.2017 19:25+1Знание математики позволяет разобраться в тех областях, где используется математика. Это довольно логично. А вот разобраться в паттернах проектирования или банально CSS изучить она не поможет.
CrazyFizik
16.09.2017 21:33Ну если не придираться к словам, то да, так оно есть. Но другими словами:
1. Надо понимать, т.е. знать математику (это не имеет отношение к зазубриванию теорем, к слову сказать именно опыт в доказательстве теорем очень хорошо прокачивает мозги)
2. Надо вникать в предметную область.
Но тут все же есть разделы математики, которые надо обязательно. Я вот например, постоянно сталкиваюсь с тем, что мои знания дискретной математики мягко говоря неглубокие, линал я тоже зря прогуливал. А вот в тервере, матстатистике, ТФКП, функане, непрерывной оптимизации в силу своего первого образования вроде более-менее норм. Так что риски Фишера сходу кластеризирую, ТрыДэ фигурки тоже буду вертеть как хотеть, а вот решить задачу разбиения графа — придется долго и мучительно читать. А делать приходиться и первое, и второе, и третье...., и десятое — и абсолютно без разницы что ты пилишь: ERP, билинговую систему, CAD, ГИС и т.д.michael_vostrikov
17.09.2017 06:36+1а вот решить задачу разбиения графа — придется долго и мучительно читать
Но вам ведь это не мешает заниматься программированием и называться программистом? Я вот тоже с графами особо не знаком, а 3D интересовался только в универе. В работе это не приходилось применять, больше требуется анализ и проектирование.
CrazyFizik
17.09.2017 20:17Ну формально нет. Но вообще мода называться программистом после написания Hellow world — плохая практика. В итоге мы имеем — вычислительная мощность растет, а функционал — нет, зато патчем первого дня размером с программу уже никого не удивишь.
Единственное, что может спасти — это специализация и разделение труда. Я вот чойт туго дружу с квантерионами (ну не нравятся они мне, чисто религия), поэтому ТрыДэ стараюсь обходить стороной, хотя зря наверное.
А анализ и проектирование — это больше для людей сидящих на верхнем уровне иерархии — архитектору, тимлиду. Но без этого вообще никуда. А тот же анализ будет ограничен компетенциями разработчика. Вот я, например, вроде как нормально разбираюсь в задачах оптимизации (пофиг чего вообще), так что достаточно легко могу сообразить как например написать программу, которая, например, оптимизирует логистику какой-нибудь здоровенной компании или отфильтровать радиосигнал/акустический сигнал от всякого мусора: эха, интермодуляций, утечек и прочей хрени, или обучить нейросетьубивать всех человековобъезжать препятствия. А вот буквально относительно недавно сделали меня на структурах и организации данных, так-то. Мне правда все равно, т.к. это все равно не мой профиль. В общем я не уверен что смогу успешно работать с хитрыми базами данных, да и не интересно мне это. А в сторону FPGA (тоже ведь прораммирование между прочим) я вообще стараюсь не лезть.
Короче как правильно скрестить человека и задачу — это та еще задача и как я обратил внимание, её не всегда успешно решают.
Ну в общем анализ и проектирование это необходимое условие, но не всегда достаточное для успешного говнокодинга.
А, еще есть определенная категория погроммистов, которые очень быстро обучаются, но у них все равно имеется какой-нибудь серьезный бэкграунд: продвинутый лицей, олимпиады, не самый рядовой вуз.
michael_vostrikov
15.09.2017 15:12Получается, что у программиста должны быть специальные знания.
У конкретного программиста, который делает специальный сайт, должны быть специальные знания. А вовсе не у каждого.
Первое решение, которое может прийти в голову — это с помощью метода map собрать другой массив
Первое решение — посчитать в цикле. А там и до reduce недалеко, если очень хочется. А сложность обоих алгоритмов одинаковая (с точностью до множителя).
kvothe
15.09.2017 22:05Имхо, у программиста должно быть понимание решаемой бизнес-задачи и куда рыть по областям этой самой бизнес-задачи, когда всего не знаешь.
Merlen_Gross
Гораздо важнее уметь разобраться в предметной области в кратчайшие сроки и без посторонней помощи. Как бы полезна информация ни была, всё в голове не унесёшь. Неиспользуемое имеет свойство забываться.
Hardcoin
Есть совсем-совсем базовые вещи, которые нужны очень часто и везде. Утрированный пример — сложение чисел. Да, можно разобраться в предметной области по ходу. Но хорошо понимать, как складываются числа — как без этого?
Более жизненный пример — исчисление предикатов (and, or — это вот оно). Вряд ли есть программист, который не сталкивается с ним каждый день (даже если не знает, как называется). Но людей, которые его толком не знают, я встречал. Выглядит очень странно, почти как программист, не умеющий складывать.
Матрицы и реляционная алгебра нужны чуть реже, но все же плохо было бы их не знать.
AlexGluck
Я админ(или модный devops если угодно) и матрицы с более сложной математикой даже мне нужны часто(каждый второй-третий проект в котором надо написать какой нибудь код, часто автоматизировать что-то). Но в принципе если в школе была сильная математика то 11 школьных классов математики хватит для подавляющего числа задач.
Idot
Знание математики гораздо универсальнее других узких предметных областей, и применимо ко многим другим предметным областям.
CrazyFizik
Да это так.
Причем через некоторое время становится абсолютно по барабану: считать прочностные характеристики зданий, или рассчитывать логистику крупной компании. Можн ос легкостью переходить с задачи на задачу, которые вообще никак друг с другом не связаны.