What do you want to see in Learn C The Hard Way?
I want to see more young programmers doing systems programming and making cool things with the language that forms the basis of almost everything we use.
What do you want to see covered in a 'book' that purports to teach C the hard way? :)
I will be following Zed's example, although I'll be influenced by my learning under K&R. I really do want to be demonstrating proper, modern C.
[+] [-] there|15 years ago|reply
if there are any buffer overflows, integer overflows, off-by-one's, signedness issues, failure to check return values of everything, use of typically insecure things like sprintf instead of snprintf, all of these problems will just carry over into your readers' code. please do us all a favor and stress the importance of writing secure code from the ground up and not as an afterthought or something only done just before releasing it.
[+] [-] anigbrowl|15 years ago|reply
I've always felt that teaching 'don't do that, cause it's bad' sticks rather poorly - unless something that obviously dangerous is involved, making your own mistakes is much more educational than memorizing a set of best practices and never even peeking into those blind alleys or pitfalls. You can do that and have good habits, but you'll have a dogmatic rather than a fundamental grasp of the knowledge, and this will constrict further development.
[+] [-] gchpaco|15 years ago|reply
[+] [-] misham|15 years ago|reply
It would be nice to provide links to articles and books on why one should use snprintf instead of sprintf or what is integer overflow and how do you deal with it and other topics for writing secure code.
However, as a beginner, it will simply not register since I'm more worried about having used a period instead of an arrow to access a struct member.
Perhaps, instead of writing a beginner C book, an advanced C book is needed more.
[+] [-] ced|15 years ago|reply
[+] [-] alnayyir|15 years ago|reply
I can reinforce each lesson/problem you're describing one by one through the exercises, but a new person simply wouldn't know good code if it slapped them in the face.
Confer with Learn Python the Hard Way to get a feel for the aesthetic and technique I'm working towards.
I don't want to write bulletproof code, I want to teach them how and why to write bulletproof code.
I'm not qualified to meet that kind of lofty standard anyway.
[+] [-] zedshaw|15 years ago|reply
Other than that, pretty much the same style as I did LPTHW.
Also, read:
http://sheddingbikes.com/posts/1288945508.html
There's more advice there.
[+] [-] alnayyir|15 years ago|reply
[+] [-] adambyrtek|15 years ago|reply
Show the relation between pointers and arrays. Offer some best practices on using pointers. Explain the most common caveats like buffer overflows, problems with null terminated strings or off by one errors.
[+] [-] cperciva|15 years ago|reply
[+] [-] loup-vaillant|15 years ago|reply
C doesn't syntactically distinguish rvalues and lvalues, so this level of indirection often goes unnoticed. I strongly suspect this is why learning pointers is often hard: trying to grasp an additional level of indirection before having comprehended the first one is nearly hopeless.
[1] Variables are containers for values. This is isomorphic to a constant pointer to a mutable cell.
[+] [-] misham|15 years ago|reply
In the context of writing a driver, you will have to cover concurrency, multi-threading, semaphores/mutexes, function pointers (callbacks), memory management, etc.
One personal side note, would be nice if you integrate TTD into the projects. The number of C developers that I deal with who do not understand the concept of a unit test is amazing.
Also, please cover C99 and talk a little about compilers, linkers and assemblers. You can concentrate only on one binary format (doesn't matter which one) as long as you explain a little bit about how your C code gets converted into machine format and what does that mean.
I would ask myself: "What makes my book on C different from all the other ones?"
Why should I spend my time on reading your book instead of any number of other tutorials or K&R?
EDIT:
Forgot to add, please provide a public repository for your code examples and start using something like Git right away. That's one thing I really enjoy from all the Rails books, they push you into using an RCS immediately.
[+] [-] zedshaw|15 years ago|reply
It'd also dilute the focus of the book.
[+] [-] alnayyir|15 years ago|reply
There might be a project. I'm modeling it after Zed's approach to some degree regardless.
>(I am assuming kernel and driver development)
Not particularly.
>turn it into a simple project or write a character driver
Nah.
>People will learn how to write code for the Linux Kernel
That is in fact, the opposite of what I'm trying to do.
I want to teach C, not Linux.
>would be nice if you integrate TTD into the projects
I'll demonstrate how/why, it won't be an integral part of it. TTD is use-case specific, not a universal benefit.
>The number of C developers that I deal with who do not understand the concept of a unit test is amazing.
That's a cultural problem, not a pedagogical one.
>Also, please cover C99 and talk a little about compilers, linkers and assemblers.
I'm going to aim for implementation agnostic insofar as it's possible while keeping them aware of the caveats.
What you're advocating is a significant departure from Zed's example. Not my goal.
>explain a little bit about how your C code gets converted into machine format
Implementation specific, outside scope.
>"What makes my book on C different from all the other ones?"
Out of scope of what I'm worrying about, it's a book, not a startup.
>Why should I spend my time on reading your book instead of any number of other tutorials or K&R?
Pretty sure you're not the crowd I'm aiming for, but I'll be happy if you can glean value from it.
Most C books are provincial or overly prosaic. I'm not interested in explaining, I'm interested in whipping people into coders. They can get their compiler and language implementation from a Comp Sci program.
[+] [-] malandrew|15 years ago|reply
Learn Haskell the Hard Way
Learn Erlang the Hard Way
Learn Common Lisp the Hard Way
Learn R the Hard Way
Besides a "Learn X the Hard Way", I would actually like to see more people try to recreate the style of "The Little Scheme", which uses the socratic method to teach the learner. I think the socratic method requires the user to rack their brain a bit more, but results in much greater enjoyment and retention.
I would much prefer to see these two:
"The Little Haskeller"
"The Little Erlanger"
For example, it would be brilliant if someone can explain monads and list comprehension with the same eloquence as The Little Schemer explains currying and YCombinator.
[+] [-] jimwise|15 years ago|reply
However, none of the Little ___er books are, of themselves, good ways to learn to use the language they are in; they're more like finger exercises when learning piano -- they reinforce your mental muscles to make thinking in the right way for those languages feel more natural.
[+] [-] alnayyir|15 years ago|reply
I'd like to see the little Erlanger too actually.
[+] [-] redstripe|15 years ago|reply
I just had a look on simtel but I couldn't find them. Maybe you should put some effort into scanning old software archives and seeing if you can unearth them. C is pretty old - you wouldn't be the first one that had this idea.
[+] [-] wmat|15 years ago|reply
[+] [-] alnayyir|15 years ago|reply
[+] [-] Jabbles|15 years ago|reply
However, if you wish to try anyway, I recommend looking at "Assembly Language Step-by-Step: Programming with Linux" by Jeff Duntemann. It aims to teach people assembly language as their first language, so you may find it useful.
[+] [-] alnayyir|15 years ago|reply
[+] [-] Tichy|15 years ago|reply
I just wish to learn the current state of the art - what are best practices that have evolved since K&R?
[+] [-] silentbicycle|15 years ago|reply
* Mostly, arena-based allocators.
Paul Wilson's "Uniprocessor Garbage Collection Techniques" (http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.47.2...) is an excellent overview, as is Jones and Lins's _Garbage Collection: Algorithms for Automatic Dynamic Memory Management_.
[+] [-] alnayyir|15 years ago|reply
[+] [-] Teckla|15 years ago|reply
[+] [-] alnayyir|15 years ago|reply
[+] [-] jswinghammer|15 years ago|reply
[+] [-] alnayyir|15 years ago|reply
[+] [-] sleepdev|15 years ago|reply
[+] [-] alnayyir|15 years ago|reply
I'll encourage reusing existing code/libraries.
[+] [-] mprny|15 years ago|reply
[+] [-] dfox|15 years ago|reply
[+] [-] philwelch|15 years ago|reply
[+] [-] dfox|15 years ago|reply
[+] [-] alnayyir|15 years ago|reply
My approach is going to be relatively unflavored by the Macro Hell of other projects. I'd rather not instill those habits. They can learn that on their own time.
I want the learner prepared to write clean sysprog code. That's it, the rest they can learn having been taught proper C and make their own stylistic decisions.
[+] [-] amalcon|15 years ago|reply
You need to go get libraries for a lot of the stuff you'd normally use the standard library for in a more modern language. These libraries exist, and many of them are excellent, but because they're not built-in, people are less likely to use them. This is especially dangerous in C, because it requires so much work to do anything even vaguely complex.
edit: That came off as saying "Teach some libraries". What I really mean is "Teach people to go find libraries."
[+] [-] ronnieCA|15 years ago|reply
[+] [-] alnayyir|15 years ago|reply
[+] [-] crux_|15 years ago|reply
Personally, I think a teaching/review ladder would be as or more helpful than a tutorial text. Getting good at C, at least from my current starting point, seems to mostly be a matter of discipline and practice.
I'm thinking of something like this: http://gtl.xmp.net/
Along those lines ;) I'll probably be releasing code from my first medium-sized C project in a week or so... anyone care to offer tips on how to get more experienced eyeballs on it?
[+] [-] alnayyir|15 years ago|reply
Good thing I'm not writing it for beginners.
>I'll probably be releasing code from my first medium-sized C project in a week or so... anyone care to offer tips on how to get more experienced eyeballs on it?
Uh, that's a toughie actually. IRC can be pretty rough.
[+] [-] wyclif|15 years ago|reply
[+] [-] defen|15 years ago|reply
[+] [-] alnayyir|15 years ago|reply
[+] [-] checker659|15 years ago|reply
[+] [-] alnayyir|15 years ago|reply
[+] [-] systema|15 years ago|reply
[+] [-] callahad|15 years ago|reply