LinuxForum.Fans
Тема

Нужно ли знать математику что бы стать хорошим программистом?

Автор: White_Nelud 112 сообщений 32538 просмотров
#133474
text
s/ \b(\w+) \s (?= \1\b ) //gx;

давеча на УФО обсуждали такой код. сложно объяснять людям, почему этот код (из учебника кстати) отлично работает в тестах, и намертво вешает боевой сервер. Распарсить этот код просто - он находит и удаляет все повторяющиеся слова. Намного сложнее понять, почему он зависает. Для этого надо рыть гранит науки, а именно "Искусство программирования" Д.Кнута. И тут вы обнаружите, что Кнут НЕ решил эту задачу. Он сделал больше - свёл её к другой, уже решённой. Удивительно, но расчёт времени выполнения кода эквивалентен расчёту напряжений и токов в электрической сети. Формулы и правила точно такие же, и выведены Кирхгофом чуть-ли не в позапрошлом веке:
1) сумма токов входящих в узел цепи равен сумме исходящих.
2) сумма напряжений в контуре равна нулю (с учётом знаков).
В простых цепях правила очевидны (на лампочке включённой в сеть 220в напряжение == 220в. Ваш К.О.), в сложных они приводят к системе линейных уравнений, которые научился решать Гаусс (правда китайцы научились чуть раньше - 2000 лет назад).
Проанализировав данное уравнение методом Кнута-Кирхгофа-Гаусса-Китайцев мы узнаем, что время T=C*N*N*M (где C - константа, зависящая от железа, N ср. длинна строки, M число строк). Мы видим, что в тестах может быть строчек было и много, но они были короткие, а значит все наши тесты - коту под хвост. В реальности время намного сильнее зависит от длинны строки, и если длинна будет IRL в 1000 раз больше, то время будет больше в 1000000 раз, что и воспринимается юзером как "зависание". Как видим, тестирование не помогает нам, а помогает лишь матан.

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

не выдаёт к сожалению. если вы пользователь, то можете понадеется на программу, но если вы программист - вы обречены. мелочей тут не бывает, комп железный, умеет только считать, причём считает он плохо (хотя и быстро). Вот вам простой софизм:
1) 2руб*2руб == 4руб. Очевидно.
2) 200коп*200коп == 40000копеек == 400руб. Очевидно для компьютера.
из 1 и 2 следует, что 4руб == 400руб.

Ошибку найдёт любой продавец - рубли не умножают на рубли. рубли можно умножить на проданный товар, и получить выручку. а если множить рубли на рубли получается НЕХ.

#133486
drBatty написал:
1) 2руб*2руб == 4руб. Очевидно.
2) 200коп*200коп == 40000копеек == 400руб. Очевидно для компьютера.
из 1 и 2 следует, что 4руб == 400руб.

гвозди+мыло = шило
40+40=рубль сорок?
:lol:

BIN:
10*10=100
11001000*11001000=1001110001000000
DEC
2*2=4
200*200=40000

И какая здесь очевидность для ПК? когда разряды даже разные, аля 1=100 что ли? oO , как так считать то? чет я не догоняю. oO

#133500

drBatty

В варианте что предлагал я, ошибку бы выдало, это точно.
вот полный вариант.

утверждение a=b
далее домножим каждую сторону на b
ответ ab=b^2
вычтем далее a^2 : ответ ab-a^2=b^2-a^2
далее по формулам сокращенного умножения приводим к такому виду:
a*(b-a)=(b+a)*(b-a) и делим на (b-a)
получается a=b+a
из утверждения a=b получаем:
a=2a делим на a и получаем:
1=2

машина в данном случае выдаст ошибку на месте деления, на (b-a)

А от человеческого фактора вообще много что зависит.

#133506

Я считаю - без знаний математики ты просто девелопер и кодер. А все ПШП кодеры и есть девелоперы. Т.к. ПШП это ПШП
А вот с знанием математики ты уже программист.

#133511
i2ks написал:
И какая здесь очевидность для ПК?

аддитивные величины (например стоимость) нельзя множить. Точнее можно, но они становятся другими. Метр*Метр не выразить в обычных метрах, это не аддитивная, а интегральная величина - площадь. И метры получаются не простые, а квадратные. В некоторых статистических финансовых расчётах встречаются "квадратные рубли", некоторая денежная "площадь". И не надо мне тут двоичной системы счислений. Лучше расскажите, что такое число цифр в этой системе, и что такое - сумма единиц. А я вам потом расскажу, какой в этом практический смысл :)

ormorph написал:
В варианте что предлагал я, ошибку бы выдало, это точно.

это смотря как считать. Hint: вовсе не обязательно при делении на ноль получается исключение, смотря как делить. Может получится и NaN, а может и бесконечность. Пруфлинк.

ormorph написал:
машина в данном случае выдаст ошибку на месте деления, на (b-a)

а вот и нет! оптимизирующий компилятор именно так и обработает вашу ситуацию, и получившийся код будет работать без ошибок. Видите как получается? Быдлокодер написал быдлокод, который приводит к исключению при ошибке. А компилятор его скомпилировал в машинный код так, что исключение потерялось. Это, между прочим, очень распространённый баг. Или другой пример: подумайте, что получится, если ваше а почти равно b?

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

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

#133516
mogul82 написал:
Я считаю - без знаний математики ты просто девелопер и кодер. А все ПШП кодеры и есть девелоперы. Т.к. ПШП это ПШП tongue
А вот с знанием математики ты уже программист.

нет. без знания математики ты не девелопер и не кодер. ты быдлокодер, и всё что ты можешь: говнокод писать.

#133517
drBatty написал:
Лучше расскажите, что такое число цифр в этой системе, и что такое - сумма единиц.

это случайно не к степенным рядам относится? :o

drBatty написал:
А я вам потом расскажу, какой в этом практический смысл

лучше линк на литературку, или в каком направлении копать(в подробности не хочу вдаваться, спрашиваю для саморазвития и не более того)

#133520

вот вам пример плохого кода:

text
if (i == 0 || i == 1 || i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7 || i == 8 || i == 9)
{
  // произвести ещё одну бессмысленную операцию
}

посмеялись? а теперь печальная суть: с именно таким кодом я встречался неоднократно. :[
ну там конечно посложнее, но суть та же: человек не понимает, что вышеописанное эквивалентно i >=0 && i<=9.

#133524
drBatty написал:
Существует специальный новый раздел математики, который решает такие задачи - как на кривом и неточном компьютере получить точный результат. Вы можете этого не знать - но вам тогда не место среди программистов.

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

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

#133526

вот кстати практическая задача:
Дано целое число, которое больше 0. Требуется разделить его на 3.

Показать
Кто написал x = y / 3; ? Садись, два.
Операция деления в десятки раз медленнее операции умножения. Вы быдлокодер.
Предположим, у нас 32х битное железо. В этом случае достаточно не делить, а умножить на 1/3. Или, что тоже самое, на 0x55555555. Этим мы ускорим данный участок кода в десятки раз.
#133528
drBatty написал:
вот кстати практическая задача:
Дано целое число, которое больше 0. Требуется разделить его на 3.

Показать
Кто написал x = y / 3; ? Садись, два.
Операция деления в десятки раз медленнее операции умножения. Вы быдлокодер.
Предположим, у нас 32х битное железо. В этом случае достаточно не делить, а умножить на 1/3. Или, что тоже самое, на 0x55555555. Этим мы ускорим данный участок кода в десятки раз.

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

#133530
ormorph написал:
Приближенными результатами занимаются численные методы, вроде они уже давно появились,

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

ormorph написал:
тут уже применяются свои алгоритмы, например если в качестве числа используется десятичная дробь, то все правильно результат может быть удивительный в данном случае, так как применяется приближенный вариант числа с определенной погрешностью))

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

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

#133532
ormorph написал:
Хм а это к чему, то что операция умножения работает быстрее чем деление, это мне давно известно.

я рад за вас. А почему - известно? Ещё интересно, известно-ли вам, как математики называют алгоритм деления? Уверен, ответ вас удивит. ;)

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

если он не будет изучать математику, он навсегда останется быдлокодером. И многим нравится быть быдлокодером, они себе даже ЯП выбрали: PHP. На нём обычно и быдлокодят (между прочим - сам язык отличный).

#133541

« Человек, не способный к математике, не является разумным.
Этого недочеловека в лучшем случае можно терпеть,
раз он научился носить ботинки, мыться и не сорить в доме. »
— Р.Э.Хайнлайн

#133557
drBatty написал:
нет. без знания математики ты не девелопер и не кодер. ты быдлокодер, и всё что ты можешь: говнокод писать.

Покажите ссылки на ваши программы, так посмотреть хочется.

#133559
mogul82 написал:
Покажите ссылки на ваши программы, так посмотреть хочется.

не могу. госбезопасность ;)

UPD ничего нет там интересного. немного быдлокода есть конечно, если вы про это. с кем не бывает? иногда очевидные вещи не замечаю :(
а делить на ноль я умею. Очень хорошо между прочим.

#133568
drBatty написал:

2) 200коп*200коп == 40000копеек == 400руб. Очевидно для компьютера.

Ай-я-я-й :-)

200коп*200коп == 40000коп^2.
Также как и 200м * 200м == 40000м^2.
А вот зачем она, "квадратная копейка" -- другой совсем вопрос :-)

#133579
bormant написал:
Ай-я-я-й :-)

ага. так-же как 2р*2р = 4квадратных рубля.

#133588
drBatty написал:
если он не будет изучать математику, он навсегда останется быдлокодером. И многим нравится быть быдлокодером, они себе даже ЯП выбрали: PHP. На нём обычно и быдлокодят (между прочим - сам язык отличный).

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

Войдите или зарегистрируйтесь, чтобы ответить.