По-перше: я математик - професіонал (за те, що мені платять за те, щоб робити математику). Я не програміст. Я займаюся деяким програмуванням, але дуже точно з різновидом Cargo Cult (див. Перший коментар до https://tex.stackexchange.com/q/451/86 і моя відповідь) і нічого подібного, що могло б привести мене до цього сайт (дійсно, я зареєструвався тут, щоб опублікувати цю відповідь, побачивши посилання на нього в чаті TeX).
Підсумок моєї відповіді: Математика - це програмування .
Нещодавно я потрапив викладати математичний курс для нематематичної групи студентів. Вони були секцією програмування. Я подумав, що це фантастично! Нарешті, я мав змогу навчити математику людям, які вже розуміли основні ідеї та які вже мали рудиментарний інструментарій для занять математикою. Я був неймовірно розчарований, коли запитав, скільки з них насправді написав програму, і отримав відповідь десь між 0 і 1.
Перш ніж продовжуватись, я повинен уточнити кілька речей. Є сфери математики, які безпосередньо стосуються програмування і пов'язані з оцінкою алгоритмів, класифікацією мов тощо. Я не кажу про них. Існує також програма, яка намагається перевести всю математику на формальну мову, яку можна оцінити за допомогою комп'ютера. Це трохи ближче до того, про що я говорю, але навіть так, щоб зосередитись на цьому, було б пропущено головну частину того, що я намагаюся сказати. Математика, якою я займаюся, та програмування, яке я роблю, майже повністю не пов'язані між собою. Зв’язок між ними знаходиться на іншому рівні.
З чого я хотів би почати - з коментаря до головного питання:
Якщо це займається математикою, то вся діяльність людини є формою математики. Якщо це так, то слово математика не має корисного значення, оскільки його не можна використовувати для відрізнення однієї діяльності від іншої.
Так, це займається математикою. Але "математика" - це все-таки корисне слово, оскільки, як йдеться в пісні, "це не те, що ти робиш, це те, як ти це робиш". Я б сказав, що я займаюся математикою, коли я щось підходжу математично . Іноді це математика "жорсткого ядра": формулювання визначень, доведення теорем. Іноді це не так. Іноді це написання дурних маленьких програм, щоб мої діти могли навчитися написанням слів.
У цьому мені допомагає математика, коли я програмую:
Абстракція Це, ймовірно , найважливіший навик передаватися від математики. Під цим я маю на увазі можливість зняти все зайве і зосередити увагу на важливих властивостях.
Перспектива Якби я міг вибрати лише одне, чого мали б навчитися всі мої студенти, це було б це: Можливість змінити свою точку зору, щоб відповідати проблемі. Ми зазвичай трактуємо це у лінійній алгебрі за допомогою формул, що змінюються (які призводять до жахливих матриць та жахливих ускладнень), але це набагато більше застосовано до цього. По суті, ідея полягає в тому, що тільки тому, що вам щось було представлено одним способом, це не повинно бути таким, як ви працюєте з цим. Це відокремлює погляд на саму річ від того, як вона була представлена. Це може бути надзвичайно практично: справа в тому, щоб зробити щось корисне чи ефективне. Якщо у мене є список векторів, і ефективніше зберігати їх як список x-координат і список y-координат, так і нехай буде .
Форма проти функції, що спирається на вищезазначене; якщо річ може бути представлена багатьма різними способами, тоді вже не справедливо говорити, що одна конкретна презентація - це річ. Повторно процитувати цю пісню: "Це не те, що ти є, це те , що робиш ", що має значення.
Я міг би продовжувати, але це ті, які спадають на думку.
Зараз, мабуть, багато (негативних) реакцій на те, що я писав до цього часу. Одне буде "Це не математика, це просто хороший сенс". (або поганий сенс), на який я посилаюсь на своє зауваження вище, погоджуючись з думкою, що "вся діяльність людини є формою математики". Іншим буде "Це не той тип математики, який має на увазі питання". Це майже напевно вірно, і тут я насправді маю набагато більше співчуття до людини, яка сказала: "Принаймні, я не торкався математики протягом 10 років". Він чи вона помиляються, звичайно, вони займаються математикою протягом 10 років, тому що коли вони писали програму, вони займалися математикою . Вони просто цього не усвідомлювали.
Я фактично використовую деякі "справжні математики" у своїх програмах. Нещодавно я зашифрував забавний дослідник 3D-форми, який використовував математику, щоб визначити проекції та інші перетворення, які мені довелося застосувати до своїх даних. Мене м'яко розвеселило, коли я фактично кодую кватерніони! Але звичайно, математика, якою займалася, була тривіальною порівняно з математикою, якою я займаюся, коли працюю. Це були речі "на звороті конверта". Цей тип математики, то я погоджуюся з думкою, що ти підбираєш її тоді, коли тобі потрібно, і якщо тобі потрібно щось складніше, ніж ти можеш знайти у Вікіпедії, то ти знайдеш справжнього математика, який би це зробив за тебе. Однак для того, щоб ви могли забрати його тоді, коли вам це потрібно, вам потрібно було чогось навчитися. Ця річ може бути не тим, що ви коли-небудь фактично використовуєте, але дізнавшись, що щось полегшує пошук того, що ви насправді використовуєте пізніше в житті. Так що це, де я НЕ згоден з Coder: вам потрібно вивчити деяку математику , якщо ви коли - небудь будете використовувати яку - або математику , і ви повинні вивчити його з математичної сторони (що не означає доведення теорем, до речі).
І так нарешті до "Математики - це програмування". Ви можете навчитися всім цим речам, будучи хорошим програмістом. І якщо ви навчилися цьому, математику ви знайдете набагато простіше, оскільки ви зрозумієте, що коли ми говоримо про вектор у векторному просторі, то це лише екземпляр класу, Vector
що означає, що ми можемо робити все, що Vector
робить для цей приклад: додавання, віднімання, масштаб тощо. Ось чому я б хотів викладати математику програмістам. Але, виступаючи математиком, я б сказав, що першийз них, "Абстракцію", легше вивчити математику, ніж програмуванню, оскільки математика - це прагнення до абстракції. Кожного разу, коли ми бачимо якусь поведінку, ми завжди треніруємо: "Що це за те, що змушує його вести себе таким чином? Що робити, якщо я взяв іншу подібну річ, чи поводився би він так само? хіба мені доведеться втратити, щоб вона перестала так вести себе? " (Доведення цього до крайності призводить до «математики сорокаріччя» - пошук терміна). Але ми не робимо цього з (просто) об'єктами "реального світу" (якими б вони не були), ми робимо це з речами, які вже були абстраговані.
Це тривало досить довго, тому дозвольте мені закінчити один із класичних жартів математиків:
Математик та фізик взяли участь у семінарі за новою моделлю, що передбачає 24-мірний простір. Після цього вони обговорювали це, і фізик зауважив: "Це було справді важко. Я маю на увазі, як можна візуалізувати 24-мірний простір?" на що математик відповів: "О, це легко. Просто візуалізуйте n-мірний простір, а потім встановіть n = 24.".
Додано 2012-03-2
На цю відповідь було досить багато коментарів, що виражали різноманітні погляди. Зараз модератор видалив їх, розуміючи, що я спробую включити їх (або відповісти на них) у своїй відповіді.
Однак я не впевнений, що зможу. Читаючи ці коментарі та інше, що є на цій сторінці, я можу лише прийти до висновку, що існує величезне непорозуміння щодо того, що насправді є математикою. Більше того, я не відчуваю себе достатньо компетентним, щоб пояснити це. На щастя, хтось уже зв'язав Плач Локхарта, тож я відкладу пояснення до цього. Хоча я міг би сказати це інакше (коли я виріс у науковому середовищі, я би робив більше уваги на експериментальній природі математики), я не думаю, що я міг би сказати це краще .
Я все ще думаю, що можу щось додати. А також непорозуміння щодо того , що математика є , є також нерозуміння щодо того , що «робити математику» означає. Я бачу дві майже суперечливі позиції:
Математика - це рівняння та формули. Тож не потрібно її вивчати, оскільки існує Вікіпедія (це майже зворотня апокрифічна виклик Ейлера Дідро ).
Математика - це теореми та визначення. Тому немає необхідності вивчати це, оскільки програми ніколи нічого не доводять (що є настільки ж повним помилкою, як ... вставити сюди улюблену помилку).
У той час як обидві позиції суперечать одна одній, вони опиняються в одному місці: програміст не має сенсу вивчати математику - і, безумовно, не від математика! Зрештою, що вони знають про що-небудь? Все, що дійсно повинен знати програміст, можна знайти у Вікіпедії або пошкодити когось іншого.
Вище я назвав себе програмістом Cargo Cult. Б'юсь об заклад, що більшість із вас власноруч посміхнулася і подумала: "Ага так, я думаю, я знаю, як виглядають ваші програми тоді". Ви, мабуть, відчували себе трохи самодовольним і вищим (хоча я впевнений, що ви почували себе погано, коли почуваєте себе самовдоволеним та вищим).
Що я описав трохи вище, це вантажна математика вантажів.
Тож, коли я кажу, що ви повинні навчитися трохи математики, щоб зрозуміти, як працює математика, я кажу це з тієї самої причини, що і ви, якби ви побачили трохи коду, який я написав: "Наскільки полегшити ваше життя було б, якщо ви зупинили б вирізати і вставити код із StackOverflow і дізналися трохи про те, як це зробити правильно. "
Найголовніше, однак, це те, що ви повинні дізнатися це у математиків. Чому так? Ось аналогія. Мова, якою я найбільше володію, - це TeX. (Каже, це все, справді!). Тепер, припустимо, я хочу дізнатися трохи більше про TeX, і так трапляється, що Дон Кнут перебуває в місті і запропонував дати кілька навчальних посібників про TeX. Або я просто міг прочитати про це у Вікіпедії. А може, це Перл і Ларрі Уолл, або C # (це правильно?) І Джон Скіт. Цілком може бути, що ці люди не найкращі вчителі , але вони впевнені, що це компенсують у тій кількості, яку вони знають!
І ось що таке математики . Ми люди, які пишуть фактичною мовою, які потім пишуть бібліотеки, якими ви користуєтесь. Звичайно, не потрібно знати, як довести теорему - ти не збираєшся писати бібліотеку! Але якщо ви знаєте трохи про те, як ми думаємо, то це може допомогти вам зрозуміти, чому ми написали бібліотеку так, як ми це зробили, і якщо ви розумієте, що це може допомогти вам краще використовувати її.
Існує середина між пошуком рівнянь у Вікіпедії та доведенням гіпотези Пуанкаре, подібно до того, - щоб посилатися на жалобу Локхарта - є середня позиція між "Я насправді не знаю багато про мистецтво, але я знаю, що мені подобається" і будучи Моне, і між "Де клавіша" БУДЬ-ЯК? " і будучи Дон Кнутом. Якщо ви все ще в університеті, то у вас є дивовижна можливість вчитися у людей, які є фахівцями в своїй області і які - чомусь - готові витратити свій час, пояснюючи це вам.
Іншим моментом, який я хотів трохи розширити, було те, чому, як програмісту, ви не повинні боятися вивчати трохи більше математики. Це не глибокі зв'язки, ані корисність. Це те, що ваша здатність програмувати комп’ютер може безпосередньо допомогти вам вивчити математику. Я хочу лише зазначити декілька.
Розуміння змінних. Тому багато людей плутаються з простими твердженнями на кшталт "Нехай n є натуральним числом ...". Або "Нехай епсилон> 0". У математиці є місця, де важливо запам’ятати область змінної. Це все звичайне явище в програмуванні. Навчіться перекладати математичну заяву в програму, і вам буде набагато простіше відстежувати, що до чого.
Характер доказування. Якщо ви коли-небудь писали тест або писали програму, яку повинен використовувати хтось інший, то ви розумієте суть доказів. Виконуючи це, ви повинні знати, що все, що додає користувач, ви можете з цим впоратися (вставте сюди обов'язкові посилання xkcd). Це все доказ! Демонстрація того, що все, що вводить "користувач / всесвіт", заява буде дотримана. Експерименталісти схиляться до "Якщо це працює за звичайних обставин, це правда", але програмісти знають, що завжди є той малюк, який спробує Alt + G + Shift + ÅØÆ, щоб побачити, що відбувається.
СУХИЙ. Вибачте, що вам це порушено, але ми це вигадали, а не ви. Ми «не повторюємось» тисячоліттями. Тому я маю на своїх полицях копію елементів Евкліда, і це все ще корисно .
І є більше. Якби я знав трохи більше про програмування, я написав би книгу під назвою "Математика для програмістів", де метою було не викладання "Математики, яку повинні знати програмісти", а "математики, яку повинні знати всі, але оптимізованої для програмістів". . Але я, мабуть, ніколи не знаю достатньо про програмування, щоб написати його - якщо хтось не запропонує співпрацювати зі мною!
Я залишу його там. Можливо, якби я подумав більше, я змінив би те, що написав; сподіваюся, я поясню це краще. Через місяць я навіть не згоден з частинами цього. Якщо хтось хоче заперечувати далі чи коментувати інше, напевно, краще не робити цього в коментарях тут. Ви знаєте, де мене знайти .