20 ms·
If a student has trouble transferring their knowledge of programming fundamentals from one language to another, it seems far more likely they didn't really unde
by empressplay 5y ago
If a student has trouble transferring their knowledge of programming fundamentals from one language to another, it seems far more likely they didn't really understand them to begin with, which is a failure of teaching and testing, not some sort of 'limitation' in the student.
- wyager 5y ago> If a student has trouble transferring their knowledge of programming fundamentals “Programming fundamentals” isn’t the same from language to language. It’s inconceivable that a student who learned to program with python would develop the same type of fundamental understanding as a student who used C (to develop an understanding of memory-level APIs) or Haskell (to develop an understanding of type and semantic theories). > which is a failure of teaching and testing, not some sort of 'limitation' in the student. This is a bold claim. I don’t think everyone can understand computer science.
- Retric 5y agoI think you’re vastly overestimating programming fundamentals. Every language can do some form of if then else be it machine code with goto’s or purely functional. Ask someone to find the absolute value of a number and they should be able to quickly figure out something that works in a new language. The basics of programming are not about being correct so much as not being lost.
- josephg 5y ago> Every language can do some form of if then else Uh, not exactly. I had a really hard time learning prolog because it doesn't really have if-then-else. Haskell is missing the idea of something happening after something else. Stack languages don't have variables. And so on - there's a lot more to programming than python. There's a big class of popular structured / OO languages which are quite similar (C, JS, Python, Java, etc). But they certainly aren't "every language". Not by a long shot. And even amongst those languages there's huge variety in how the grain of the languages shape the code we write. I was talking to a grizzled old programmer at a conference a few years ago about the performance of java vs C. He said in some benchmarks he did the performance was almost identical. I got him to show me his code - and sure enough, he wrote java as if it were C. He was using native java arrays everywhere and basically everything was a primitive variable, in huge classes acting more as buckets for code than anything else. His code was unrecognisable as java because he was still writing C, just with a different syntax. > The basics of programming are not about being correct so much as not being lost. The basis of programming is expression. The most idiomatic way to express yourself in each language is very different. Its as much cultural as it is syntactic.
- kaba0 5y agoJust a nitpick, but this is false > Haskell is missing the idea of something happening after something else A Monad is implicitly a monoid, which certainly does specify an ordering. And as for expressions, the order of evaluation of arguments is not specified either by C for example.
- thaumasiotes 5y agoThe bigger problem is that "something happening after something else" is not related to the idea of an if-then-else. In Common Lisp the if-then-else construct is IF. The "something happening after something else" construct is PROGN. The whole point of if-then-else is that only one thing happens; "something happening after something else" requires a minimum of two things.
- kaba0 5y agoI don't really get your point. If/else expressions are in principle free to evaluate both branches, but that would be needless. But when we provide an IO Monad for example, if/else expressions will not suffice in the naive way -- you have to use the monad "bind" operation to actually provide an order -- what it boils down to basically: the A; B; C; in imperative languages become C(B(A())) in pure FP ones -- with implicit ordering.
- thaumasiotes 5y ago> If/else expressions are in principle free to evaluate both branches, but that would be needless. This is true only in a pure functional language; if you admit the existence of side effects, then it is a crucial part of an if statement that the code associated with the other branch is never executed. My point is just that it makes no sense to say "some languages have no form of if statement; for example, Haskell doesn't have the concept of one thing happening after something else". That example is untrue. But if it were true, it still would not interfere with Haskell's ability to have an if statement. Thus, defending Haskell's ability to run one statement after another statement is unnecessary to refute the claim; the claim never worked in the first place.
- andai 5y agoMost programmers are not computer scientists. Even most people with computer science degrees are not computer scientists at heart, they forced themselves to do the coursework so they could get a job (mostly web, utilizing almost nothing they were taught). I learned to program as a child (I taught myself, for fun!) but I didn't learn much computer science until well into adulthood.
- pkdpic_y9k 5y agoAs someone who fought hard to switch careers into this industry and teaches software engineering now I understand the impulse to think this but I have to say all my experience thus far contradicts it.
- andai 5y agoWhich part(s)?
- aYsY4dDQ2NrcNzA 5y agoPossibly replying to someone else.
- SilurianWenlock 5y agoWhy does web dev not use much formal cs in your opinion?
- throwaway2037 5y agoThis is an interesting question. From personal experience, I have also found simple GUI work to the "digging ditches" work of programmers. (Weirdly, I still love it, because it makes it easy for end-users to understand your tools!) Of course, complex GUIs are another beast, but usually GUI programming on the low end as it is very hard to test (easily) and requires endless tweaks due to the high configurability of GUIs. For example, if you just look at GUIs created using Excel/VBA, you will find they seem to need endless tweaking to work just right (edge cases?), but do not at all require a formal CS degree. (I have worked with many non-CS people who are fine a mid-level Excel/VBA stuff.)
- okwubodu 5y ago> “Programming fundamentals” isn’t the same from language to language. You should be able to carry very, very basic concepts over to other languages with much less difficulty than learning them the first time. A student sufficiently skilled in Python will be able to make the same intro level programs in C given enough time. Badly? Yes, but they'll function. Similarly, a watercolor artist won't forget the basics of art when handed a pencil.
- aYsY4dDQ2NrcNzA 5y ago“… sufficiently skilled […] given enough time …” Well, sure. For some values of sufficiently and enough.
- okwubodu 5y agoSufficiently skilled: understands the topic in their chosen language. Enough time: however long it takes them to learn the syntax of the second language + the time it took to complete the project in the first language. Unfortunately I can't give decimal precision hour estimates.
- d18g 5y agoLearning the syntax of a language is far from understanding the sementics.
- swiftcoder 5y agoC and Python are also languages with a pretty direct historical relationship. Going from, say, Python to Prolog, it will be significantly more challenging to identify commonalities.
- benrbray 5y ago> I don’t think everyone can understand computer science. This is a bold claim. None of us are special for working in tech. Our life has presented us the opportunity and passion to invest ourselves deeply in the field, often at great opportunity cost. Saying that a bad teacher makes no difference in student outcomes is equally ridiculous as saying an excellent teacher makes no difference in student outcomes. If that's the case, we should be able to replace professors with cardboard cutouts, no? I was a student and TA long enough to witness directly the impact that a thoughtful curriculum can have on students.
- syops 5y agoThe person you responded to didn't make any claims about bad teachers or good teachers. The claim is that not everyone can understand computer science. As an extreme example do you think a person who is mentally disabled can understand computer science? From my perspective it's clear to me that not everyone can understand computer science and the same applies to many academic areas.
- judge2020 5y agoNot everyone can understand computer science, but I think the OP meant that your socioeconomic status matters more - gradual learning from age 10 makes college-level education a breeze compared to being disadvantaged well into high school and only using computers in order to live and use essential services. I agree that the whole bad vs. good teachers thing is off-topic, though.
- benrbray 5y agoThe grandparent comment was about teaching, so I interpreted the parent comment to mean that "innate ability matters much more than good teaching", which my personal experience teaching people disagrees with. And sure, the statement "not everyone can understand computer science" is technically true if you include people with mental disabilities. But in reality, some people draw the line a lot higher as a form of gatekeeping. I've known a number of professors who let themselves off the hook this way too: Poor student performance couldn't possibly be a failure of their teaching--the students must not be smart enough!
- nyanpasu64 5y agoHaving learned C++ and Python, I feel they're similar in programming model (imperative, object-oriented). My limited experience with application or kernel C code feels like C++ but with high-level constructs replaced with pointer juggling that makes me feel uneasy (C has a culture of not using vocabulary types to communicate nullability and responsibility for deallocating). Haskell (barely know) is an altogether unfamiliar programming model, being based on pure functions instead of mutation, but the underlying model beneath the abstractions (thunks) leak through.
- AnimalMuppet 5y agoExpanding on this a bit... You could think of there being a universe U of programming fundamentals. Each language uses a subset of U as the language's fundamentals (no language uses all of it), and each language uses a different subset. Some languages have subsets that overlap, but that isn't always obvious, because they clothe the same thing in different syntax and, sometimes, different semantics. Even when the semantics are the same, they talk about the semantics using different terms. So the problems with transferring knowledge of the fundamentals from one language to another are that they aren't the same fundamentals (different subsets of U), and that they are expressed in different terms and in different syntax. That can make it hard to recognize that the parts that are in common actually are the same. And then there's the new parts. Now here's a class in C#. One student comes in knowing Haskell; one comes in knowing Python; and one comes in knowing C. The "fundamentals to transfer" differ from student to student. It's asking a lot for the teacher to be able to help each student recognize what part of their background transfers, what part of C# it transfers to, and what the deeper fundamentals are that are expressed in both languages. An exceptional teacher could certainly do so, but as the adjective implies, such teachers are the exception. But it's not really fair to blame the student, either. It's asking a lot of a 19-year-old to understand deeply enough to make those connections. My own guess is that this happens best after working as a professional for several years, and in more than one language. Then it's somewhat easier to see what's going on "under the hood" of the languages.
- whakim 5y ago> “Programming fundamentals” isn’t the same from language to language. It’s inconceivable that a student who learned to program with python would develop the same type of fundamental understanding as a student who used C (to develop an understanding of memory-level APIs) or Haskell (to develop an understanding of type and semantic theories). I think this is a pretty good point and it touches upon something I was thinking about: what language you use to introduce students to computer science says a lot (not everything!) about your pedagogical attitude towards what "computer science" is. If you think that it's fundamentally about humans interacting with machines, then low level languages make sense. If you think it's fundamentally about math, then functional languages make sense. If you think it's about building things which provide a lot of real-world value, then something like Python makes sense. Now of course (1) students probably need to learn about all three at some point; and (2) there are a number of other factors here, perhaps most importantly making the material enjoyable, approachable, and rewarding for students such that they'll want to delve into each of these aspects.
- TravHatesMe 5y agoWhat inspired me to learn programming was your last point: building things. That's why I think that people should be introduced to a loosely typed, high-level, forgivable language. Compiler errors and verbose code does not appeal at first glance, you need to draw people in.. I will never forget the moment 11 year old me saw a message box appear with text that I specified. I made that happen, I built it. I felt so powerful and cool. That 1 line of code in an obscure language got me hooked and over time I moved on to other languages.
- atoav 5y agoThis is why I recommend using Processing and the free book Nature of Code to learn the basics. People see what they do and have instant visual feedback.
- sprafa 5y agoMaybe not everyone, but definitly a majority. I'm not talking about learning assembly language, but learning some HTML/CSS/Javascript (if properly taught) seems pretty simple to me. With enough effort and youth (ie malleable brain). It's crazy that programmers think this to me and just a form of ingrained tribalism that tells them that what they do is somehow special. Probably because they get such crazy time-valuations in terms of salary. But that's just a supply and demand curve.
- throwawayboise 5y agoOr it simply means the student does not have the aptitude for programming. Not everyone does.
- deleted 5y ago[deleted]
- esrauch 5y agoBut the topic is how their view is shaped by the first language they learn. If they learn C first, will their ability to knowledge transfer into other languages happen differently then if they learned Python first? Concretely, I can't fathom how people learn Rust without learning one of C or C++ first, and I'd think the underpinnings of how you understand code and systems is probably different if you are subconsciously mapping new concepts back to Python or Java or whatever.
- lupire 5y agoC is very different from C++. Rust isn't more complicated than C++.
- esrauch 5y agoI agree they are different, I really did mean "I don't understand how people learn Rust without first learning one of several languages that are more straightforward/explicit what is on the stack and what is on the heap". C++ overall obviously isn't simpler then Rust; C++ in its entirety so complicated it's like three languages stapled together. But with C++ as first language, you can study programming for 6 months before ever even hearing about std::move, and with Rust you'd need to already learn about move semantics on like week 3, when people are still having trouble with loops
- open-source-ux 5y ago"Or it simply means the student does not have the aptitude for programming. Not everyone does." Some students (and programmers) can excel in one programming language and struggle with a different one. Programmers don't want to admit this because it suggests a superficial focus on syntax. Developers often say: it's semantics that matter in programming, not syntax. But you can't separate syntax from semantics - they are so closely entwined. And for many developers it shapes the way they solve problems (me included). Some programmers develop a deep understanding of semantics that makes them easily see beyond syntax regardless of the language. I'm definitely not one of them. Dare I suggest (with no judgement), that a substantial number of programmers, possibly even the majority, also find it difficult to see beyond syntax for more complex programming topics? Aside: A tweet from Sahil Lavingia (founder of Gumroad) from 2019: "For those who think they can't learn how to code: try another language. I tried PHP a few times and gave up. Then JavaScript: gave up. Then the iPhone came out, I tried iOS development, and everything started to click!" https://twitter.com/shl/status/1173967528017551360 https://twitter.com/shl/status/1173967528017551360
- joshthecynic 5y agoIt absolutely could be some sort of "limitation" in the student. Some people are just dumb.
- rgoulter 5y agoAt my university, there was an intro to programming course which used Scheme & was inspired by SICP. I took the course with previous programming experience (Java, Python), and found the course straightforward. I also knew students who took the course having programmed in C++, and who struggled with the course. I'm not sure "do SICP exercises in scheme having learned Python/C++" is really about transferring programming fundamentals. The SICP exercises seemed really geared towards a small lisp.
- ngold 5y agoYou are given a set of tools, designed by folk's that may not have envisioned how you want to use those tools. You make the best you can from the bag of tools available.
- vlovich123 5y agoI would say it took 10 years of professional work across many languages where I can say I feel that comfortable. Maybe I was a shitty student but I think I went to a general well taught undergrad program that grounded me in the various concepts (although not functional programming and lambda calculus - that was a pure CS-only thing at the time). It took a long time to actually build that level of intuition through experience. I wouldn’t expect someone who is just out of college to have that trait but it is to me a strong signal of seniority (eg you can start helping someone proficient in the language/more familiar with a codebase try to spot tricky system performance issues because you know what kinds of things to Google). Similarly language fluidity is a skill that not everyone develops (due to whatever mix of available time, interest, or natural talent) and that’s also OK. There are plenty of meaningful contributions made by people who only specialize in expressing all the CS concepts in one language and that’s OK too (or even just building useful tools/OSS contributions that are unrelated to CS topics).
- vishnugupta 5y ago> programming fundamentals from one language to another, But the fundamentals of different classes of programming languages differ. For instance, Haskell's model of computation is not Turing machine but a G-Machine. It's a different matter that G-Machine and Turing machine are equivalent and that doesn't mean learning one is sufficient to understand the other. There is very little that can be transferred between the two. To take another example, Javascript supports continuation passing style coding where as Java didn't until very recently.
- urthor 5y agoI think this goes to the core of how do you teach programming. Can you teach "programming" without conveying a fundamental model of how the machine operates. Should you? Because how the machine operates is very simple. Fundamental units of state are read from memory to an evaluator, evaluated to extract meaning, and this can result in units of state being written to/assigned depending on certain conditions. Data structures are a complex arrangement of state that has meaning other than the literal evaluation of said fundamental units. Algorithms are logically proven concepts represented in state. Compilers are a tool for converting "abstracted instructions designed for humans to work quickly in" into operations supported in hardware. How each language abstracts it is pretty secondary. There are so many unanswered questions in programming education. "Whether you should attempt to teach the model of fundamental state" to all novice programmers, or just a few shorthand rules, is the biggest.
- joshsyn 5y agoFailure of teaching. Also laziness on the student is a big factor.
- joshsyn 5y agotruth hurts, so downvote comes. :D
- austincheney 5y agoTry Java as a first language and then abandoning OOP.