
What do you want to see in Learn C The Hard Way? - alnayyir
I bought the domain to force myself to do something with the free time I'll soon have an abundance of.<p>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.<p>What do <i>you</i> want to see covered in a 'book' that purports to teach C the hard way? :)<p>I will be following Zed's example, although I'll be influenced by my learning under K&#38;R. I really do want to be demonstrating proper, modern C.
======
there
whatever you do, make your examples bulletproof. even if it's not how you
would normally write the code and it seems overly cautious, do your audience a
favor and write the example that way anyway.

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.

~~~
alnayyir
I don't think the learner would appreciate the subtleties, and I don't agree
that they'll learn anything from it.

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.

~~~
there
_I don't think the learner would appreciate the subtleties, and I don't agree
that they'll learn anything from it.

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._

that is my point: your readers might not understand everything you're doing,
so they're just going to copy and paste parts of it into their new projects.
if you give them sloppy code to learn from, they're going to copy that
sloppiness into their code that makes its way into the real world.

there are a lot of things in c that new programmers have to be especially
careful about that aren't relevant to python.

~~~
kingofspain
Agreed. I was littering code with schoolboy mistakes for a couple of years
because of this. The complex stuff was great (heh) but some of the absolute
basics were braindead because I thought I knew it. I'd been doing that stuff
from day one and never had a problem... Until I did.

------
zedshaw
My plan was to make people use valgrind all the time after about lesson 10.
Rather than you having to teach them all the various errors, you just let
valgrind teach them by telling them their stuff must be valgrind pure.

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
I sent an email after reading that post, was inspired to do this because of
it. I planned on having them use valgrind as well.

------
adambyrtek
Make sure you explain _pointers_ well, the additional level of indirection
introduced by them is usually hard to grasp for beginners.

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
Even better, make sure you explain _function pointers_ well.

~~~
pasbesoin
Some years ago, I ran across and saved off a copy of a some-dozen page
reference, in PDF format, titled something along the lines of 'everything you
(will) ever need to know about pointers (in C)'. It appeared to be quite well
regarded.

But, that laptop was ripped off and the particular file appears not to have
made it into backups.

Does this description happen to ring a bell? Any references?

~~~
JMStewy
Might it be this?: <http://boredzo.org/pointers/>

or possibly this (pdf warning):
<http://home.earthlink.net/~momotuk/pointers.pdf>

~~~
pasbesoin
The second link, I think.

Note that it's also available in an HTML version, at:

<http://pweb.netcom.com/~tjensen/ptr/pointers.htm>

------
misham
Why not base it on a project? If you want more people to do systems
programming (I am assuming kernel and driver development), why not take
something from <http://kernelnewbies.org/> and turn it into a simple project
or write a character driver. People will learn how to write code for the Linux
Kernel, learn how to interact with that community and perhaps become more
interested in systems development as a result, if that is your goal.

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
No, I disagree with most of this. A LTHW book covers just enough of the
language that someone could then go learn the things you mention from another
book. At the end you could lightly cover testing, but most people can barely
get an editor installed. No way they can learn multi-threading, TDD, an entire
project, and an RCS.

It'd also dilute the focus of the book.

~~~
alnayyir
Worded better than I did, agreed.

------
malandrew
I think it would be cool to see any of the following:

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
There _is_ a Little MLer (with examples in Caml and Standard ML), which
teaches type-based programming very well, and would be worth reading for
anyone setting out to learn Haskell, I imagine (I respect Haskell's purity,
but program in ML and Scala, the same way I respect Ada's safety, but program
in C, so a better Haskeller than myself may disagree. :-)).

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.

~~~
malandrew
I agree that "The Little ____er" books aren't the best to learn how to apply a
language in the real world. I also agree with your "piano finger lesson"
analogy.

However, where "The Little _____er" books excel and overcome all other
teaching formats I've seen is in introducing complex paradigm-shifting
concepts in a way that is digestable in tiny chunks.

Concepts such as monads, zippers and list comprehension are exactly the the
type of concepts that are very difficult to teach/explain using common
teaching approaches that "tell, but do not show"

The socratic method used in "The Little Schemer" makes sure to dismantle these
extremely abstract concepts into atoms '(pun intended). You really need to
understand each atomic piece before you move on.

In most explanations of monads the teacher rattles off a long run-on sentence
that touches on several facets of a concept such as monads, making it all that
much harder to digest. In fact, most sentences/paragraphs attempting to
explaining monads just cause the learner to choke on the terseness and density
of information being communicated in one utterance.

The way I see it, both types of books are very valuable. The Little Schemer
teaches recursion as a concept better than any other text I've seen. I've
never seen anything else that come close. In fact, most texts that touch on
recursion quickly move into comparing it to iteration both in form and
performance. SICP is an example of a teaching resource that does this. If I
remember correctly, the first time you really see recursion in SICP is when
the book discusses Ackermann's function and the pros and cons of recursion
versus iteration.

------
redstripe
Reading through Zed's tutorial reminded me of some Pascal and C tutorials I
downloaded in the old BBS days. They were a great introduction to both
languages when I was just learning to program.

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
All of those old tutorials can likely be found here:
<http://www.textfiles.com/programming/>

------
Jabbles
I think your goal will be more easily and better achieved by writing a "So You
Found Python Easy?" book. C is not (IMO) a good language to teach people that
are just starting to program.

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
I'm doing this book precisely because programmers who already know a language
aren't ever getting around to learning systems programming or how things work.

~~~
Jabbles
Ok, that's fantastic! I hope you succeed.

But it's a bit misleading to call it "Learn C The Hard Way" after LPTHW, if
your intended audience is experienced programmers. The whole point of LPTHW
was that it was for beginners.

Top of their website: "The book is a very beginner book for people who want to
learn to code. If you can already code then the book will probably drive you
insane. It's intended for people who have no coding chops to build up their
skills before starting a more detailed book."

~~~
alnayyir
As Zed stated, his concept of LCTHW isn't for beginners to programming.

K&R has sated that need.

It's easier to understand what I'm aiming for when you've already gone through
the rigamarole of learning C from the existing texts.

------
Tichy
I understood K&R years ago, but somehow I feel completely inadequate to being
a C programmer. I think there is some kind of black art involved in memory
management. I checked recently and it seems K&R doesn't even talk much about
memory management.

I just wish to learn the current state of the art - what are best practices
that have evolved since K&R?

~~~
silentbicycle
There's a chapter on memory management* in Hanson's _C Interfaces and
Implementations_ (<http://sites.google.com/site/cinterfacesimplementations/>),
which is one of the better advanced C books I've read.

* Mostly, arena-based allocators.

Paul Wilson's "Uniprocessor Garbage Collection Techniques"
([http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.47.2...](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.47.2438))
is an excellent overview, as is Jones and Lins's _Garbage Collection:
Algorithms for Automatic Dynamic Memory Management_.

~~~
mahmud
Interested parties can also look into "Memory as a Programming Concept in C
and C++".

------
Teckla
One important thing I would like to see in such a book is one or more chapters
devoted to memory management best practices.

~~~
alnayyir
100% agreed, I see way too many people struggling with realloc/calloc in ##C,
let along comprehending heap fragmentation.

~~~
NickPollard
A good solution for this would be to make one of the exercises to be building
your own heap allocator.

------
jswinghammer
Honestly the closer you stay to the spirit of K&R the better the site would
be. I've looked at a lot of C books over the years and K&R is the only one I
thought was even decent.

~~~
alnayyir
I'm not trying to replace K&R, but I'll be inspired by it since I grew up with
it.

~~~
jswinghammer
Yeah I know but if you bring something in the same spirit to the web it might
be good.

I grew up as a programmer reading it too so I appreciate what you're saying.

------
sleepdev
I am not sure how applicable it is to an introductory text, but I would be
interested in learning more about the internals of compilation and linking.
What is the minimal necessary amount of work that needs to be done to interact
with existing C libraries (header files, ELF format, and how that all fits
together).

~~~
alnayyir
Rather avoid imp specific like ELF.

I'll encourage reusing existing code/libraries.

------
mprny
The memory model. Explain why given: int a[100] and char* p = a, a and p point
to the same place but a + 1 and p + 1 do not. C's memory model is easy in
concept, one huge array of memory cells. But in practice it can be a rats nest
of pointer arithmetic.

------
dfox
What I really miss is some C book that teaches the modern approach to "object-
oriented" C (as done in Gtk, Apache, CPython etc.). Actually many programmers
(presumably with only passing knowledge of C programming) even actively
proclaim that you cannot program in C in this style.

~~~
alnayyir
I'll teach function pointers, and might expose them to some style of OO C, but
I haven't made any decisions on it.

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.

~~~
dfox
Well, function pointers are only one aspect of this. Suprisingly many
experienced C programmers I've met don't know that you can safely cast pointer
to struct to pointer to it's first field, which is pretty important trick to
achieve reasonable OO (with real inheritance) in C.

~~~
alnayyir
I know a line cook that codes C on his free time that would strangle someone
who was paid to code that couldn't make a fake object + method calls out of a
struct and function pointers.

------
amalcon
Just because you're working in C doesn't mean you need to handle every detail
yourself. In fact, please don't handle every detail yourself. Show your
readers how to use some of the great libraries C has to offer. Not just
system-level abstraction layers, either.

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
I don't know if this is outside of the scope of your plans, but threading
issues are a big one that jump out for me. POSIX threads can cause all kinds
of wonderful headaches, it would be nice to see some solid advice on the does
and dont's.

~~~
alnayyir
I plan to follow Zed's model for 52 exercises, I don't see any reason why I
shouldn't cover multi-threading and a perhaps a few different concurrency
models in the latter half.

------
crux_
I'm not sure it makes sense any more to teach C to beginners -- by the time
someone has a need to write C code, they really ought to have mastered
programming in another language or three, first.

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
>I'm not sure it makes sense any more to teach C to beginners

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.

~~~
crux_
Unfortunately I think you mean "rough" as in non-responsive... not as in
pitiless -- which, assuming a suitable level of expertise, would be great for
me.

~~~
alnayyir
No I mean pitiless. The C channel I've observed for years is out and out
brutal.

~~~
crux_
Mind if I ask which channel? I suspect my code deserves "brutal", at least on
round one :)

~~~
alnayyir
##C on Freenode.

I accept no blame for your impending suicide.

------
wyclif
Other than K&R (which everyone knows about), what is the current CW on best C
books?

~~~
defen
C Interfaces and Implementations is really good:
[http://www.amazon.com/Interfaces-Implementations-
Techniques-...](http://www.amazon.com/Interfaces-Implementations-Techniques-
Creating-Reusable/dp/0201498413)

~~~
nkurz
Different books work for different folks, and lots of people seem to love this
one. I however love C and found this book to be an abomination. K&R is
brilliant. Given an opportunity, I would eradicate this book from the face of
the earth lamenting only the damage it has already done.

Examples provided here: <http://news.ycombinator.com/item?id=1705332>

------
checker659
Just one request: Would you be able to release individual chapters as you are
done with them instead of waiting to finish the whole book? Thanks!

~~~
alnayyir
Plan on it, I'll be working on a tight feedback loop since I'm not even
remotely qualified enough to be doing this.

------
systema
Also, just since we're on a similar topic, you might want to read:
[https://github.com/martainemde/learn-ruby-the-hard-
way/issue...](https://github.com/martainemde/learn-ruby-the-hard-way/issues/1)
Just so you come up with something original :)

------
callahad
I'll go ahead and pledge that if you write it, I will buy a copy. I love
LPTHW's emphasis on exercises. It's one thing to read and understand a concept
as presented. It's another thing entirely to actually apply it to problem.

------
fmstephe
I have nothing to add to the discussion. It sounds to me like your approach to
the book is solid. If you write the book outlined here I will buy it, for me
and for my kids :)

------
systema
You probably want to make sure you know C, first.

~~~
alnayyir
About 10 years worth, I'm unqualified anyway.

~~~
systema
10 years suggests nothing, really. If "int x; What type is &x", "int x[5];
What type is x? What type is &x?" manages to confuse you, I suggest you re-
learn C, before authoring this book of yours.

------
Sirupsen
You want to target young programmers. Talk to those, and make them come with
feedback as you write the book.

~~~
alnayyir
I have a split-test/feedback group prepared.

------
ichramm
I really like the __attribute__ mechanism that GCC has, something covering
that will be really nice.

~~~
alnayyir
Not likely to happen, outside scope.

------
killbot5000
Lots of segmentation fault diagnosis

~~~
alnayyir
I know a lot of new people run into perpetual segfault, but I don't think
that's really a HUGE hang-up once you get past the basics.

I'll consider some "break it and fix it" exercises for diagnosing these kinds
of problems though.

------
grandalf
I want to learn how to do something internet related with C.

~~~
alnayyir
<http://beej.us/guide/bgnet/>

~~~
systema
This is a horrible book, that is cluttered with numerous errors. If you want
to learn about socket programming in C, you might find that UNP would do well
to teach you, shown here <http://goo.gl/uqCP8>

------
systema
Illustrate the differences between IDB and UB early on.

~~~
alnayyir
Beg your pardon?

~~~
systema
If you don't know what UB or IDB is, you probably don't want to write a book
pertaining to C, :)

~~~
alnayyir
Context specific.

Could be intel debugger, could be undefined behavior, could be implementation
defined behavior. I tested them on a group of about 15 C devs, mixture of
embedded, linux, DSP, and other volken.

Got the same guesses I made and a lot of question marks.

It's easy to run your mouth but not actually contribute, you might consider
your role in this process before commenting again.

~~~
systema
So, contextually, we're referring to C here, wherein these terms refer to
Implementation Defined Behaviour, and Undefined Behaviour. Allowing beginners
to understand such terms early on would help, immensely.

~~~
alnayyir
Sure, if they have a copy of the standard sitting on their desk.

~~~
systema
I can see that this book is going to be a great success, already. :)

------
jrockway
No cstring coverage.

------
anonymous246
Teach how to implement a couple of data structures more complex than linked
list and binary trees (maybe hash table).

Teach how to implement a couple of non-trivial algorithms (e.g., quicksort,
topological sort).

~~~
alnayyir
The how isn't much use without the why.

Planned on it.

------
donspaulding
I "learned C" in my CS101 classes as a first language. I liked it, and was
able to get around a little in it, but I never retained any of it. I plan on
studying this book. Here's my "gimme, gimme, gimme" list:

\- Please make it bulletproof code, as mentioned above. I would hate to spend
time relearning C the hard way AND the wrong way.

\- Please get me to the point where I can make use of other libraries
effectively. I'd like to understand the include/linking process at least as
thoroughly as I understand python's import process.

\- Please prefer readability over cleverness.

Thanks.

~~~
alnayyir
#1: You'll learn to write good code, I'm not going to ride the bicycle in
front of you though. That said, I won't lie like math teachers do either.

#2: Plan on it, although I won't be teaching "MAEK GTK GUI LUL" either. That's
up to the student to do on their own time.

#3: I'm not clever enough to make clever C code. I can write Python that peels
paint though.

------
LInuxFedora
What about Learn C++ The Hard Way ? Anyone ?

~~~
systema
You can do that yourself, if you want. :p

