I believe learning C is one of the most important aspects for any programmer. It's a beautiful combination of a high and low level language. Some universities are moving to stop teaching C in the introductory stages and are using Python instead.

Will this move to Python, from C, degrade the quality of CS students? If you miss out on some of the aspects of a low level language, are you missing something important from you CS degree?

  • 2
    Does Python really replace C in CS courses more than Java was accused of doing at some point? I guess in the end hard-core "real" CS courses will remain true to what they are.
    – haylem
    Commented Mar 4, 2012 at 8:43
  • 9
    @nrb: the point of a university should be to teach, not to filter. Commented Mar 4, 2012 at 8:45
  • 6
    First, "learning C" is not "an aspect of any programmer". I'm not sure what that even means. Secondly, this is not a question, but a statement. Thirdly, the question states several enormous assumptions of obviously unclear correctness as if they were fact.
    – Superbest
    Commented Mar 4, 2012 at 11:04
  • 2
    A computer scientist is like a linguist. A one-language linguist is a bad linguist whether that one language is Quechua or Mandarin. You degrade the quality of students by teaching them there's a One True Language. Does it matter if that language is BCPL or SNOBOL? Me, I wish universities would teach Plankalkül.
    – Alexios
    Commented Mar 4, 2012 at 11:59
  • 4
    C is portably assembly. Calling it high level show you do not have experienced true high level languages yet.
    – user1249
    Commented Mar 4, 2012 at 13:23

10 Answers 10


Two things:

  1. Computer Science is not about programming, but about higher-level concepts, algorithms, mathematical foundations of programming, that kind of thing. Any programming language taught as part of a CS curriculum serves as a vehicle to express and implement those concepts, but learning the language itself in-depth is not really a primary goal. As such, Python (being easy to learn, multi-paradigm, and low on boilerplate code) is an excellent choice for most high-level things. However, low-level programming concepts such as memory allocation, bitwise operations etc., also belong in CS, and Python provides little or no access to these, so an additional language is probably required, and C seems to be the best candidate (although assembly would also qualify, even though it's less comfortable to use).

  2. No programmer should enter the work force with knowledge of only one programming language. I believe that being somewhat fluent in at least two (ideally, two very different languages), and having sniffed about half a dozen more (ideally, covering a wide range of styles and paradigms), would be about right. A programmer with exposure to only one language is going to be limited to the thought patterns of that language and its community, and will lack insights gained from other languages and paradigms. Some concepts, such as for example Functional Programmign concepts like purity, currying, closures, or OOP concepts like interfaces, composition, and encapsulation, will only really 'click' once you've used them in a language designed around them. You just won't get to that point if you only ever learned one language, even if it's versatile and multi-paradigm.

  • +1 Very true. Notably, what would one think of a CS absolvent who has never seen a type system? Insofar, Python may be ok, but it must definitely not be the only language.
    – Ingo
    Commented Mar 4, 2012 at 11:02
  • And ideally two languages of different styles. Ie Java and C# are probably not a good pair while, say Haskell and Ruby would be
    – Zachary K
    Commented Mar 4, 2012 at 12:51
  • @ZacharyK: Absolutely right. Added to my answer in this spirit.
    – tdammers
    Commented Mar 4, 2012 at 13:17
  • Personally I think every programmer worth his salt should read "Seven Languages in Seven Weeks". Honestly i would like to hear a programmer has read that book and at least one of the languages rocked his world (I don't care which one, as long as you can tell me why that one)
    – Zachary K
    Commented Mar 4, 2012 at 13:22
  • Theoretical CS isn't about programming, true. But what do you really expect those seeking CS degrees to do with their degree? You can't learn higher level concepts until you're a halfway decent programmer first. Commented Mar 4, 2012 at 14:58

This is an incorrect assumption, followed by an incorrect conclusion.

Teaching programming is about learning how to solve problems with computers. That can happen in a variety of different languages. C is certainly not the best, nor the worst language to start with.

You know what will degrade the quality of CS students? Not preparing them for the workplace by making them use the tools they will actually find there.

  • 4
    Doesn't this answer confuse education with training? Commented Mar 4, 2012 at 15:11
  • Of course it does. What purpose does education have in a vacuum? There has to be a mix of educational foundations, as well as preparation for real-world situations, or else the "education" is almost entirely worthless. Give me an intern that's had a year of on-the-job training over a CS graduate any day.
    – Jordan
    Commented Mar 5, 2012 at 14:21

CS students should learn C (and some variant of assembler for that matter) to understand how computers roll. If you consider yourself not just a code slave, but a developer, you should understand how the machine and the operating system does things.

  • 5
    So CS 101 classes should be taught in ASM? Commented Mar 4, 2012 at 8:21
  • I did not write anything about 101 or first year or something like that. In most countries CS takes four years or more. Commented Mar 4, 2012 at 8:35
  • 5
    Learning C and MIPS as part of the second/third CS class at my university was awesome and very eye-opening. I think not having any low-level courses would be a shame. Commented Mar 4, 2012 at 8:42
  • 2
    I have learnt C at first. C is mother language in programming.
    – user
    Commented Mar 4, 2012 at 9:11
  • 1
    @Lèsemajesté: In fact Donald E. Knuth invented MIX and later MMIX for exactly that reason: Teaching CS 101 using a orthogonal assembly instruction set executed on a VM.
    – datenwolf
    Commented Mar 4, 2012 at 15:31

Many programmers these days would dispute your assertion about the importance of learning C. Many of the tricky points of C, such as

  • keeping track of pointers
  • making sure memory is allocated and deallocated correctly

are no longer relevant to modern programming languages. Kudos to the universities who are recognising this and switching to Python.

  • 5
    I am not against learning new languages or accepting enterprise languages. But as a CS student you should know what allocation/de allocation actually means? Using them or not is a different issue. But a student should know the basics and C teaches exactly that.
    – nrb
    Commented Mar 4, 2012 at 7:57
  • 1
    There are quite a few projects where you can't afford automatic memory management (cf the entire embedded market) and others where manual memory management is a viable optimization. And even if you never need it, knowing what happens under the hood can do wonders for understanding. Also, "keeping track of pointers" exists in any language with reference types to some degree. It may not be as bad as in C, but you'll still have to understand indirection and aliasing, make up your mind on ownership, etc. and being forced to face the issue in C may help with that.
    – user7043
    Commented Mar 4, 2012 at 7:58
  • 2
    @delnan, I mostly agree with you. But I also think that embedded programming and other disciplines that require this kind of fine focus on memory use are becoming more and more esoteric. I feel that C is appropriate to a third year or higher programming course; and that some "memory-friendlier" language is more appropriate for first years. Don't get me wrong, I started out as a C programmer; but I feel that it's a good many years since I really used what I know about looking after memory. Commented Mar 4, 2012 at 8:04
  • 1
    Which language to start with is indeed a different question. I started out with scripting languages, and many things only "clicked" after fiddling with C. As for those sectors becoming "esoteric": Well, desktop application development has switched to other languages a while ago, I'll give you that. But I do believe embedded systems (do you have an idea how many of those things are in, say, your car?) and system programming (someone's got to talk to hardware, push operating systems further, develop virtual machines, etc.) will remain thriving for a long while.
    – user7043
    Commented Mar 4, 2012 at 8:12
  • Managing memory is one thing... understanding memory consumption implications is another. Plus you always have the occasional bug to report in your favorite runtime's implementation...
    – haylem
    Commented Mar 4, 2012 at 8:44

I totally agree that learning C is very important for programmers. It's the most well designed language (in my opinion).

But, I also think that for beginners, it may be OK to not start off their programming journey with C. Learning Python is GREAT experience, and learning C may not be that great at first. And for newbies, a good first impression of programming may be more important than learning the squiggly syntax of C pointers and pointer arithmetic. Hence the move.

  • 4
    C's design is horrible. It is unnecessarily hard to parse and compile, and it is full of edge cases and inconsistencies. It's still important to learn though, as it is the de facto standard systems programming language.
    – tdammers
    Commented Mar 4, 2012 at 9:19

Pointers and memory and stuff are hard things to explain to new students, what i see in my area is that "harder" languages are being displaced by this "newage" stuff like Python and Java. Those are easier to explain than for instance C++, Perl, even Basic. What i think that degrades understanding is just throwing OOP and ready made Modules at students. In the end they don't really learn anything Computer-Sciency, just to parse some data into another thing with a scriptable tool. Starting by the easy stuff just breeds lazy minds, not lazy programmers, wich we need. But well, TLDR; version: Python is for lazy teachers, C is for good brave teachers. edit: I'm not flaming Python, it's great, but it's the kind of thing you have to learn on your own or with a community, but C needs a place in CS courses.


You must learn C but you might be better off with that not being your first language

I am core C programmers for a decade now so i might be biased. I think - Learning C is a MUST. It forces you to closest to hardware programming (even if you are no long doing assembly). For example, it really make you think in terms of how computer uses memory, heap and stack. And of course, it will be hell on earth if you happen to try understanding Assembly before you try to learn C.

Stealing comment from @TikhonJelvis

I think not having any low-level courses would be a shame. –

However, having said that- understanding how machines work is still not everything. How to program is rather elementary thing you should learn before getting deep into how machines will interpret that - so in general, whenever C was being used as a first language. So using higher level language, something which gets you started more quickly and avoid some initial hickups might make you learn some other aspects

Also, after learning to do problem solving with programming, one can reasonably delve in to design and modeling aspect again C isn't really the most important language there. I think there is a great upswing in use of Perl, Python in many machine learning, web/data mining, information retrieval, bioinformatics class of applications (the top current research areas for CS folks over say topics like networking) where you are conceptually very higher up. They are replacing languages like Fortran rather than C.

Learning C is one of the most important aspects of any programmer.

That is, at best, highly subjective, and I, for one, completely disagree. I think it is a good thing that universities are teaching languages which are more relevant to 2012. I think that learning C is a waste of time.

  • 1
    Learning C for the sake of saying you have learned C is a waste of time. Learning C for specific problem solving and learning experiences is not. One of the best courses I studied at university was operating systems with an awful lot of C.
    – Amy
    Commented Mar 5, 2012 at 13:45

Programming courses teach you about programming and Python is excellent for that. C is not as great to teach about general programming. Programming is not about understanding computers, it's about creating applications. The tools we use to create applications are constantly evolving and so should CS courses.

For teaching how the computers work, there are different courses. They can show examples of low level computing with ASM or C.

C is also great tool for embedded and low latency programming so if you have courses about those subjects, you can use C.

My answer is: students aren't being degraded. CS is being made more accessible and keeping up with the times.


If you only want to learn to write algorithms, I guess Python is OK. If you want to learn how the underlying computer works and, among other things, how Python programs are executed, you need a more low-level language like C.

The question also seems to contain a hint to the idea that Python is a more recent, up-to-date language and universities tend to update their curricula to support current technology.

With respect to this, I think this is OK in principle, but universities should not be too obsessed with using the latest technology for teaching because

  1. Universities should teach students the concepts of computer science so that they can think independently about programming languages and other tools. Universities should not prepare potential slaves who are just able to implement what they are told to using the most fashionable language of the moment.
  2. A language that might be very popular today, might be obsolete ten years from now: university should concentrate on basic stuff, not on teaching a particular technology in depth.

So, Python might be more useful and more concise for certain practical applications, but it does not cover certain basic concepts (like memory management, efficient implementation of data structures, etc) that are covered by C. Therefore, I think that C (or a more teaching-oriented language like Pascal) should be part of the curriculum of universities.

  • If you want to know how a computer actually works, it's better to learn VHDL than to learn C. Commented Mar 4, 2012 at 15:14
  • Probably I should have used a better formulation. I meant the underlying model of computation (stack, heap, data structures, etc) that is still the basis of all higher-level languages like Python, Java, Ruby, etc.
    – Giorgio
    Commented Mar 4, 2012 at 18:01

Not the answer you're looking for? Browse other questions tagged or ask your own question.