61
devs
6y

Everyone should start with C rather than java/C#/python (or alike). Much easier to move from C to java than the opposite

Comments
  • 17
    Why not assembler? It's much easier to move from assembler to C than the opposite.
  • 1
    @devs yes
    @AndSoWeCode no, because people usually give up while learning assembly and think that programming is not their cup of tea.
  • 3
    @AndSoWeCode I believe that most will code C at some point. Well, I cannot be sure, but I believe that most will never code assembly. Of course some will, but I believe it’s much more limited
  • 1
    @AndSoWeCode and as @NOOB4LIFE says, a lot people will probably give up if they start with assembly
  • 3
    They say C is like Judaism; you'll never get unless you were born into it.
  • 7
    I'm of the opinion that you should begin by looking at computer architecture and why an instruction set is the way it is. Then move to assembly, then C. It's all about building from the bottom up and thinking how the original computer architects and programmers thought about things.
  • 2
    Starting with assembly actaully sounds like the best way if you have enough time and dedication. If you dont care about the inner workings and/or dont have the time dedication you should start with C or even C++. Java is just too high level and specific to start with. Its compilation process for example is kind of unusual and wonky.
  • 2
    @milkybarkid Exactly how I did it ~25 years ago. Highly recommend :)
  • 2
    @milkybarkid yup, we had assembly after java, which makes no sense at all, but assembly itself is the very best way to start off.

    Simple stuff like MU0 to get you started and something like a SBC-86 to try some more advanced shit is more than enough and you learn to actually write efficient programs in C or higher.
    Of course, assembly is a random pain in the ass sometimes because it seems illogical to not be able to store the value of an 8 bit register into a 16 bit register but as soon as you know how a cpu actually does shit its pretty logical and easy.
    Every starting point is hard and has its obstacles. As if nobody ever fucked up pointers in arrays of strings in plain c..^^
  • 0
    I agree.

    I was feeling like things were harder when I went the latter way.
  • 0
    I used to code in C a lot, then I switched to C++ for many years. The other day I was kinda irked at how many copies of my class template was needlessly duplicated in the output executable. I wondered, there has to be a way... Maybe a void pointer? That loses some type safety, but that's the trade-off. Then I wondered, "but how do I iterate over an array of unknown size?" And then me from the past came along with a large trout and smacked me with it and said "BY PASSING THE SIZE OF THE ARRAY ELEMENT, NUMB NUTS!"

    I have been utterly spoiled by not only syntactic sugar, but by all the other abstractions as well. So I'll see your rant and raise you another:

    All programmers should learn C and code in it once in a while. Understanding how hardware actually works by using such a low level language is incredibly helpful. And at least write a function or two in assembly just to drive the concepts home.
  • 0
    OO should come later, once the core principles of programming are learned. C and Perl are great for building that foundation.
  • 3
    But not everyone will need to work on a low level.

    Software has become so diverse that some people never need to touch C++ and can spend their whole lives using just Javascript you know.

    Learning C doesnt benefit you on an abstract level.

    I think python is better
    not mainly because it's easier but because
    due to the easiness of its syntax students can focus more on learning the mentality of programming without worrying about the details of what's happening under the hood.
    Then once people gain that new perspective of the world. Then teach them whatever you want.

    I studied in a university where they taught C first. It's a disaster. After my year they hanged the curriculum from C to Python for the programming introduction.
    The performance of the average student improved a lot.

    TLDR;
    My opinion is simple:
    Teach first the logic and perspective of programming.
    Then the inner workings.
  • 1
    @AndSoWeCode no love for Pascal?
  • 0
    I think C++ is a much better language to start with... that way they are somewhat familiar with C and it is very simple to move from languages
  • 2
    My point was that the same arguments that go for learning C first, could be applied to learning Assembly first. And the same arguments that work against Assembly, will work against C.
    I know people that gave up programming, because it was too much of dealing with bullshit instead of focusing on the big picture, when they were forced to start with C. You might say that they're not "real programmers" because of that, but... remember assembler.

    The world is changing. We need to stop being stuck-up about old ways or about the hard ways, or imposing our difficulties onto others.

    The reality is that you can learn any other easier language, and have the freedom to create whatever the fuck you want, with only a tiny fraction of stuff requiring something particular like C or Assembler.

    So why bother forcing everybody to start with the most unapproachable technology?
  • 1
    @brasorexia @AndSoWeCode In some way I agree. Sure, don’t jump right out for C. I think it’s good to learn about the abstraction first. Learn how to use branches, loops, method calls. But I don’t think python and java are great for that.
    For complete beginners I think a great way is to start of with graphical programming. That way you don’t have to think about syntax at all.
    Then, if you start on a CS education, I think it’s good to learn C early on.

    I believe that if js or python is good enough for the student, a CS education might be a bit overkill. To me, CS is about knowing about the inner workings of the CPU etc.
  • 0
    The thing is you can program explicit lists, loops and whatever else you want in Java, Python, C#, and even PHP.

    One would not require to learn a language that is pretty much useless unless you program embedded devices, kernels and stuff. Let's face it: the vast majority of developers will either end up front-end, back-end, dev-ops, data engineers.
    The rest that do end up programming embedded systems, will learn C or Rust, or whatever they feel they need.

    It's just that when you have young minds that want to do cool stuffs, and you force them to learn a language created in the 70s that gives little reward but punishes really hard for mistakes, you're turning this into an exclusive club. Very good young people, that just don't have the patience for old crap, or anything that even feels old, will just have an unhappy life, just because someone decided to force C on them.
  • 1
    @AndSoWeCode I'm sorry, but I tend to disagree.

    High level languages like C#, Java, Swift, PHP, Python (and many more) inherit an awful lot from "old" low level languages. Learning them (at least the basics) leads to a better understanding of both the programming language you prefer and how everything is working together.

    Anyone, who calls him- /herself a "real programmer" (and NOT doing web development exclusively) should have at least a *basic* understanding of low level languages, ISAs and Operating Systems. Not because they'll *need* it to write software, but because it helps them to write *better* software.

    The more we focus on high level languages and huge frameworks alone, the more the knowledge of how to write them in the first place disappears.

    But that's just *my* opinion. Feel free to shun me for that :)
  • 1
    @kieni I feel like you made a few valid points in there...
  • 1
    @devs I completely agree.
    I kinda regret that I learned Java as my first language.

    Luckily I had an awesome professor last year who taught in functional programming which kinda requires you to know what a CPU consists of, so he taught us that as well.

    I still wish I had started out with C though
  • 0
    @devs You make a good point
    and I like the Graphical programming idea.

    But I disagree with your statement on CS
    Computer Science is more theoretical and therefore the abstract ideas are what matters.
    C is more for engineers (ie. Computer Engineering), people who need to know the inner workings of a computer.

    Computer Science is about the algorithms. You don't need to know pointers to do that. You can just imagine some concepts and use the higher level tools to implement them and test. Unless of course your focus is on the low level stuff. I dunno anymore lol.

    Full disclosure C is my all time favorite language, along with Python.
    So I have nothing against C or low level things. I'm just trying to speak for what I think will he better for students. Because I'm tired of seeing people's minds fucked from jumping into C and The low level details too fast.
  • 0
    @kieni but instead of learning a language in order to learn another language, why not just learn the other language? Why do additional things, AT THE VERY BEGINNING, where it's important to maintain and maximize interest.

    And please don't start with "real" programmer discrimination. Anyone can go to the next level where you won't be counted as a "real" programmer.

    Knowing how to write Operational Systems won't help at all to develop a better GUI, or optimize a SQL query. The only thing that does help is to document on the SPECIFIC topic directly. Inferences drawn from other languages tend to be not only wrong, but VERY wrong.

    I've entered new domains by inferences, and trusted them more than tech-specific knowledges, and let me tell you what happened: I SUCKED!
    I would've been so much better if I had forgotten all I knew about other tech, and focused specifically on the tech I was working with. Which I did.

    If you try to write a graph parser from in python like in C, it'll suck.
  • 0
    @kieni look, just provide a single CS topic that can't be taught using, say, PHP. I went to extremes a bit. PHP doesn't have fixed types so it is not appropriate to teach about types. But other than that, there is no computer science related topic that can't be taught on it.

    Forcing it to be C is like forcing mechanical engineering and thermodynamics onto a driving student.

    Have it as an option instead. People who want to make stuff that looks good will be disappointed to be greeted by C and will lose enthusiasm. People that want C, can always choose to use it. That's the difference between these approaches.
  • 0
    @AndSoWeCode The "discrimination" card? Cool :)
    But seriously, you got it wrong. It wasn't meant to discriminate, but to distinguish.

    As I pointed out in my previous comment, you don't have to learn C to perfection. It's about understanding the language, that today is still one of the foundations to almost any modern programming language and the things we work with on a daily basis (take a look at your own profile: how many of the languages listed there, have a common ancestor named C?)

    Same goes for Operating Systems: concepts like threading or sending messages to other instances are key to things like GUIs.

    I'm oversimplifying, but I hope you get my idea. And I agree, that those are sometimes tough and dry things to learn, but it is part of the whole big realm of CS. Depending on what you've signed up for, you'll have to deal with it.
  • 0
    @kieni "The "discrimination" card?" - dude, it's not a buzzword, but an actual thing you did. You called in the "real programmer" card. It's an age-old elitist view, that is basically discrimination.
    "Not a real mother if gave birth through C-section", "Not a real man if something something", etc.
    Just because some people chose the hard way, or had the misfortune of confronting it the hard way, doesn't make them any more real than anyone else.

    You know who is a real programmer? A person who writes code. If you put the restriction that it must be "C", I'll put the restriction that it must be "Assembler", and someone else might restrict it to "perforated cards", or being able to program the Altair 8800.

    Something being a foundation for something you actually need, doesn't mean you need to learn the foundation. You can just skip to what you need.

    Threading can be taught using C#, Python, Go, Java, even JS in a rudimentary perverse way.

    C is not required for CS in any way.
  • 0
    @kieni the truth is, that teaching is much more than being hardcore and edgy.

    Wanna know my experience?
    I've seen eager students, that I've agreed to help with C lessons, because it was just too uselessly complicated for what it did, to them. They dropped out and joined Finance.
    Myself, when I was learning C++, was seeing it as useful as Pascal. Maybe shorter and easier to write, but pretty much useless in non-academic stuff, unless you were willing to waste long hours for basic stuff. At the time I had 6 years of Pascal behind me and 1 year of C.
    As soon as I picked up a C# manual however, it took me a couple of weeks since "Hello World!" to a useful application with a GUI that fulfilled an actual purpose (defining and solving sudoku puzzles).
    It took me 1 month, from zero knowledge of HTML, CSS, JS or PHP, to an interactive image resizer/flipper/cropper.

    If I hadn't known that there are languages besides Pascal and C, I would've enrolled in theoretical physics instead of CS.
  • 0
    @kieni the truth is, that effective teaching is about breaching walls in the mind. It's about impressing, doing amazing stuff, with modest effort.

    It's been established that this fact is the reason why so many pupils say they are bad at math in schools.
    Making things hard and boring is EXACTLY how you make young people fail, drop out, decide that it's "not for me".
  • 0
    @AndSoWeCode I might be mixing computer engineering and science a bit. I’m technically studying engineering, however we still have a lot of algorithm stuff and so on.

    We started out with java where we developed apps/rest services/small games etc. Then we started with C when learning about CPUs/GPUs (in high performance computing and parallel systems).

    A lot of the others from my team struggles quite a bit transitioning from java to C, so that is what my personal opinion was based on.
  • 0
    @devs C is just hard. They have trouble not transitioning to it, but learning it.

    This is what I was rambling about this whole time.

    Had they been forced into C, they'd stop at "struggling with C". But they were introduced into Java, and now they're good in Java.
    See the difference?

    Sucking at C, and being good in Java while sucking at C, has the benefit of being a very useful asset in any company that has anything to do with Java.

    They KNOW they're good at Java, so no matter how much you poke them with C and how much they look at it with empty eyes, they still know they're good developers.
    Do that with a complete noob, and destroy all hopes for a future as a software engineer.
  • 0
    @RantSomeWhere "C is easy to learn with the right resources and dedication" - dude. I know C. You know C. For some reason we know C. That meant that to us, it was easy enough to learn.

    But you said it yourself: WITH the right RESOURCES and DEDICATION.
    Where does dedication come from?

    You're all saying it, you all know it, but for some reason you refuse to see this.

    Facts:
    1. C is harder to learn
    2. You can teach any CS fundamentals in most other languages that are easier to learn
    3. It takes more effort to achieve something in C than in other languages
    4. People are far more likely to quit if they don't see results soon, have difficulty following, or are bored. If all 3 of them are present, it's a disaster.

    Do you want to be viewed as freaks? Do you want to remain angry at the world because nobody understands you or your job?
    No?
    Well then stop making it a club exclusive to people who pass the initiation rite - C.
  • 0
    @RantSomeWhere "Also you can’t deny the influence that C has on other programming language and devs" - I never denied that. But that doesn't mean absolutely anything.

    Do you start learning old English before you learn English? Do you start learning Latin before starting any of the Romansh languages just because it's a common root?

    That makes absolutely no sense as an argument. Be reasonable.
  • 0
    @AndSoWeCode Okay, that's enough. What level of retarded are you? YOU started out with the "real programmer" thing, a few comments ago; I merely picked it up to make a point and now you're holding it against me? Seriously?

    Also, it doesn't seem like you're reading the comments properly. I never said, that you should use C to teach threading. I just implied, that the concept of threading is something usually taught as part of operating systems theory.

    From what you've been writing so far in this thread, you sound like an angry, disappointed kid who has had some bad experience with learning a language (in this case C) and now goes around telling everyone how hard and bad it is. To me, THAT sounds like discrimination.

    There are reasons, why certain things are taught in certain ways. Deal with it or start your own course to teach it differently.

    I'd like to apologise to the other readers of this thread. Usually, I'm a well mannered and nice guy. :)
  • 0
    @kieni "From what you've been writing so far in this thread, you sound like an angry, disappointed kid"

    "What level of retarded are you?"

    Can't come up with arguments why force C and now revert to name-calling and psychoanalysis?

    "There are reasons, why certain things are taught in certain ways" - yet you failed to name one.

    Plus things are taught many ways. If you weren't so stuck up, you'd acknowledge that Computer Science is taught with Python, JavaScript, Java, C, Pascal, and pretty much everything else.

    But hey! Thanks for failing early at being a reasonable human being. At least now I won't waste any more time on you.
  • 0
    @AndSoWeCode My gosh, you're right. Let me start over:

    - you can basically teach anything CS-related in almost any programming language, it doesn't have to be C.

    - languages with a higher abstraction level lead to impressive results much faster (and easier), than lower level abstraction languages.

    - aforementioned languages with a higher abstraction level are usually easier to learn.

    - forcing C doesn't seem to be fair, but it is one of the important foundations to modern programming.

    - CS related books use an awful lot of C for that exact reason.

    - I am from Austria, writing in English (not my first language). Why do I have to learn to read, speak and write in English? Because it's the language of computing/programming worldwide. If I don't learn it, I'm excluding myself from a huge part of this scene. Any similarities here to C?

    - You're asking some valid questions, providing some good reasons, but at the same time fail to accept arguments or opinions differing from your own.
  • 1
    @RantSomeWhere I apologise, I'm usually not like that. But when someone's taking something you said out of context, ignoring the content of the actual argument and uses the part taken out of context to put words in your mouth, it's not a discussion.
  • 1
    @RantSomeWhere

    "C might be hard to learn for some people" - now apply statistics to this phrase.

    "the more abstracted a language is the easier it is to learn usually" - I do not agree. It is easy to learn that which appeals to you more. Writing thousands of lines for a simple program is not appealing. It's also not easy to partake in activities that are heavy on punishment. C punishes you hard for mistakes that are easily made. And the third point is that C is not simpler, but more complex, as you have to take care of more details when programming. None of this makes it easier than other languages. Because it definitely is not, and I see no reason why anyone would say that it is.
    C is my second language. The first was worse than C. And I know lots of people who never learned C but are better than me in some aspects of computer science. Lots of people start off from something else than C and have no problem learning new languages or knowing the inner workings of computers.
  • 1
    @RantSomeWhere @AndSoWeCode Well low-level languages like asm or even c force you to think first.
    Especially asm, as you often need to know what you gonna write 12 lines later.
    The higher the level, the more "forgiving" the runtime is. And imho this isn't necessarily a good thing and it'll stop you more and more from think first - code later, which is the better approach in the real world.^^

    E.g. I have massive problems with Unity, mostly because there are 25 ways to do it right, 5 ways to do it semi-right and 100 ways to do it wrong.:b
  • 1
    @daintycode professionals use the best tool for the job. Students must first learn to do the job with Something, without a huge penalty for mistakes or a steep learning curve.
  • 0
    @AndSoWeCode
    - "Writing thousands of lines for a simple program is not appealing"
    Seconded, but as languages are created with a certain purpose in mind, it's a choice of "language for task".

    - "C punishes you hard for mistakes that are easily made"
    Please define "punishes you hard". Every language punishes you in some way for making mistakes. Sometimes it's as simple as an error message, sometimes it's your program crashing with no further information.

    - "[...] C is not simpler, but more complex, as you have to take care of more details when programming"
    Higher languages tend to have more built-in types and larger default libraries, as they abstract more of the hardware, operating system and sometimes even more. That enables programmers to do more with less code. But the work has to be done somewhere. Either directly by the programmer or in the included library. Using an appropriate library/framework, low level languages like C can also follow the idea of "write less, do more".
  • 1
    If someone is completely new to programming, and haven’t caught the interest yet, I see why you would loose interest quickly with C.

    I myself started with VB.net because it’s easier then C#. Then moved on to C#, PHP, JS, Java, Elixir, C etc.

    There are a few things though that only languages as C (and similar) can teach.

    Java can’t teach CPU cache, memory usage optimisation, high performance computing etc.

    At my university we started out with java. Now we have a course called parallel systems, which focuses on HPC primarily. A lot of people now struggle with C to even understand what is going on
  • 0
    @devs the thing about high performance computing is that the time for single thread optimization has long gone. I get that if you're writing THE software that manages a thousand clusters, then you need that extra performance. But the vast majority of developers will likely just work on a VPS somewhere or an EC2 instance or a few of them or something. If performance is the issue, one would likely go buy more instances than optimize small stuff.
    The skill that is valued more is being able to make these clusters work together, scale quickly, and do it easy and fast.

    I'd like to stress out that I acknowledge that kernel and driver development, as well as optimization, is necessary, but that is a handful of developers. I mean 90% of the world doesn't even have the opportunity to work in this field even if they're really good at it.
    That's why my position is that requiring C is akin to requiring CUDA. It's good, current and useful, but only for a tiny amount of careers.
Add Comment