Murchik пишет: |
меня всегда интересовал вопрос разницы (здесь и далее — грубо говоря) научного и инженерного способов мышления и решения задач. Будучи больше из второй категории, и периодически сталкиваясь с решениями, созданными научно-ориентированными людьми, невозможно не заметить огромную разницу... Ближайшая аналогия, которая приходит на ум, это разница между искусством и ремеслом. А как это выглядит с той стороны баррикад? |
Да я, наверно, в большей степени с той же стороны баррикад — больше программист, чем математик (хотя заканчивал кафедру алгебры, что ближе к математике, хотя компьютерная алгебра тоже очень развита). Скорее в голове есть какой-то набор математических утверждений (типа множителей Лагранжа в задаче условного экстремума или более общей теоремы Куна-Таккера, или каких-то простых утверждений из теории чисел, аналитической геометрии, линейной алгебры и т.п.), которые применяешь на практике, когда пишешь программы. (Например, решаешь систему уравнений, дифференциальных или обычных, полученных в неявной схеме, с ленточной (k-диагональной) или другой разреженной матрицей, которая решается за время O(n) обычным методом Гаусса, не за O(n^3), как в случае произвольной матрицы. Я в таких случаях всегда пишу на C++ класс для таких матриц, а обычные математики, скорее всего, просто напишут на C функцию, которая решает подобную систему для этой конкретной задачи.)
Да, я вижу одну разницу между больше математиком и больше программистом. Больше математики пишут реальные задачи на языке C (и очень любят параллельные вычисления на кластерах и т.п., при этом ненавидят объектно ориентированный стиль программирования). Больше программисты (как я, например) обожают красивые программы (к чему чистые математики равнодушны), предпочитают язык C++, классы и более универсальные (плюс более красивые) решения, для них самоцель скорее не сама задача, а изящество программы, красивый и понятный текст и т.п.
И я сам пока что не писал серьезных параллельных вычислительных программ для вычислений на кластерах (не считая совсем уж элементарных учебных). Хотя в обычных программах нити и объекты синхронизации (всякие мьютексы, эвенты, условные переменные, критические секции и т.п.) использовать постоянно приходится. Но в реальных задачах, которые сводятся ко всяким дифф. ур-ям в частных производных, сейчас обойтись без параллельных вычислений (с применением архитектуры MPI) и кластеров невозможно.