Do you really need to know C? I think so.

I’ve been following the podcasts that Jeff Atwood and Joel Spolsky have been doing for StackOverflow.  The podcasts are not really technical in nature, in fact they really do not have anything to do with what will ultimately be the purpose of the site they are building.  They are more documenting the discussions and decisions they are making while creating the site.

I’ve only been through the first few so far, but an interesting discussion has come up in both podcasts about whether or not programmers should know the C programming language.  Jeff does not know C and seems to come down on the side of the argument that this knowledge is not necessary.  Jeff hasn’t specifically said this out loud, that I’ve heard, but I gather this is his opinion based on how the conversation seems to flow.  Joel, on the other hand, is of the opinion that programmers should have knowledge of the lower levels of programming even though it is not part of their daily job.  His thinking on this is that the lower level knowledge gives programmers an edge even when programming with the higher level popular programming languages of today.

I have to agree with Joel on this.  In my experience working with programmers in both categories, those who have a background of knowledge of the lower level programming languages always seem to be quicker at solving more complicated problems.  Of course, there are exceptions to this rule but I would say 98% of the time this is true.

It is interesting also that when this topic comes up with colleagues, it is almost split right down the line in opinion with those who do not know C believing it is not necessary and those who do have experience with C believing this sort of experience and knowledge makes them a much better developer.

One good example supporting my argument (actually Joel’s argument) is garbage collection related issues.  I’ve seen programmers spend a huge amount of time attempting to understand why the runtime memory size of their program is continuing to grow when, in their minds, the garbage collector should be coming to the rescue.  Of course, the problem is usually that they somehow have a reachable reference to a huge collection of objects or something of this nature (usually several in fact).  Programmers with the lower level knowledge seem to pick up on these sorts of problems much quicker.

Another area I have seen many issues with is threading.  Languages like C# and Java make threading a reachable concept for the programming masses.  This is a good thing unless you do not understand the underlying concepts of threading.  I cannot begin to calculate how many conversations I have had with programmers concerning the thread safety of their methods.  I also cannot count the number of blank stares I have received when I ask about the concept of thread safety in interviews.

I know that most will say that I am bringing up edge case problems that are not normal in business programming.  I am willing to concede that.  However, I also agree with Joel’s approach in that I tend not to hire programmers that do not have this knowledge because it happens often enough to be a problem.  There are exceptions, but those programmers are “exceptional”.

Tags: ,


43 Responses to “Do you really need to know C? I think so.”

  1. James on May 22nd, 2008 10:16 am

    By take on it is that programmers don’t need to know C, but should understand (to some extent) what’s happening under the covers of their programming language.

    The examplese you cite (threading & GC) absolutely do not require a knowledge of C, assembler or any other low-level language; they do require an engaged and inquisitive mind and a desire to learn – all pre-requisites for good programmers anyway.

    I do, however, think that all bloggers writing in English should know the English language. “of coarse”!? “blank stairs”!? Pathetic.

  2. markus on May 22nd, 2008 10:37 am

    Actually there is another point of view.
    Languages such as Ruby, PHP or Python (maybe even Haskell) seem to support the notion that one does not really need C. At least not for most stuff.

    The performance penalty is neglectable compared to the huge productivity gain one gets.

    I hope these languages altogether will benefit largely, because it allows us to go AWAY from C finally rather than the need to STICK to C (or C++ for that matter). (Java never was a real alternative towards the low level stuff, i.e. there is still no Java Kernel like the Linus kernel)

  3. Bob on May 22nd, 2008 10:54 am

    Blank stairs.

    Also, James, look in the mirror.

  4. dude on May 22nd, 2008 11:05 am

    coarse -> course
    stairs -> stares

    A blogger should have knowledge of the low-level workings of the language they’re using (in this case, English).

  5. naasking on May 22nd, 2008 11:09 am

    > Of coarse, there are exceptions to this rule but I would say 98% of the time this is true.

    And 97% of statistics are made up on the spot!

  6. Eric Larson on May 22nd, 2008 11:35 am

    I’m curious what the benchmark is in order to “know” C. Technically, I could say I “know” C in that I have written and compiled C code that actually went into production. Does that mean I understand pointers and memory management intimately? No, I really don’t.

    I do think understanding C is important. It may not be critical in all cases, but it is definitely is useful understanding large concepts. The big question on my mind is what is enough.

  7. Darren Stokes on May 22nd, 2008 11:39 am

    Ok. I get it. I’ve corrected the coarse thing and the stairs thing.

    That is what happens when I write a post before that first cup of coffee and use a blog writer with no checking for that sort of thing.

  8. Darren Stokes on May 22nd, 2008 11:47 am

    Eric, you are correct. Joel and Jeff’s talk was specifically about C, but what they were really getting at is knowledge of memory management, pointers, etc. You can come by this knowledge in many ways. I think the main point is that many developers do not understand these types of concepts and I believe it hurts productivity.

    markus, you bring up a good point about productivity which is why these higher level languages you mention are used at all. I believe that a knowledge of the lower level lends itself to a greater programming capability at the higher level. For instance, the best programmers I ever saw using VB were also able to write a windows program using C++. The higher level programming language allowed them to be more productive, but their lower level knowledge allowed them to take more advantage of the language and solve problems they encountered more quickly.

  9. Roy Park on May 22nd, 2008 1:30 pm

    I’m also in Joel’s camp – there is no way an “expert” developer can call himself that if he/she cannot understand the underpinnings of the machine. In fact, I would argue that C is the “assembly” of today, and although one can get by writing in Java/C#/Ruby/Python/etc… one can only truly understand the bugs and run-time performance if he/she knows how to program in C. Not to sound like a marketing person, but if there are any dev’s dying to know, my favorite C book is “Expert C Programming” by Van Der Linden. This is the 2nd book on C that should be on any programmer’s bookshelf, and will tell you everything you need to know about C(pointers, memory management, C runtime data structures, processes).

  10. r on May 22nd, 2008 1:55 pm

    It’s interesting that examples you give of problems with C# and Java (threading and memory problems) don’t occur in shared nothing web programming environments. (PHP, Rails, etc.)

  11. ace on May 22nd, 2008 1:56 pm

    actually developer has to know machine and that’s kind a hard to learn from height.

  12. Darren Stokes on May 22nd, 2008 2:07 pm

    r, I would disagree that threading and memory problems don’t occur in web programming environments. Those concepts might not be expressed in the programming languages utilized to build the application logic, but they are certainly implemented in the runtime environment that the application executes in. In fact, concurrency issues arising from multiple requests are a problem that should be understood by all web developers utilizing PHP and Rails as well as any other language.

  13. Michael Terry on May 22nd, 2008 2:33 pm

    There’s no question knowing C is helpful to some degree, as learning anything programming related would be helpful to a programmer. Is it a difference maker? Is it worth learning if you don’t know it and won’t be using it?

    It’s not very interesting to say, paraphrasing, “programmers who know C say it’s invaluable while those who don’t don’t”. You’ve already as much as said that programmers who know C are better programmers. A defensive person might even think you’re suggesting those who don’t know C aren’t “real” programmers. Of course C programmers will say that, for the exact prejudice you’re expressing. It makes them part of an elite club. It was hard won knowledge. It’s prestigious and sets them apart professionally.

    Another problem with your analysis is that better programmers probably tend to know C just because they’re better programmers.

    Another problem with your analysis is that you use as evidence that 98% of the time, a developer who knows C can solve a problem faster than one who doesn’t, in your experience. I would bet dollars to donuts that confirmation bias has played a role in creating that figure in your head.

  14. r on May 22nd, 2008 2:39 pm

    I have found that concurrency and memory problems don’t occur in shared nothing environments. Concurrency issues are handled by the web server and the database server. Memory is reclaimed after every request. The MySQL, PHP, and Apache devs have thought about these issues but they very rarely trouble the application developer.

    People write successful PHP applications without even realizing these issues exist. I have seen PHP applications written by doctors and real estate agents. The code is spaghetti but the applications work without concurrency or memory problems.

    If you have shared state and long running processes like Java or .NET then you will encounter these problems.

  15. Darren Stokes on May 22nd, 2008 2:53 pm

    Michael, I’m not sure that knowing C is all that elite. As far as I know, pretty much everyone with a computer science or engineering degree would have taken a programming course that at least had an assignment in the language. It has been a while since I was in college so this might have changed in some cases but I would imagine this is still true for the most part.

    I wouldn’t say that just because you know C, you are a better programmer, although I probably implied that. I would say that knowing C gives you a better understanding of the lower levels of application architecture. Having that understanding, in my opinion, makes you a better programmer. There are other ways to come about this knowledge.

    The 98% is my estimate (guess, stab, WAG, etc.) based on my experience. As another comment stated, 97% of statistics are made up on the spot and this one was.

  16. Jonathan Ville on May 22nd, 2008 3:06 pm

    Should you know C? Yes.
    Should you know assembly language? Yes.
    Should you know how a processor works? Yes.
    Should you know how to build a processor out of combinatorial circuits made of transistors? Yes.
    Should you know how the cache works and how to optimise for it? Yes.

    It is no longer a good idea to write applications in C (unless you want to write an operating system kernel, a computer game, a compiler/interpreter, a program that does matrix operations for maths/science and does them at a resonable speed (cache optimising), a piece of software that needs to run fast on a small device, code that needs to run fast like video encoding/decoding, professional audio/video software, device drivers …).

    I don’t use C very often, but there are cases where it is the only option because of speed. Computers are incredibly fast these days. Writing code that runs 20x faster for most things doesn’t make a noticable difference to the user. But for some long operations, the difference between having an operation take 10 seconds and 3 minutes is important. Similarly, having your computer game freeze every so often because the garbage collector decides it wants to clear things up at that moment is not nice for the user.

    Also, how can you call yourself a programmer if you don’t even know what’s going on inside your computer?

  17. Darren Stokes on May 22nd, 2008 3:07 pm

    r, I understand what you are saying. It is that rarely part that I am saying is the edge case. You’re correct that php does tend to save you from yourself for the large part and I too have seen successful php applications written by users that are not trained in computer programming. These applications that I’ve seen are not complicated, however, so I would say that to develop something very sophisticated I still think the lower level knowledge is helpful.

    I think a php application I’ve had to work with lately might have been written by one of those doctors. 🙂

  18. don on May 22nd, 2008 3:13 pm

    you’re right. anyone who doesn’t know C isn’t a programmer. that VB/PHP/Script-kids are just pathetic.

  19. maht on May 22nd, 2008 3:22 pm


  20. Konrad on May 22nd, 2008 4:10 pm

    Why should C be seen as special in this regard. I think I have a reasonable grasp of how programs work, and I’ve delved down into details like Java byte code, and the lower levels of lisp.

    yes lisp can be quite low level. the original meanings of car and cdr where contents of the A register and contents of the D register, though I forget what processor that was on.

    To sum up I disagree with the specific argument that programmers must know C, but I agree with the general argument that programmers need to understand how computers go about executing software, manipulating memory etc.

    Likewise a good programmer will have some understanding of how the language they are using is implemented. Any why some ways of expressing a particular operation may execute faster then the alternatives.

  21. Darren Stokes on May 22nd, 2008 6:26 pm

    Konrad, C could been seen as special because the major operating systems in use are implemented mostly in C. Because of that, the primary APIs for those operating systems are all published in C.

    I’ve had to make native calls from java in the past and the interface for doing that (JNI) was C. When I’m using C# and need to make a native call, C is what I am interacting with (Windows SDK). It helps me to know C in that case even though the code I’m writing is still C# because all of the data types I pass must be C data types.

    As you stated, there are many languages that can be used for lower level operations but I believe C is likely the most common and probably the path of least resistance.

  22. Seriously on May 22nd, 2008 8:19 pm

    Not knowing C makes you all halfrate programmers.

    Thats all there is to it. If everything, everywhere, at its core has C behind it. And you dont know C, then you’re absolutely halfrate at best.

    Most competant C programmers, when adapted to other languages, outpreform their peers at the same tasks with little or no struggle. Like olympic swimmers competing with retarded toddlers for a gold medal.


  23. K on May 22nd, 2008 10:04 pm

    I’d be the last one to deny that people *should* know C — if mostly because, as mentioned, fluency indicates a significant understanding of the way the machine works — but I think there’s a larger statement here.

    If I may be allowed to over-interpret, this argument is being framed in terms of, “Shouldn’t have to learn C, and feel no compulsion to do so.” Jeff is a pretty well-respected, so I have to imagine his code is up to par, and I think he’s right that he doesn’t necessarily need to learn C. On the other hand, I’d also imagine that if he were put in a room with C and a project, he’d solve it. Learning C well entails learning the way the machine works, but learning the way the machine works by no means implies that you have learned C.

    Programmers that are worth their salt should be excited to learn new languages, even if they view them as possibly irrelevant: they recognize that they’ll be better with multiple flavors on the brain. Take, for example, the recent release of Fortress; it’ll probably be useless for me, and prototyping and developing applications will be much simpler and more accurate in other languages, but I’ll be damned if I’m not excited to explore what that paradigm might hold.

    The general point is that there is a difference between, “I don’t think I absolutely have to learn C,” and, “I won’t learn C.” I don’t think that you’re conflating the two in your post, but some of the comments definitely seem to be tending that way.


  24. Avinash Meetoo on May 22nd, 2008 10:55 pm

    Is there such a thing as a programmer who does not know C? Is that humanly possible?

    Anyway, I wrote a blog post “On the necessity to master C” ( a year ago but in the context of CS education.

  25. ace on May 22nd, 2008 11:25 pm

    well you can read:
    to know what’s that all about. if you are curious if you are curious to know more you can read:
    it should take more than 15 days wiht one hour per day (coffe break included) for any decent high level language programmer to comprehend basic concepts. you don’t need to “learn” to write software in c. and by no means c is required to learn how machine works. there are assembly language and binary code.
    i disagree that c programmers excel in high level language per se. they often have issus comprehending oo concepts and architecture. however, c knowledge helped me to understand some high level ideas about functional languages, not knowledge from oo high level languages.

  26. bplus on May 23rd, 2008 12:39 am

    I haven’t taught myself c yet (i’ve dabbled though), and I work as a junior c# developer. I’ve realized that there is a massive gap in my knowledge so I’ve decided to go one further and learn assembly.
    Joel recommends the book “Programming From The Ground Up” which is an introduction to programming using Assembler, the author essentially thinks its ridiculous to teach programming without teaching how the computer actually works (i agree). The book teaches a little c at the end. I have had a lot “A Ha!” moments in the first two chapters alone. And the book is available for free under a GNU license:

    or you can buy a paper version.

  27. Andrew Bettison on May 23rd, 2008 1:04 am

    I think that, in this case, “knowing C” really means “knowing the deeper abstractions”. Joel wrote about leaky abstractions in 2002, and our programming languages are full of them:

    In C, the issue of underlying byte order and word size leaks into otherwise portable code, so you have to know about memory layout. Other leaks from assembly level are stack layout and un-initialised memory contents (giving rise to buffer overrun security holes and the recent Debian SSL key fiasco). In Java, the issue of native synchronisation leaks into the semantics of threads. Even in a hermetically sealed language like Haskell, the issue of compiler implementation leaks into run-time performance, which forces simple, understandable, slow code to be rewritten to complex, obscure, less-slow code.

    Given this, it’s obvious that the more you know about the underlying layers of abstraction, the better you’ll be at negotiating the leaks.

    Twenty years ago, when C was the lingua franca and the latest chips were the Motorola 68000 series, my peers and I considered it essential to know assembly, the workings of the CPU, MMU, possibly the FPU, and bus arbitration logic. These days, programmers working in C have to know about caching and other memory wierdnesses which no longer concern me, because I now spend most of my time in Java or Python or C++, and performance depends on algorithms and data structures, not CPU cycle counts.

    So today, for programmers near the leading edge, C is our next layer down, and it collects most of the abstraction leaks in the modern languages we use. Hence the insistance on “knowing C”. But tomorrow, when the action is in the next layer up — imagine that storage, computation, and applications are all distributed services — the veterans will be advocating knowledge of just any programming language with access to socket and local storage library calls. The specific memory model issues that programming in C teaches will have passed from view, but the same principle will still apply.

  28. Mike Dimmick on May 23rd, 2008 7:09 am

    r, Java via EJB and JSP and C# via ASP.NET are also shared-nothing architectures, and these problems also are taken care of by the web server and framework. For most problems, anyway. These issues start to arise when you want to create a shared cache of data retrieved from your database, shared among all requests and sessions. It’s even more important when you start performing write-through or write-back caching, updating your cache as well as the database. For some levels of system scalability, caching becomes a necessity to take load off the database server(s). Few PHP and Rails applications scale up this far, but when they do, they also have to deal with this situation, and the tools are much poorer.

    Contrary to Jeff’s opinion, performance does still matter. Performance of a single web request affects the overall scalability of the website, because the server farm has a finite number of processor cores, and the number of cores as a ratio of the number of requests is tiny, so requests have to queue for a processor. Time spent in a critical region affects the wait time for code to enter that critical region. Understanding what’s going on and using the appropriate tool for the job really will make a difference.

    I would recommend Herb Sutter’s presentation to the Northwest C++ Users’ Group, “Machine Architecture: Things Your Programming Language Never Told You”, to any programmer, not just C++ developers.

  29. Mike Dimmick on May 23rd, 2008 7:16 am
  30. Crouching tiger, coding monkey » malloc Wii Fit on May 23rd, 2008 7:59 am

    […] of people are talking about choice number one. Well, perhaps talking isn’t the right word. Flaming? Fighting? Insulting one’s intellect? Yeah, any of those would […]

  31. Robert S. Robbins on May 23rd, 2008 9:31 am

    There is nothing that can’t be done by copying and pasting VBScript. That is how I program. Seriously though, the only threading I’ve done involves making asynchronous web requests which I need to understand better.

  32. David McArthur on May 23rd, 2008 11:20 am

    Nothing is more boring than spelling flames.

    And no one is more incompetant than so-called progarmmers who don’t have a thorough and deep understanding of either C or machine language.

  33. Andrew Badera on May 24th, 2008 2:58 am

    Necessary? No. Valuable? Absolutely.

    I’ve been writing code since the age of 7 — about 22 years now. I’ve written BASIC/BASICA/GW-BASIC, QBasic, Visual Basic, VBScript/JScript/ASP, Java, JavaScript, PHP, Python, VB.NET, ASP.NET and C#, where I spend most of my time these days. I’ve dabbled in C for an old MUD, I’ve hacked my way through a limited amount of C++, mostly for mobile work, plus a class or two as a freshman some years back. I am an active member of the development community, organizing Code Camps, presenting at user groups.

    But all that said, I have weak C/C++ experience. I wish I had more. I also wish I had more ASM experience. However, I have a great job as senior software engineer for a managed care provider, CTO for a startup, and a steady stream of consulting on the side. At my day job alone, I’m in the 80th percentile for my role, according to the latest IEEE numbers.

    So you tell me, what do you define as “necessary?” Would I like to be able to do more hardcore programming? Models, simulations, maybe game/video stuff? Sure, that could be fun. But I’m pretty happy where I’m at, and I’m pretty well paid to boot. Define necessary.

  34. Tom Clarkson on May 24th, 2008 8:07 pm

    It used to be necessary, now it’s useful enough to have people argue that it is necessary, and in future it won’t mean much at all.

  35. Michael on May 25th, 2008 9:57 pm

    I think at whatever level of programming you are working at…you need to understand possibly one to two levels underneath. That has nothing to do with C per say, it’s just that at the current level of modern garbage collecting, managed code systems, it is somewhat advantageous to understand what’s going on in the level below you. I’m sure 30 years ago, people had discussions that C programmers really needed to know assembly or be able to read machine code in order be truly “good”. And I think 20 years from now when programming involves dragging around symbolic constructs on environments that auto-gen your code, “developers” will say that to be good, you actually have to be able to read and write “code”.

  36. G. Lynne on May 26th, 2008 4:37 pm

    The following excerpt from:
    reflects my own opinion quite nicely.
    C was invented for the purpose of writing an operating system that could be recompiled (ported) to different hardware platforms (different CPUs). Because the operating system is written in C, this language is the first choice for writing any kind of application that has to communicate efficiently with the operating system.

    Many people who don’t program very well in C think of C as an arbitrary language out of many. This point should be made at once: C is the fundamental basis of all computing in the world today. UNIX, Microsoft Windows, office suites, web browsers and device drivers are all written in C. Ninety-nine percent of your time spent at a computer is probably spent using an application written in C. About 70% of all “open source” software is written in C, and the remaining 30% written in languages whose compilers or interpreters are written in C. [C++ is also quite popular. It is, however, not as fundamental to computing, although it is more suitable in many situations.]

    Further, there is no replacement for C. Since it fulfills its purpose almost flawlessly, there will never be a need to replace it. Other languages may fulfill other purposes, but C fulfills its purpose most adequately. For instance, all future operating systems will probably be written in C for a long time to come.

    It is for these reasons that your knowledge of UNIX will never be complete until you can program in C. On the other hand, just because you can program in C does not mean that you should. Good C programming is a fine art which many veteran C programmers never manage to master, even after many years. It is essential to join a Free software project to properly master an effective style of C development.

  37. Lyndar on May 28th, 2008 4:48 pm

    As with any other subjective comment on software languages, there is no absolute answer.

    Is C a magic language? No.

    Can C teach me lessons that no other programming language can teach me? No.

    Does C teach certain programming lessons that some other languages do not? Yes.

    Are a lot of programs written in C? Yes.

    Does use of C promote awareness of some programming issues, such as memory management? Yes.

    Is any of this relevant to all programmers in all situations? No.

    It would be nice to have absolute knowledge of precisely what happens in the machine, but honestly this requires an absolutely ridiculous amount of effort. Think about it – start with your favorite high level language, then through potential intermediate levels to assembler, to machine code. Oh, what about the OS. And the hardware level, what instructions does the CPU handle, how are they pipelined? Does your app touch TCP/IP? How solid is your knowledge of the TCP/IP stack? Does your app send email? Make use of FTP? Use printers? Encryption?

    Personally, I feel that programming is all about choosing the best level of abstraction. If for the purposes of writing program A, you don’t need to know about anything beneath a certain level, then don’t worry about it. If for performance reasons or other reasons it becomes important to make use of C, then by all means do so. ‘Complete’ knowledge in the literal sense, however, is not only irrelevant but impossible.

  38. Jax on June 5th, 2008 5:14 am

    I don’t know any C but I do know how the GC works and I also understand thread safety very well.
    I have 6 years experience with .NET. Does this mean I still need to learn C or can I just learn the inner workings of my platform better (the CLR) as I have done?

  39. Akiba on June 30th, 2008 2:17 am

    I won’t take a side on this debate, but I come from a background of programming on memory constrained devices (ie: embedded systems). On PC and distributed computing projects, you may not need to know C since Java and C# seem to work well and take care of a lot of the mysterious details. But when I see people talking about programming embedded systems in Java, I can only laugh.

    By the way, my open source Zigbee stack, which is similar to a TCP/IP stack, is currently 30kB. I’d like to see a Java or C# programmer pull that one off. Ha ha ha…

  40. Paul Fortin on August 4th, 2008 6:07 am

    ok so why should good programmer’s then not know assembly language, after all pointers, memory management and thread/task handling can only really be done in assembly so if you want to really really know how the you need to know assembly.

    BTW I am on Joel’s side of this argument even if I don’t appear to be. I have coded in ‘C’ for the better part of 18 years realtime military systems and have several million lines of code in operations now. But my language of choice now is Java and I do understand the inner workings and sometimes this is helpful. I am not saying that it is completely necessary but I usually can explain to others why their code does not work.


  41. Daniel on January 8th, 2009 6:46 am

    Guys, you don’t need to know C. As long as you know assembler and how it relates to machine code, that’s good enough. Or you could just know machine code, that’s good enough too.

    C it’s just an easier way to acquire most of that knowledge. It’s not that C syntax is particularly enlightening. It’s not that C has advanced features. On the contrary, it’s C’s bareness that makes it ideal to ACQUIRING the knowledge.

    C maps into assembler very directly. It abstracts CPU registers and stack-related stuff (stack pointer, frames, function call and return, etc). Thus, any non-trivial program you happen to write in it will teach a lot about how a computer works, which is the whole point.

    Personally, I recommend writing a compacting program that uses the Lempel-Ziv-Welch algorithm, but a compiler will do nice too.

    It’s not that C will enlighten you. It’s that writing a program os middling complexity in C will teach you how the computer works, and THAT will enlighten you.

  42. Anon on January 26th, 2009 2:43 pm

    I’ve seen some VBA in Excel written by C programmers, and all that elitism went right out the window. Sure, a C programmer will know all about the underpinnings of the system, but that doesn’t mean they can convert business requirements into maintainable business software. Sure, that VBA code worked. But try and maintain a 1000 line, single VBA Sub() loaded with (code page) labels and GOTO statements.

  43. To Learn C or Not | Thought Clusters on August 14th, 2009 11:43 am

    […] of the discussed topics on Coding Horror. One of the subjects that caught my attention (and others as well) was the fact that Jeff did not know the C language and didn’t feel that it was necessary, […]