[HN Gopher] The Mathematical Hacker (2012) ___________________________________________________________________ The Mathematical Hacker (2012) Author : andsoitis Score : 124 points Date : 2022-12-23 17:33 UTC (5 hours ago) (HTM) web link (www.evanmiller.org) (TXT) w3m dump (www.evanmiller.org) | dekhn wrote: | I use math with computers all the time; have since pretty much | the beginning of my programming experience 35 years ago. But I | don't use it well. I depended a lot on other people to convert a | mathematical equation into a program (for example, think of a | summation-- that's really just a for loop incrementing an | accumulator. And an integration isn't much more than that, just | divide by a constant at the end). I learned gravitational | simulations that way (amusingly, I was able to do mandelbrot on | my own knowing just z = z ** 2 + c and brute forcing myself | through the details). | | For me math is more of a received wisdom. I'll have a problem I | need to solve, and as part of that, I need to compute some | function. But the naive version of the function that I was taught | (say, factorial function) is slow, and might fail because of | integer data types outside their range. In comes my professor, | who mentions | https://en.wikipedia.org/wiki/Stirling%27s_approximation which | allows me to complete my project and graduate in time. Said | professor also derived analytic derivatives of our objective | function, since at the time (1993-4) we didn't have | autodifferentiation. | | At the time, I didn't really think too much about it. I had a | problem and somebody handed me a practical solution. But I got | curious... what was this gamma function and why is it defined | over floats (reals!) over integers? And so that led down a rabbit | hole of mathematical exploration (most of which was executed | using a highly worn copy of Mathematical Recipes in C). | | Another example is the mandelbrot set. You can take the raw | definition and attempt to compute set members but your | calculation will never complete. Instead, clever math people | figured out ways to compute an approximately right answer faster- | and in some cases, optimized for the limited hardware of the time | (see FRACTINT for an integer-based fractal program for x86 | machines pre-floating point hardware). This and many other tricks | made fractal exploration on consumer hardware practical (although | probably not very useful?) | | Over time I've come to be better at math- at understanding | concepts- and the relationship between practical high performance | computing and both the underlying math and physics that are | required to do it effectively. I've learned so many different | ways to approach problems compared to when I started, much of it | because I continued to learn more math, and practice at it. I see | a close relationship between computing theory and the | math/physics that enabled it (IE, transistors and vacuum tubes | before them, and mechanical gears and switched before that). | | I've also realized that I can learn some math easily- for | example, more or less anything on a cartesian grid- while other | things, like complex symbolics or tree structured algorithms- | take a lot more thinking. | | To me it's an endless world of unknown delights that I stumble | across and periodically take 20+ years to understand. I am _just | now_ solving problems that my smarter grad school friends managed | to do in a day, 20 years ago, because they 're better at math | (and logic, and memory, and more...) | hintymad wrote: | > They seem to agree on one thing: from a workaday perspective, | math is essentially useless. | | The creator of Dilbert advocates stacking, namely learning | multiple skills and combining them to achieve better results than | any single skill can. His advice applies to maths as well. I work | on distributed systems as a generalist, yet I find maths, time | and time again, career changing. A few typical examples: queuing | theory that helps improving latency of my services by more than | 10x. Statistics to identify patterns in data, which led to a new | product. Time series analysis that led to a new system. Data | mining and information retrieval in search and recommendation for | continuous improvement of my search product. Linear algebra, | calculus, and combinatorics as foundations to identify or prove | certain properties of my systems for later optimization. And in | general, the ability to understand papers (or at least know what | to learn to unblock myself) to stay on top of what's going on in | exciting fields. | | One does not necessary need maths to build systems, but boy it is | satisfying and career-rewarding when I actively look for real | problems that scream for some maths. What's most amazing is that | we don't even need graduate-level maths. Entry-level college | maths play wonders most of the time. | bmitc wrote: | In Steve Yegge's linked post: | | > Math is a lot easier to pick up after you know how to program. | In fact, if you're a halfway decent programmer, you'll find it's | almost a snap. | | This couldn't be more wrong. Mathematics is the hardest thing I | have ever done. I'm sorry, but mathematics is orders of magnitude | more intensive and difficult than most programming. A simple fact | that shows this is the amount of programmers who have no formal | training in engineering or computer science but we're able to | self-teach the concepts. The same cannot be said of mathematics, | which requires deep, dedicated study. Most programmers I know | know very little mathematics, and it's not like I'd claim I know | a lot either. I've forgotten more than I know. | | He even mentions how little math he took, so I'm not sure he's an | authority on the subject. Most of his post is just surface level | platitudes. I'm generally confused why I see his posts referenced | so frequently. | | To be clear, this isn't some attempt at gatekeeping. It's just | that mathematics is a very deep, difficult, and misunderstood | subject. I think maybe only true philosophy is harder because | there, it's usually not even clear what the questions are. | jjtheblunt wrote: | He might be describing one bifurcation in the world of math, | where constructive proofs reign, but overlooking | nonconstructive "existence" proofs. | strangattractor wrote: | Implementing numerical solutions for math concepts can give you | insight into the math ex. Newton-Raphson Method or FFT. I would | not sell yourself short on being able to understand. You may | not be skilled at doing all the symbol manipulation required | for what people consider typical "math" but that does not mean | you cannot understand it. | bmitc wrote: | I do agree that programming is very useful as a medium of | exploration, a la what you said. I really like how the book | _Turtle Geometry_ approaches this. But that is really | something different than what the quoted text is attempting | to get at. | | > I would not sell yourself short on being able to | understand. | | I have a master's in mathematics and have continued to take | courses while working full-time. It's just that I'm more than | aware of the amount of mathematics I do not know compared to | an active graduate student in mathematics and above. Or maybe | you meant the royal you. | bee_rider wrote: | What do you mean by "learning Mathematics?" It should be notes | that significantly less than 50% of the US population even has | to learn _calculus_ so getting into the stuff that most people | would consider pretty advanced is not so hard, right? | | I'd be curious what people's coolest math tricks are that | they've used at work. I did like one Taylor Series expansion | and felt cool for a week. | dinkumthinkum wrote: | You are right about the 50% but you might as well have said | "fewer than 99%". I mean, the real number is far, far less. A | very small percentage of US residents would recognize and | calculus or be able to solve a simple linear equation. | zozbot234 wrote: | Never mind calculus; a non-trivial fraction of the U.S. | population has trouble learning _elementary algebra_. The | fact that the U.S. K-12 educational system is notoriously a | failure compared to otherwise similar countries should not be | used to draw inferences about the inherent worth of any | particular subject. Not least because that same system also | often fails to teach functional literacy, or any amount of | basic facts about society that may elsewhere be assumed to be | known by any educated adult. | subradios wrote: | Then why do all New England states outcompete most European | countries? | | Why is most STEM research produced in Eastern Europe, the | US, or China? | | This really depends on what metrics you are using and has | infinite room for gaming. | | US undergrads (both native and foreign born) absolutely | crush all of these nondescript places you are suggesting | are better, and graduate programs make the gap even wider. | | A non trivial fraction of those are educated K12 in the US | system. | zozbot234 wrote: | U.S. undergrads have to complete "general educational | requirements" that are taken care of in high school in | practically every other developed country. Why does that | happen? Because U.S. colleges don't trust K-12 to provide | a satisfactory education. | texaslonghorn5 wrote: | or that there's value in a college level comprehensive | education as well | zozbot234 wrote: | All other things being equal (including quality), high | school is actually _better_ than college at doing the | "comprehensive education" thing. College level gen-eds | are almost universally reviled as a pointless box-ticking | exercise that gets in the way of specialized education. | This particular dysfunction has effects even further out; | U.S. college education pushes things out to the grad | school level that are elsewhere part of the later years | of undergrad. | bee_rider wrote: | New England is mostly sanely governed, it shouldn't be | used as a stand in for the rest of the country. | | The US was a neat idea we had but it went a little off- | kilter around the second half of Pennsylvania. | kvathupo wrote: | I'd agree: there's a common misconception that math is | "objective." Even if one agrees on the axioms (Axiom of Choice | [1]), one must reach consensus on definitions, which seem to be | consciously chosen to allow generalization of theorems to more | mathematical objects; that is, building connections between | previously disparate fields of math, e.g. algebra and geometry, | calculus and geometry, etc. Why have many domain-specific | theorems when we can have one? | | One could have a valid proof to a theorem, but there's the | human element of having people understand and accept the | result. | | That said, I think when people speak of math, they speak of its | application to the real-world, not the proofs. | | [1] - From the Wikipedia page for the axiom, Jerry Bona has an | amusing quote: "The axiom of choice is obviously true, the | well-ordering principle obviously false, and who can tell about | Zorn's lemma?" | JadeNB wrote: | > That said, I think when people speak of math, they speak of | its application to the real-world, not the proofs. | | I think it very much depends on who the people are. I'm a | math teacher, and, when I speak of math, I definitely don't | just mean its applications to the real world. I definitely | think programming--in the sense of thinking about the craft, | not just cudgelling the computer into doing what one wants-- | is good preparation for learning the proof-theoretic arts of | mathematics. | kccqzy wrote: | I learned Haskell before I learned to write proofs. And yes it | did help. | | But no I don't think experience doing boot camps and churning | out React apps and gluing together APIs would help with | learning mathematics. | | Go learn a language that seriously challenges you like Haskell. | starwind wrote: | Math hard. Can confirm. Starwind have math degree. Starwind | much better at programming than Starwind ever was at math. | shankr wrote: | I spend 5 years doing mathematics and still can't wrap my | head around lot of maths. If you really want to see the | difficulty in Computer science you'll have to go explore the | theoretical stuff which at the end is just maths. | tombert wrote: | I think Yegge is actually completely correct. I started to | learn to program when I was 14, and once I understood the | concept of functions, I found it much easier to do my calculus | and physics work. Fundamentally I understood how to break | things down into computable steps. | | Granted, I think get the impression we might be overloading the | term "mathematics". | BeetleB wrote: | For most mathematicians, calculus as is often taught in | typical undergrads is not "true" mathematics. It's just a | tool for computation. For them, calculus is analysis | (theorems/proofs that are used to build up calculus). | | So my question is: Did you study analysis and would you | credit programming in helping you get good at it? | edgyquant wrote: | Not them but I def would. I built a fintech/econometric- | lite system in python years back and it was mostly just | taking in a ton of "obvious" knowledge and realizing the | cool stuff you could do in practice | c0balt wrote: | +1 for this comment. Calculus, i.e., Calculating with | mostly finite numbers and (usually) a known set of well | defined rules is only a part of mathematics. | | As a student that currently learns Analysis and linear | algebra, it is far more complex and abstract than calculus. | It is not neccessarily harder to learn but different. And | adapting to this paradigma takes time (and effort). | | It is similiar to learning Assembley as a Python developer. | Knowing Python will help with Assembley. But the levels of | abstraction are obviously different and will require a lot | of learning. | bmitc wrote: | Mathematics is not just functions and calculus. | | And it seems to me that you learned the concept of functions | through programming first but that there's not evidence that | you couldn't have learned it from mathematics at first. | Functions are a pretty easy concept, so I think it's pretty | easy to introduce it from a variety of points of view. So I'm | not sure the anecdote backs up any argument about learning | programming makes mathematics easy. | | I am of the opinion that programming can be _used_ to explore | and learn mathematical ideas and am a big proponent of that, | but that is something different than "I know how to program | so mathematics will be easy now". | dekhn wrote: | functions in traditional programming and functions in math | are two different things entirely. They should have been | called procedures (I think there's historical debate about | this but I can't find the reference). Obviously, functional | programming is an attempt to address this. | edgyquant wrote: | I grew up programming (from 10 or so) and couldn't agree | more. I have almost no formal education yet I've picked up | enough math to do ML and (mediocre) cryptography and keep up | with people who have scary sounding degrees. in the process | I've fallen in love with math and think as programmers we | haven't been meeting mathematicians half way. | constantcrying wrote: | For me the opposite was true. My mathematical education made it | incredibly easy to pick up programming and programming | languages, everything was somewhat familiar and the concepts | just came naturally. | dekhn wrote: | How did you feel when you first came across a global | variable, or even a pointer? It seems to me that math-first | people would probably find C to be an abomination. | constantcrying wrote: | I believe one thing which came really natural was to think | in virtual machines, to see a programming language as | something which acts upon a fictitious environment, where | certain instructions map to certain consequences. Of course | programming and mathematics are very different activities, | but one core principle that I always relied on was thinking | in abstractions. What option do I have to manipulate the | environment and what invariants are there? How are complex | thing constructed out of others? | | >It seems to me that math-first people would probably find | C to be an abomination. | | I certainly don't. You might do so if you wanted | programming to be an expression of pure mathematics, but I | do not think that is the right approach. C does well for | what it is an abstraction over an underlying, real machine | and thinking of it as an abstraction is the right thing. | bmitc wrote: | Most definitely. For me, I have never used any specific | mathematical concept in programming aside from some side | projects for using programming to explore mathematical ideas. | But my so-called training in mathematics taught me both | highly abstract thinking and deep, concrete, in the weeds | thinking, and that's what really comes in handy in | programming. | BeetleB wrote: | Technically, that's the converse, not the opposite ;-) | | Someone may be led into thinking you're countering the OP. | quantum_state wrote: | If I may, would like to add that the statement is not even | wrong ... | edgyquant wrote: | I disagree because Math _is_ programming. All those symbols you | see map to a set of steps (a program.). It's just knowing what | subroutine every esoteric symbol stands for that's hard. | | I will agree it's been more difficult learning math than | programming for myself as well: but that's because math is | geared and targeted for people who like doing symbolic logic by | hand. Math people think we're a level below them (we are in | some ways from a working perspective) so they tend to write off | complaints like this as us just wanting to make math more like | programming. | | The fact we don't have a nice and intuitive way of writing math | via a keyboard is proof that these two fields, which should be | tightly coupled, are not on the same page. | BeetleB wrote: | I think the math you've been exposed to is mostly on the | computational side (compute an integral, solve an equation, | etc). | | Much (most?) of math is quite different from it. Proving that | there is a well ordering of the reals, and simultaneously | proving that it is impossible to _show_ you such an ordering: | Very different from skills needed in programming. | edgyquant wrote: | I disagree. You're only able to prove that ordering of the | reals (and that it's impossible to show) because you are | computing the abstract structure underlying the reals | (which is based on some lower level ideas etc.) Just | because a problem is computationally hard with a step by | step CPU doesn't mean it isn't computation. | | This is actually a problem of interest to me, so I've | definitely been exposed to it and the limits of modern | computation. But I'm not speaking strictly about the modern | day CPU. | bmitc wrote: | > You're only able to prove that ordering of the reals | (and that it's impossible to show) because you are | computing the abstract structure underlying the reals | (which is based on some lower level ideas etc.) Just | because a problem is computationally hard with a step by | step CPU doesn't mean it isn't computation. | | The set of computable real numbers is countable and thus | has measure zero. In other words, almost all real numbers | are non-computable, and almost all has an exact | definition. | | So you can't compute the real numbers unless you're | meaning something else by computing. | bmitc wrote: | > Math is programming. | | That doesn't make any sense. What do you mean by that? | | > I agree it's been more difficult learning math than | programming for myself as well: but that's because math is | geared and targeted for people who like doing symbolic logic | by hand. | | Mathematics is not about symbolic logic. Mathematics is the | study of idealized structures, their properties, and their | relationships. Symbols are just a convenient shorthand. They | are not the mathematics in and of themselves. | | > The fact we don't have a nice and intuitive way of writing | math via a keyboard is proof that these two fields are not on | the same page. | | What does that have to do with anything? Although LaTeX and | the like are pretty decent at it, there's a lot of things we | can't do easily via a keyboard. Why is that a constraint on | anything or relevant? | | Not trying to be provocative, but I honestly have little idea | what you're talking about. | constantcrying wrote: | >All those symbols you see map to a set of steps (a program.) | | Simply not true. Most mathematical statements, e.g. proofs of | existence have no relation to a "program". | | >math is geared and targeted for people who like doing | symbolic logic by hand. | | No, it is not. There is absolutely nothing interesting about | symbol manipulation, it is always the least interesting part | of a proof. It usually is the part the author handwaves away, | while focusing on the actual interesting parts, the idea | behind the proof and the possible intuitions for them. | Textbook might include them, but as training and because you | need to be more explicit when teaching. | zozbot234 wrote: | A constructive proof of existence is _exactly_ a program. | (It might not always be a program for a Turing machine, | because "constructive" and "computable" are not exactly | the same - but that's beside the point.) Even a non- | constructive proof of existence for _x_ can be significant | in a programmatic context; it tells you that you can posit | an oracle for _x_ (e.g. asking for it to be input by the | user, introducing further assumptions based on some special | case, etc.) without thereby crashing the program or causing | it to behave incorrectly. | constantcrying wrote: | >but that's beside the point | | It seems to me that it is an important point though. | | > Even a non-constructive proof of existence for x can be | significant in a programmatic context | | Which has no relation whatsover to proofs and programms | being the same thing. | zozbot234 wrote: | A type-level program is still a program. Non-constructive | proofs are addressing the question "will this program | crash or go wrong if I extend it to do X, regardless of | how I achieve that?", which is exactly the domain of | type-level programming. | edgyquant wrote: | >Simply not true. | | Okay. What is a proof other than a step by step explanation | for why something's true? You're getting caught up in | "program" when it's objectively the case that all math | follows a series a steps. A lot of those steps are | "handwavy" I'll give you that. That's not relevant to what | I said though. | | >there is nothing interesting about symbol manipulation | | Cool. You missed my entire point again. Math education is | geared towards a certain set of people who pick up on (and | gain an interest in) the language of math. Only once you | get to higher level math do you even start to get | alternative visualizations etc (at which point you've | weeded out a ton of people who would have benefited from | e.g. visualizing numbers as groups of shapes). There are a | million ways to teach math and we're leaving a lot of | people behind. That was my point | constantcrying wrote: | >Okay. What is a proof other than a step by step | explanation for why something's true? | | Cooking instructions are a series of steps as well. Would | you also claim cooking, mathematics and programming | really are all the same thing? | tsss wrote: | If you want to get technical then programming is also math, | provably so. | dysoco wrote: | > mathematics is orders of magnitude more intensive and | difficult than most programming | | But what level of programming and mathematics are you comparing | here though? because college-level algebra and calculus is | really not that hard imho (once it "clicks" for you, but it's | the same for programming), and if we are comparing math as in | what you see in a BSc/Msc of Mathematics (or research-level) | then I agree it's hard but you have to compare for an | equivalent level of programming. | | > simple fact that shows this is the amount of programmers who | have no formal training in engineering or computer science but | we're able to self-teach the concepts. The same cannot be said | of mathematics | | I would blame it more on the fact that programming is a very | useful tool for people outside Computer-Science, it has very | direct applications and you can monetize it very easily, so | it's very likely that they might want to learn it, however, | rarely you see someone deciding to take Calculus just for the | sake of it if they never bothered with it in College. | | Overall I agree with you, but personally I find math more | difficult, most people probably do but I don't think it's | inherently more difficult, it's just that people are less used | to study it. | nickelpro wrote: | I would hard disagree that undergrad level Analysis or even | just the trickier corners of vector calculus are within the | bounds of what programmers can easily pick up without | dedicated and guided study. Everybody's gangster until they | have to parameterize some bullshit helical structure in R3. | | Comparable levels of programming, what we expect of CS | juniors, are regularly picked up by "the guy who is good with | Excel" in office settings as it's mostly a function of | experience and exposure, not theory. | | And now my worthless anecdotal evidence: I self taught myself | into professional programming and it was a simple matter of | banging my head against a wall until shit started working. | The feedback loop, "did the thing crash or not", permitted me | to learn on my own. I wouldn't even begin to understand how | to self-teach myself Stokes Theorem or some shit, and have | zero ability to author the proofs required to reach the | conclusions higher level mathematics are built on. | zozbot234 wrote: | > I wouldn't even begin to understand how to self-teach | myself Stokes Theorem or some shit | | Input it into a proof assistant, and rely on the same sort | of feedback "does the computer accept your proof, or get | stuck". The hard job of formalizing stuff for this purpose | has seen significant progress, e.g. by the Lean mathlib | project. | nickelpro wrote: | I would quibble with whether this is exactly equivalent. | | In programming I knew I needed to sort a list or find a | most efficient path because some practical problem I was | trying to solve demanded that I do that. Frequently I had | a basically crap but working independent solution before | I learned the names "EWD" or "A*". I independently | discovered that I needed virtual interfaces (before I | knew them by that name, "I wish pointers to parent | classes could call implementations in subclasses") _and | then_ discovered language facilities for polymorphism and | OOP. | | Without formal or at least guided instruction I would | never think to move towards or discover "I wonder if | there's a relationship that makes these double integrals | of curls of vector fields easier to solve for". | | Programming has a high coupling between necessity, | experience, and theory. In mathematics that coupling is | much, much, much looser. Self learners in programming | regularly re-discover and re-implement, typically less | efficiently, all sorts of fundamentals of CS. The | equivalent in mathematics rarely happens post-algebra. | nextos wrote: | I think your comparison is a bit unfair. Essentially, CS | is as hard as mathematics because _it is_ mathematics. | | For example, take any good static analyzer that | implements abstract interpretation. It generally works | using Galois connections, which is just abstract algebra. | | Dijkstra's algorithm or A* came pretty early in the | history of CS. It would be fair to compare their | difficulty to something similar in mathematics, say some | basic results in Euclidean geometry. | nickelpro wrote: | CS may be mathematics but programming certainly isn't | | If you're discussing pure CS, the thing you can write | down in a book and for which a computer is a largely | theoretical device, sure CS is mathematics. | | If we're talking about the practical reality that CS | majors in America today are trying to achieve, and their | undergraduate programs are trying to prepare them for, | that's becoming a working programmer and has very little | relation to mathematics. | JadeNB wrote: | > Input it into a proof assistant, and rely on the same | sort of feedback "does the computer accept your proof, or | get stuck". The hard job of formalizing stuff for this | purpose has seen significant progress, e.g. by the Lean | mathlib project. | | As a math teacher who disagrees with the premise of the | GGP post ("This couldn't be more wrong. ... I'm sorry, | but mathematics is orders of magnitude more intensive and | difficult than most programming"), and thinks that any | _good_ programmer can learn mathematics--of course there | are code wodgers out there who don 't really understand | their craft of programming, and so can't translate that | knowledge to facilitate an understanding of mathematics-- | I think I also disagree with this. I've never tried it, | but I can't imagine someone learning about Stokes's | theorem in anything like this way. One of the many axes | along which I imagine this failing are that the state of | human readability in proof assistants is, well, let's say | it's less well developed than the, cough, stellar state | of the art in compiler error messages. | | But, more importantly, you can, at least in principle, | know every single step in a proof of Stokes's theorem | without understanding in any real sense _why_ it 's true | --and a proof assistant in particular will force you into | the weeds of minutiae that absolutely do not help to | build any intuitive picture--and, even if you manage in | the process to piece together that understanding of why | it's _true_ , you will never thereby gain an | understanding of why it's _interesting_ (e.g., among | other things, its connections to physics and the entree | it offers to differential geometry). | zozbot234 wrote: | The flip side of a proof assistant's 'minutiae' (and | there's plenty of room to disagree wrt. whether paying | attention to those minutiae helps with gaining a better, | more accurate intuition!) is its ease of refactoring a | proof. A proof assistant can instantly tell you whether a | seemingly nicer, better-abstracted proof B really manages | to prove the same thing as proof A, something that's very | hard to do without the use of precise formalized | statements and automated checking. | dinkumthinkum wrote: | Self teach Stokes Theorem by inputting it into a proof | assistant? Are you serious? That is very inefficient; the | OP was talking about learning the kind of vector calculus | taught in first calculus sequence. I think just watching | a short YouTube video and doing a few exercises will work | and is a proven method. Proofs of theirebs are very often | much more complicated than applying them (understatement | intended). | dysoco wrote: | Do you have more information on this approach? Sounds | very interesting. I've read and toyed a little with | things like Lean and I'm interested in that field but the | barrier seems a bit high (without pre-existing knowledge) | to just "input" a theorem and toy with it. | anthk wrote: | Read The Computational Beauty of Nature and compile the | associated examples: | | https://github.com/gwf/CBofN | conformist wrote: | Feels like the "modern" data science & python hacker/plumber is | typically closer to the Fortan and linear algebra side these | days? | cod1r wrote: | CS/programming for me was a good balance between practical | application and theory. Spending more time programming and | getting better at programming will probably land you a higher | salary than if you were to spend your time learning complex math | which you might/might not use. | magicloop wrote: | When I first was learning to program I was shocked at the logical | mistakes and errors I was making. I thought these were an initial | bout of bad luck that would pass. But no! And I learned the craft | of debugging before my programming hobby took could really take | off. | | Programming takes high precision thinking. Learning mathematics | is what has tuned my mind to better, more precise, thinking. So I | am grateful for this and feel I am a much better programmer for | it. It also seems to sharpen up ones debugging skills. | | There are other things that help also. Second, I'd say learning | to write well helps a lot also. Programming is communication (by | way of the source code you leave behind for others to read and | interpret). A deft hand for exposition sits at the centre of good | naming practices for code. | wwweston wrote: | > Rather, mathematics is a tool for understanding phenomena in | the world: the motion of the planets, the patterns in data, the | perception of color, or any of a myriad things in the world that | might be understood better by manipulating equations. | | OK, so on one hand I love this point, and I'd love for it to be | more broadly understood and appreciated, especially since my | educational background is Mathematics and my CS has been | practical, half self-taught, and frankly patchier than I'd like. | | But: | | > Fortran-school programmers view the computer as an advanced | tool for doing mathematics. | | If we're understanding "mathematics" as numerical/analytical work | + engineering ( _maybe_ applied mathematics) I can see this. | | But the Lisp programmer talking in terms of recursive fibonnaci | definitions is doing something that can quite adequately be | described as mathematics, though it's also mathematics to figure | out the closed form and understand why you might or might not use | it. Not sure if it's mathematics to simply know a given closed | form, though it's something mathemeticians sometimes do. | | And I'm more skeptical that Lisp programmers _don 't_ do all this | stuff: recursive demonstrations of fibonacci numbers are usually | in textbooks _to teach recursion_ rather than present an optimal | way of computing fibonacci numbers, because it 's simpler than | starting with dynamic programming, and you're gonna need | recursion to effectively solve _some_ problems. | | Not only that but a higher level, I think that a lot of | developers (Lisp included) are already reaching into the very | mathematical skills of domain modeling at one level or another -- | often first with a different set of tools than a mathematician | might bring, but a similar kind of work. If Miller's overall | point is that we all could do a better job with more of a | mathematician's tools, I agree, but then again as someone who | came into industry with a math undergrad's tools the utility of | those might be overemphasized here. | | Or maybe I just don't appreciate what I already have. | userxyz wrote: | I think the author is making two points among others: | | 1. LISP based text/books always present the same two cliche | examples | | 2. They never go beyond (1) given how much they talk about | recursion. He mentions sqrt of 5 in the explicit formula of | Fibonacci sequence and how that could be explored in more | detail to find out where that comes from. For that you need to | know [0]. That's part of a larger suit of theorems on | sequences. This stuff together with theory that surrounds the | Gamma function can easily take up a whole book. But there are a | ton of books that treat either one really nicely: most | textbooks on discrete math and real analysis. | | [0] https://ibb.co/TR1f5Gz | zozbot234 wrote: | Non image-based link: https://en.wikipedia.org/wiki/Linear_re | currence_with_constan... (Also, | https://en.wikipedia.org/wiki/Constant- | recursive_sequence#Cl... ) | userxyz wrote: | I see someone disagreed with me. Not sure about what, but | just in case I will show how to derive a formula for | Fibonacci using the above. You be the judge if it belongs in | a LISP programming textbook, even though this particular | result is very elementary. | | Recurrence relation for Fibonacci is F_k = F_(k-1) + F_(k-2) | for k=> 2 with F_0 = F_1 = 1. Also, t^2 - t - 1 = 0 implies t | = (1 + sqrt(5))/2, (1 - sqrt(5))/2. Both of these facts | satisfy the conditions of the linked theorem and so we have | F_n = x((1 + sqrt(5))/2)^n + y((1 - sqrt(5))/2)^n for n=>0. | | Now F_0 = x + y = 1 and F_1 = x(1 + sqrt(5))/2 + y(1 - | sqrt(5))/2 = 1 from which it follows that x = (1 + | sqrt(5))/2sqrt(5) and y = -(1 - sqrt(5))/2sqrt(5) meaning | | F_n = (1 + sqrt(5))/2sqrt(5)((1 + sqrt(5))/2)^n + (-1 + | sqrt(5))/2sqrt(5)((1 - sqrt(5))/2)^n. | | This math (complete with a universe of theorems and their | proofs) can obviously be extended in many different | directions in such a way that it can take over your whole | book. | graycat wrote: | I was a "programmer", and well paid at the time, but also had a | good background in ugrad plus some in pure/applied math. | | The math helped, was enough help to be a crucial difference and | put me way ahead of the pack, that is, everyone else around. The | math I did was to solve problems in the job I had. The job was as | a programmer or other computer guy title, but I saw the problems | and used math to attack them successfully. | | So much for some generalizations. Some examples are needed: | | Example 1: One afternoon Fred Smith, founder, COB, CEO of FedEx, | stumbled out of his office, tired, frustrated saying "we need a | computer". He had just been trying to schedule his fleet of | airplanes. Soon the BoD was also concerned, so concerned that | crucial, necessary equity funding was seriously at risk. | | A guy I knew in ugrad physic class called me. At the time I was | being a computer guy at Georgetown U. and also teaching courses | in computer science. Several of us met in a conference room in | the library to discuss what to do about the scheduling. There was | lots of noise. Finally I announced that I would design and write | the software. I got an account on a time sharing service offering | CP67/CMS (VM/CMS) computing and wrote the software in my favorite | language, then and now, PL/I. | | Later in Memphis, one evening SVP Roger Frock and I used my | software to develop and print out a schedule for the full planned | fleet. The next day two representatives of Board Member General | Dynamics went over the schedule and announced "It's a little | tight in a few places, but it's flyable." The BoD was happy, and | the funding came. Smith's remark was that the schedule "solved | the most important problem" facing the company. | | Role for math? Apparently I was the only one around who could see | that calculations of great circle paths was just the the law of | cosines for spherical triangles and to do the vector calculations | to handle winds. | | Right, not much math was involved, but the math was crucial, and | I was the only one around who had it. | | Example 2: At Georgetown a computer science prof got some public | code for some statistical operations, wrote a main program to | call that code, and used the result in teaching a course in | statistics. In his testing, three of the public routines had | problems. Two of the problems I fixed with just some PL/I tricks | with memory and some algorithms from Knuth. For the third, there | were numerical problems, and I solved those with a version of | orthogonal polynomials. Not much math, but the math solved the | problems the prof saw, and I was the only one around who knew | that math. | | Example 3: I was in a software house, part of KMS (early | connection with laser fusion), and bidding on some software the | Navy wanted. Part of the work was Nyquist sampling, the fast | Fourier transform (FFT), power spectral estimation, digital | filtering, etc. I had been working close to all that due to | working with the FFT, got the Blackman and Tukey book on the | statistics of power spectral estimation, quickly wrote some | sample code, in PL/I, illustrating how to do much of what the | Navy wanted in the bid, showed the code and its output to one of | the Navy engineers, and presto, bingo KMS got coveted "sole | source" from the Navy. My work with the math put our software | house far ahead of the software houses we were competing with. | | Example 4: The BoD at FedEx wanted some revenue projections. | People around the office had hopes, intentions, dreams, etc. but | nothing rational or convincing. We knew the current revenue and | the revenue from the full, planned fleet. So, the projections | were an interpolation between those two. Argue that the revenue | would grow by current customers influencing customers to be so | that the rate of growth would be proportional to the number of | current customers doing the influencing and the number of | customers to be being influenced. So, at time t, let the revenue | ($ per day) be y(t), the current time t = 0, the current revenue | y(0), and the planned revenue b. Then for some constant of | proportionality k, we should have | | d/dt y(t) = y'(t) = k y(t)(b - y(t)) | | So, this is a first order, linear, ordinary differential equation | initial value problem. There is a closed solution based on, | right, exponentials. It is just calculus to solve the equation. I | did that, picked a reasonable k, drew a graph, and, ..., in short | this work kept the BoD from _collapsing_ and saved the company. | | Calculus. Gee, just calculus. My big advantage was that I | remembered calculus (quite well, and way beyond this problem) and | was able to formulate the problem as calculus and solve the | differential equation. | | Right, the solution is a _lazy S curve_ and is related to some | models of Covid growth. | | There were other examples in 0-1 integer linear programming, some | original work in mathematical statistics, continuous time, | discrete state space Markov processes, etc. | | Here is how that can go: Are working in computing in a company, | see a problem the company has, see some math that provides a | solution, and, by writing some software and using available data, | proceed with some success. Maybe no one else in the company sees | the problem because they don't know enough math to see a math | formulation and solution. | | It appears that commonly where people are doing a lot of | important work, there are important problems that need solving, | are being neglected, and where some math can be the key tool in | formulation and solution. A person with that math may be unique | in the company. | | But don't hold your breath looking for job descriptions that | mention such usages of math. Uh, why not? Did I mention that the | person with the math might be unique in that organization. | | Also draw from the two old Disney movies _Snow White_ and | _Cinderella_ and see the possible roles of jealousy and sabotage. | In my experience, Disney was 100% correct. | Someone wrote: | > _it is possible to be a productive and well-compensated | programmer -- even a first-rate hacker -- without any knowledge | of science or math. But I think that most programmers who are | serious about what they do should know calculus (the real kind), | linear algebra, and statistics_ | | Not surprisingly, those happen to be branches of mathematics with | lots of applications. I would argue that programmers should know | them, but only superficially, as in having an understanding of | what mathematical properties mean in real life and in knowing how | to compute them, without having to understand why and when those | computation steps work. | | For example, when computing a double integral, changing | integration order is only allowed under specific circumstances (h | ttps://en.wikipedia.org/wiki/Order_of_integration_(calculus...). | | In a math exam, you'd have to show these properties hold before | switching integration order. If you do that well and then make a | slight mistake in your subsequent computation, you get a tiny | point deduction, but still easily pass your exam. | | In physics, you'd just switch order, compute the answer, check it | with reality, and if it doesn't look wrong, declare you solved | the problem (that may be slightly exaggerated, ;-)). | | The check with reality is important even if switching integration | order is OK because, if you make a slight mistake in your | subsequent computation and design a bridge based on the result, | people may die. | | The point is: for physicists, it's not the journey that's the | reward, but the destination. And yes, ideally they'll know when | their tool won't work, but physicists rarely encounter the weird | constructs that mathematicians consider in their job such as | functions that are continuous, but nowhere differentiable | (https://en.wikipedia.org/wiki/Weierstrass_function), or | discontinuous at every rational number, but continuous elsewhere | (https://en.wikipedia.org/wiki/Thomae%27s_function), and there's | always the reality check at the end that will catch (most) | errors. | | > _Rather than viewing mathematics as an advanced tool reserved | for extremely specialized computer applications, Fortran-school | programmers view the computer as an advanced tool for doing | mathematics._ | | Here, I'd say Fortran-school programmers view the computer as an | advanced tool for doing _computations_. That's not surprising; | Fortran-style programmers are physicists. They care about the | result. Mathematicians don't, at least not in the sense of | something that's useful in the physical world. | javaunsafe2019 wrote: | Maybe we could first try distinguish both. So when I think about | it, software development is mostly about the application of | mathematics and transformation of information whereas mathematics | are about describing the world in a formal manner. | rsrsrs86 wrote: | After reading the article, I am confused. I use types and | categories frequently, and how is that not math? | leephillips wrote: | I really like this article, but there's something the author is | not considering: | | https://lee-phillips.org/lispmath/ | mschoenert wrote: | As pointed out above - the most efficient to compute large | fibonacci numbers is to compute the matrix power | [[1,0],[1,1]]^n using repeated squaring. Or you could use the | known identities to compute Lucas numbers, which amount to the | same thing. The lispmath talks about computing fib(40000) in | 100..200 ms, the repeated squaring approach computes the same | number in < 5 ms (on my not very powerful machine). | JoeyBananas wrote: | I define a hack as a use of something in a way it was not | intended to be used to achieve a goal. This definition is missing | from this essay, and the ones it does present are poor IMO. Under | my definition, hacking falls entirely in domain of the Lisp | programmer. Fortran engineers are the ones who get fired for | hacking. | | There is nothing inherently wrong with the "Fortran" approach. | Sometimes, it is necessary. But it's clear that the Lisp-style | solution is always preferable unless proven inadequate for the | problem at hand. | revskill wrote: | As i see, maths is more about proof, and rediscovery new | theorems, than to write "arbitrary, unproven proof". It's more | like 100% unit test coverage of your codebase (harder than | writing the code). | tromp wrote: | The suggested "efficient" solutions for fibonacci and factorial | only work on small inputs as they return the result as a long | int. For these small instances the use of floating point | functions like pow, sqrt, and exp is likely less efficient than a | simple iterative solution. For larger instances using bignums as | output, floating point computations do not even offer an | alternative. | | It's true though that mathematics offers faster integer only | (e.g. matrix based) methods of computing fibonacci. | zozbot234 wrote: | The matrix based method for Fib can be understood as applying | the closed-form solution over Q(sqrt5). OP seems to miss this | point. | mschoenert wrote: | My thoughts at this point in the original article was: | | Well - if you want to demonstrate how mathematics helps here, | then you should mention that computing the n-th fibonnaci | number can be computed as the n-th power of the matrix | [[1,0],[1,1]], and that the most efficient way to compute | powers (in any associative domain) is the repeated squaring | algorithm. | BeetleB wrote: | Indeed, I kind of stopped reading the article there. | | The other issue is his picking on Lisp programmers with this | example. If you open books on programming using C, it almost | always will have either the iterative or the recursive solution | - not the closed for one. So why is he picking on Lisp | programmers in particular? | jdkee wrote: | "Again, no recursion is required as long as one knows that a | factorial is actually a special case of the gamma function. (The | implementation of log-gamma is usually a polynomial approximation | which requires constant time to evaluate.)" | | A prime idea behind using recursive techniques is that for many | complex problems you do not have to know the "special case" as | you can break complex problems into simpler pieces that can be | solved via recursion. | adalacelove wrote: | I would be surprised if there is not some kind of loop in the | code that is used to evaluate the gamma function. You can also | define factorial like for example the number of different | permutations of any set of a given size. | texaslonghorn5 wrote: | outside of edge cases, c++ lgamma (log of gamma) uses Lanczos | iteration with 8 iterations and gamma is just exp(lgamma) | adamnemecek wrote: | I think that the most important idea of math, programming, | physics etc is the idea of fixed points which is predicated on | the idea of nilpotence. | | Fixed points go by many names like invariance, spectra, | diagonalization, embedding, braids etc. | | By fixed point I mean something like the "Lawvere's fixed point | theorem". | https://ncatlab.org/nlab/show/Lawvere%27s+fixed+point+theore... | | I have a braindump on this https://github.com/adamnemecek/adjoint | | I also have a discord https://discord.gg/mr9TAhpyBW | layer8 wrote: | Corrected link: | https://ncatlab.org/nlab/show/Lawvere%27s+fixed+point+theore... | adamnemecek wrote: | Fixed. | lkuty wrote: | Point. | [deleted] | strangattractor wrote: | Kind of agree but my argument would be that solving math problems | exercises the same mental muscles that programming uses and vice | versa. Doing one improves the other. Saying that it is necessary | or essential is a false dilemma. They are complementary. Is | computation mathematically based - that seems obvious. Does | programming get done despite programmers lack of understanding | the math of computation - obviously quite a bit. | cs702 wrote: | "Writing software" = "writing down math". | | Consider: | | * "Writing software" means arranging symbols (bits in a machine | language, UTF or ASCII characters in a high-level language) in | certain permitted ways, to transform an input sequence of symbols | (e.g., a stream of byte values representing user actions from a | video game controller) into an output sequence of symbols (e.g., | byte values representing pixel RGB colors for display on a | screen). | | * "Writing down math" (e.g., to prove something, or to solve a | problem) means arranging symbols ('x', '2', '+', etc.) in certain | permitted ways, to transform an input sequence of symbols | (representing mathematical notions) into an output sequence of | symbols (representing other mathematical notions). Turing, | Church, Curry, Godel, and many others realized this in the 1920's | and 1930's. | | That said, most self-described "software developers" are | typically working to solve relatively simple problems for | immediate practical application, whereas most self-described | "mathematicians" are typically working to solve highly complex | problems, often highly abstract in nature, without regard for | practical application. | constantcrying wrote: | Mathematics is not about computation. Certain means of | arranging computation are entirely irrelevant to mathematics, | computation is a mathematical tool, not an end. | cs702 wrote: | I never said that mathematics "is about computation." | | What I did say is that writing down mathematics is equivalent | to writing software. | | Both require the use of a _formal system_. | constantcrying wrote: | >I never said that mathematics "is about computation." | | But programming is about computation. If mathematics isn't | about computation as well, then they are not alike. | | >What I did say is that writing down mathematics is | equivalent to writing software. | | It is not. That is plainly false. E.g. mathematics | considers objects which are not computable and makes non- | computable calculations with those objects. I am aware that | you can encode certain formal mathematics into certain | software, but that is like saying cooking is like | programming because you can encode recipes as a program. | | >Both require the use of a formal system. | | So what? | epgui wrote: | >> What I did say is that writing down mathematics is | equivalent to writing software. | | > It is not. That is plainly false. | | Whether the two look the same or not, maths and computer | programs are in fact fundamentally isomorphic. [1] | | [1] https://en.wikipedia.org/wiki/Curry%E2%80%93Howard_co | rrespon... | constantcrying wrote: | >isomorphic | | Certainly not every computation is a proof. What | statement does: | | void f(){ printf("?"); } | | prove? | petemir wrote: | I fear that's a very narrow view of mathematics. Nevertheless, | most of the time you can see the output of what you created | while programming, check if it's the correct result, etc. I | don't think it's like that in math, where you deal in a much | more abstract realm. | cs702 wrote: | "Mathematics" is not the same as "writing down math." | petemir wrote: | I stand by what I said, applicable even to proofs, but I | take your point. | cs702 wrote: | :-) | MontyCarloHall wrote: | This article misses the point. The Fibonacci/factorial | calculations are just toy examples to easily illustrate recursion | to a beginner. Nobody who actually needs to compute them for a | real application would think that these inefficient, merely | pedagogical examples would be the way to do it; Lisp hackers | would have no problem using the closed-form solutions. | brianyu8 wrote: | (2012) | dang wrote: | Added. Thanks! | zozbot234 wrote: | Discussed: | | https://news.ycombinator.com/item?id=4796586 (2012, 1 comment) | | https://news.ycombinator.com/item?id=4915328 (2012, 133 | comments) | | https://news.ycombinator.com/item?id=6953774 (2013, 102 | comments) | | https://news.ycombinator.com/item?id=20142828 (2019, 86 | comments) | Karrot_Kream wrote: | I used to work on these problems in school all the time, but once | I decided to join industry I encountered a bunch of these Lisp- | style engineers who love computation in the abstract but not the | application thereof. Scala seemed to attract a lot of folks like | this. Maybe if I had gone into scientific computing I would have | found more. | | I get to use these skills every so often though. When I was | designing one of our early two-level caches at $WORK, I wrote an | analysis of chosen TTLs and jitter values by looking at | microservice latency distributions. I've debugged a nasty | concurrency issue by modeling it in TLA+ and then fixing the bug | (full disclosure: once I thought through the TLA+ model, the bug | was fairly obvious to me, but the modelling itself was the | valuable exercise.) I've used MILP solvers for capacity planning | our boxes. I've designed queue backpressure through probabilistic | analysing. Each of these things has been crucial in designs I've | used, but I only encounter a problem like this once every some | years. (And these days I often write more docs than code.) | kqr wrote: | I quite frequently encounter code that can be made much faster | (at no significant loss of value generated) by sampling or | using other statistical techniques to reduce precision. | | Also flows and buffers in the software that can be improved | with queueing theory. Logic that can be simplified with boolean | algebra. | mschoenert wrote: | The idea that the "Lisp programmers" are somehow adverse to | mathematics is historically untenable. Macsyma was written in | Lisp. And Macsyma was one of - if not THE most important | application for the Symbolic Lisp machines (the ancestor of all | later Lisp machines). Many later systems (Maple, Mathematica, | ...) were written by people who would consider themselves | belonging to the Lisp crowd. For example all of those systems had | automatic memory management with garbage collection, most had | closures/lambdas, etc. | mindcrime wrote: | I basically hate math discussions on HN. Why? Because it seems | like there's two (at least) "camps" in terms of how they | interpret what "math" even means. And the various camps | constantly talk around each other, with neither camp seeming to | realize that they're arguing about completely different things. | So they keep arguing, nobody gets anywhere, and the whole thing | is largely a cluster-fuck. | | So what do I mean by "camps"? Well, the most obvious dividing | line is between people who see "math" as something that everybody | does, and that includes everything from elementary school | addition up to, well whatever, and has a primary goal of | computing something. Then you get the camp who see "math" as the | exclusive domain of mathematicians, look down on any maths class | at a level lower than abstract algebra or real analysis, and | consider the primary goal of math to be more math (eg, proving | things that we didn't already consider proven). And the latter | often tend to look down their noses at anybody who dares talk | about "learning math" but without a goal of becoming a | mathematician. | | _sigh_ | | My position is that "math" includes both of those notions, and | that in most conversational contexts you have to explicitly | define which one you are talking about up front in order to have | even a chance at a productive conversation. ___________________________________________________________________ (page generated 2022-12-23 23:00 UTC)