[HN Gopher] Teach yourself Computer Science functionally ___________________________________________________________________ Teach yourself Computer Science functionally Author : ggr2342 Score : 136 points Date : 2023-06-13 16:25 UTC (6 hours ago) (HTM) web link (functionalcs.github.io) (TXT) w3m dump (functionalcs.github.io) | imwillofficial wrote: | Is there something like this but for traditional CompSci? | | Trying to change career tracks | jcovik wrote: | https://teachyourselfcs.com/ | CobrastanJorji wrote: | This looks to me like a pretty traditional stack of Computer | Science undergrad topics. A similar big list of topic/resources | that's frequently linked to is: | https://github.com/ossu/computer-science | | Could you describe a bit more about what you're looking for | when you say "traditional CompSci?" | _Rabs_ wrote: | It's a cool write up, but why is this site promoting Triplebyte? | Lol what? | ctvo wrote: | [flagged] | gavmor wrote: | Just for kicks, I applied Tufte CSS[0] onto the page using a | browser extension. Great ROI. | | 0. https://edwardtufte.github.io/tufte-css/ | medstrom wrote: | I don't have a high-res screen (just 1280x800), so to me it's | one of the most readable pages I've ever seen. Although | curiously, it also looks great on the iPhone by default (which | is high-res). I assume you're on some sort of 4K external | monitor, but I wonder why it would look small there while | reacting well on the phone? | zouhair wrote: | It shows like this[0] on mine (2560x1440). | | [0]: https://i.imgur.com/I8bl5Es.png | medstrom wrote: | Well, that's ideal. IDK what their issue is. | ReleaseCandidat wrote: | It is small on a 'normal' (24") 1920x1080 display. So nothing | todo with high-res at all. | kimixa wrote: | As far as I can see it doesn't override the default font sizes | at all for the body text. | | If that's not legible I see that as a client default problem, | not an issue with the content. | ctvo wrote: | Default != best or even good. | | The author sets the width of the content container to 40em, | for example, to make it so lines of text are wrapped | appropriately (a single line doesn't contain on average more | than n words). Is it worth adding some styling around | typography to make it even more readable? Up to the author. | Only a suggestion from a single reader, of course. | Zambyte wrote: | References to the Atom editor shouls be removed | serhack_ wrote: | mh, maybe I'm wrong but it does not touch all of CS, does it? | System design, distributed systems, game theory .. | adamwk wrote: | It seems to be pretty close to my program (UCSD). Distributed | systems was introduced in operating systems but you had to | elect for deeper classes. System design wasn't really taught | unless you mean CPU architectures, which this covers. I've | never heard of game theory being part of a CS program (I took | it as an elective) | pwb25 wrote: | [flagged] | tabtab wrote: | I will agree it's about 30% less code on average, but whether | it's "team friendly" or "debug friendly" is quite another | matter. Debates over such often rage for months. | | If it's truly superior, then form a company called Functional | Magic or the like and out-compete OOP rivals and eat their | lunch. Proof will then be in the pudding, no more talk. (Some | co's have tried similar without long-term success, at least | outside of niches, as it does well in finance.) | | If FP is say 15% more productive, such a company would | eventually just outcompete OOers by growing 15% a year. Even 5% | a year would catch up in roughly a decade. If you truly believe | in FP's superiority, do it! Unleash the FP Kraken! When you are | golfing with Warren Buffett & Gates, you can say, "I toldja so, | fore!..." | consilient wrote: | > If FP is say 15% more productive | | "more productive" is not a singular metric. What indefinite | 15% year over year growth in mainstream tech requires is (in | addition to favorable market conditions) the ability to get | useful work out of huge numbers of very inexperienced people. | | Clearly Scheme, for instance, cannot do this better than | Java. But this tells you next to nothing about which tool is | more productive in the hands of a small team of people who | know what they're doing. | fulafel wrote: | I guess if FP'ers didn't think it was better, we wouldn't be | doing it. It's not like there are lots of people stuck in | functional programming jobs wishing they could be writing Java. | nequo wrote: | "All" FP articles and "always" is probably broader a | generalization than what you really mean. Can you share | examples from the linked page that you see as smug? | medstrom wrote: | This can also easily be a filter on the part of the reader: | anything FP is always close to triggering the "smug" concept, | even if they don't use words that would be read as smug if | the topic was something else. | | Same way some people are quick to read intelligent women as | "uppity" though they say nothing that would be read as uppity | if said by someone else. | butterNaN wrote: | I don't usually (get to) talk much in our team meetings. | This one time I suggested we try FP for a new internal | project - and the backlash I got was quite unexpected. | Merely the mention made my teammates launch into a dozen | different assumptions, before I even finished the sentence. | I was shut down pretty quickly. I was surprised, because | usually they are at least receptive to hearing out new | ideas. | | I think outside of HN, there's a large chunk of people out | there who just have this prejudice about FP. I am only | about 10 years into the software industry and I feel like | I'm missing some history that is not recorded anywhere, but | lives as a tribal memory. | sb057 wrote: | "Like normal but worse" wouldn't entice much interest, would | it? | tabtab wrote: | From a practical perspective, one should probably learn | procedural/OOP first, it's the de-facto industry standard, and | thus better for one's early career. Whether functional is | "better" in the longer term, I won't get into here, only to say I | have skepticism. | marginalia_nu wrote: | Well if you're learning computer science, what does it matter | what is industry standard? Computer science doesn't really have | very much to do with the programming industry. | whateverman23 wrote: | Because when we're talking about CS education, it's usually | in preparation for a software engineering career. Whether | that should be the case is another story, but that's the | reality. | OkayPhysicist wrote: | My position is that for university students, you should start | with FP. You have them for 4 years anyway, they'll have plenty | of time to learn imperative programming. But FP both distills | essential CS concepts, putting them front-and-center, and it | puts your freshman on a more even playing field between those | with existing programming experience and those who don't. | mcdonje wrote: | There are jobs for pretty much all established technologies. | And if there aren't currently, there could be in the future. I | primarily work on procedural & OO projects, but I disagree with | your position. I've seen job postings for all sorts of things; | Things that interest me, things that don't, things that are | hot, things that are old hat, things that have an air of | prestige, things that look like a coffee stain on your | resume... | Xeamek wrote: | If by FP we mean Monads recurrence and no single drop of state, | then yes. | | If by FP we mean "Let's write our functions as pure (and leave | IO as a magic box for time being)", then this is undeniably | more straightforward then getting head deep into side effects | that procedures can create, not to mention the entangled web of | dependencies in OOP, and other messy stuff it promotes | still_grokking wrote: | Imho it's exactly the other way around: Imperative programming | is an implementation detail and nothing you should care at | first. | | If you want to learn proper abstractions you should start with | something FP-ish. | | This also avoids to get your head messed up with the imperative | kind of "reasoning". | | Besides this: FP is much simpler to learn, so much better | suited for newcomers. One just needs to follow up on what every | child learns since first grade in school, namely the | substitution model found in math. On the other hand imperative | thinking makes absolutely no sense when looked at it | intuitively. It looks more like complete nonsense: `x = x + 1` | isn't true for any `x`... So imperative programming is at it's | core contrary to logical reasoning. I would try to avoid it as | long as possible. | Aerroon wrote: | > _One just needs to follow up on what every child learns | since first grade in school, namely the substitution model | found in math._ | | Considering how much people struggle with learning math I'm | not sure that this is a good way of going about things. I | don't think functional programming classes have much more | success either. | still_grokking wrote: | > Considering how much people struggle with learning math | I'm not sure that this is a good way of going about things. | | Even more are struggling with programming, no matter the | paradigm... | | > I don't think functional programming classes have much | more success either. | | Objectively they have. I've linked already some evidence in | the other reply in this thread. | nequo wrote: | Creating connections in the curriculum between math and | other subjects is a good way to help students better | understand both math and other subjects. I don't have | literature to cite on this though. | rajamaka wrote: | Also a good way to turn off students who have no interest | in math from subjects they have interest in. I would have | never become a SWE if I actually attempted a CS degree. | whateverman23 wrote: | > FP is much simpler to learn, so much better suited for | newcomers. | | I can't see how this is the case. Assignment is just one tiny | piece of learning how to program, and is almost never a pain | point after a small amount of instruction. | | Imperative programming is easier to learn because you simply | write out the steps that you want the computer to take, and | the computer takes them. FP requires much much more abstract | thinking that is often difficult for newcomers to grasp. | | The main exception that I see is when someone who has a very | deep mathematics education. Graduate level math folks seem to | more easily grasp FP concepts from my experience. Almost | everyone else seems to grasp imperative programming easier. | weatherlight wrote: | You don't need to know more than high school math to learn | Functional Programming. This myth really needs to stop. | | All functional programing languages, have ergonomics in | their syntax and semantics. around referential transparency | and immutable data structures, there's nothing in there | about Monads or Functors or Hindley-Milner type systems. | | Languages like Haskell do benefit from having that kind of | experience, however, langs like, OCaml, Erlang, Elixir, | Gleam, Racket, Clojure, Standard ML.... and the list goes | on, doesn't require that kind of education. | | (Antidotally, I find FP langs much easier to reason about | and I have a background in the humanities. I just don't buy | the advanced math argument.) | still_grokking wrote: | > Assignment is just one tiny piece of learning how to | program, and is almost never a pain point after a small | amount of instruction. | | The issue isn't assignment. You have also assignment even | in the most pure FP languages. | | The issue is mutation! | | > Imperative programming is easier to learn because you | simply write out the steps that you want the computer to | take, and the computer takes them. | | No, that's not easy given every step can change the whole | world around and you need to _track all the changes in your | head_. | | That becomes very hard to follow even after only a few | steps. (That's why imperative programs are always so | buggy.) | | FP code, which usually eschews mutation, is much simpler to | follow as you can look at any "step" _in isolation_. No | hidden "change the world" side-effects everywhere. | | > FP requires much much more abstract thinking that is | often difficult for newcomers to grasp. | | No it doesn't. At least as long as you don't go nuts like | e. g. Haskell. | | At the core FP is basically the same trivial concept taught | to children in elementary school: If you have some | expression you can mechanically substitute following | occurrences which the value assigned to that expression. | That's all. | | > The main exception that I see is when someone who has a | very deep mathematics education. | | Like every child that attended math classes for many years. | In school people are trained for a very long time in | exactly the way of reasoning you need to write FP code. | | On the other hand you need to teach those people imperative | programming form the ground up, including mayor mental | shifts around all kinds of concepts they were taught | previously. Only after this kind of brainwashing people | start "to get" imperative programing... | | > Almost everyone else seems to grasp imperative | programming easier. | | No. Quite the opposite. | | https://cseducators.stackexchange.com/questions/342/what- | mak... | | https://stackoverflow.com/questions/778461/should- | functional... | | Just go out and talk to some programming instructors... | Everybody will tell you the same. | | Only people whos brains are already burned by imperative | programming think it's easier. For everybody else it's the | opposite. Which is perfectly logical as the FP way of | thinking is what they practiced for many many years before, | in math in school. | _a_a_a_ wrote: | You claim a lot, you've backed up none of it. This doesn't | come across like you're a professional programmer. | | > `x = x + 1` isn't true for any `x` | | Out of interest, if this had been written x := x + 1 as in | the style of Pascal, would that make imperative programming | more logical? | still_grokking wrote: | No, it wouldn't. | | And it's almost tragicomic to see how imperative | programmers struggle to even see the actual real issue | presented in this snippet. | _a_a_a_ wrote: | OK, how about | | x <- x + 1; | | (BTW be careful about assuming you're the brightest guy | in the room, how others "struggle to even see" when you | do, and with such clarity) | still_grokking wrote: | Two out of three replies were talking about the | assignment even mutation is the (obvious!) real issue. | | > OK, how about | | > x <- x + 1; | | Better. | | From such syntax you can at least guess that mutation is | happening there. | | Still nothing you would show a newcomer in a FP- | programming introduction. | | (I'm not sure why your comment got down-voted. I can only | up-vote it, so I did; to battle stupid down-votes because | "feels"...) | akavi wrote: | "De-facto industry standard" is heavily a function of what | slice of the industry you're looking at. | | It feels like the dominant style of programming in the | companies I've worked at (YC startups and FAANG) is | "functionalish" procedural, with a sprinkling of objects-qua- | objects to interface with libraries and frameworks (Eg, react | class components or rails ActiveRecord models). | | Note I'm distinguishing between objects-qua-objects (data | coupled tightly to methods that operate on them) from structs- | implemented-via-objects (eg, ruby's `Struct` or Java "beans") | or modules-implemented-via-objects (like a class with a bunch | of static methods used as a namespace). I only see the first | one as "object-oriented". | nathants wrote: | alternatively, just start building interesting things and follow | all rabbit holes. | | computer science doesn't exist in a vacuum. | funman7 wrote: | Maybe it's just me... but I never have been able to immediately | fluidly intuitively grasp any understanding when someone has | made "in a vacuum" statements. I just think of vacuuming | carpet. | nathants wrote: | perhaps better verbiage would be in the absence of a concrete | application currently under construction. | still_grokking wrote: | I think you should do both! In lock-step. | | You won't learn anything if you don't practice it. | | But "learning" computer related stuff without the theory behind | is also kind of moot. You wouldn't get the full picture this | way, and you would end up with a lot of "knowledge" that isn't | more than assumptions. Likely wrong assumptions... | nathants wrote: | why not both is a great answer. | | for many, a task makes the long grind of study more fun. | | a mission and all that. | | it also add success criteria to an otherwise ambiguous task. | generalizations wrote: | That's implied by the rabbit holes. For me, following the | rabbit holes meant digging deeper and deeper into the | underlying theory, but at a pace mediated by my current level | of understanding. | still_grokking wrote: | > That's implied by the rabbit holes. | | I guess not for everyone. Frankly. | | I know quite some people who do programming for living but | are more or less avert to any theory behind it. You get | even called names if you come along with such topics... (I | think it doesn't need to be said that it's quite difficult | to deal with those people at times as they're kind of | ignorant.) | ackfoobar wrote: | A lot of people learn best by doing. Some people, especially | those who are more math-inclined, probably learn best starting | from the abstract. | kwant_kiddo wrote: | I can tell you that math people also learn from the concrete. | You do not learn math by reading it, but by fighting it. ___________________________________________________________________ (page generated 2023-06-13 23:01 UTC)