>I’ve seen a lot of what passes for excellence in high schools, and it’s not good enough.
I’ve encountered many brilliant students in college, with straight A’s through highschool and stellar SATs, who cannot string three or four sentences together into a coherent paragraph. I am now trying to realize a vision of a Khan-inspired service for writers who are not getting the help they need from school. This is probably not the time for a shameless plug, because my site, as a site, still sucks, but if any student here wants free, quality reviews of their writing projects, you can get them at http://www.essayjudge.com
I say “free,” and mean it, but if you want to abuse the service, then I may ask you for a return favor in the form of development advice.
At present, you can submit writing quickly at the site using anon/anon as uid/pwd, but for HNers who don’t want their writing and the attendant review published, you can google-email me (bbquigley). No promises if I’m inundated, except to try my best.
You sent me my password in the confirmation email in plain text. Please fix this security hole ASAP by hashing the passwords.
Edit: The content looks great. Sorry, didn't mean to sound snarky, but that is a scary first impression of the site. I have some more comments that I tried to email to the contact email address, but my email was retured. Is there an email I can use to contact you or someone at the site?
Thanks for the feedback. On my immediate to do list. No excuse, but I didn't build the site, and the process of trying to fix its bugs since I took it over while completely changing its focus has been especially onerous for me. Please use my personal email in my comment above.
I don't normally comment prior to reading the post, but given a topic such as this i feel obligated:
This should read "Humans! Learn to write"
CS students are not alone in this need.
The one course, more than any other, that taught me to write efficiently and convey ideas clearly was my 400 level Philosophy of Mind course. We were to write 1 page (double spaced) essays, weekly, on the papers we read. The class argued our professor up to 2 pages.
When i received my first essay back, the full first page was crossed out. I learned not to include any dithering or bullshit in my essays after that, one page was almost exactly right. That was the point at which I really understood the joke "I would have written you a shorter letter, but I didn't have the time."
Edit: homophony: two -> to; in the most ironic spot possible.
When I tell people I'm a programmer they always go "oh, you must be good at math." The truth is that I'm pretty bad at math, but in terms of logical syntax and parsing I am pretty good. Programming (especially high level modern stuff) has much more to do with syntactical and epistemological skills than math. I learned to program from writing.
Given that all of computer science is based off of math at some level, i'd say math is more important than you think.
Anyone can glue some APIs together and make some kind of application, but it takes some math skill to design and implement strong algorithms. Computer science is not about syntax and semantics, it's about about algorithms and data structures-- and if you're not good at algorithms and data structures, it doesn't matter how good you are at memorizing Python syntax.
This is anecdotal, but every good programmer i know of has a strong math background, or at least knows how vitally important math is to being a good programmer. Incidentally, most bad programmers i've met put much more weight on memorizing APIs and language semantics (e.g. Why do i need to know the big-O running time of bubblesort? python has sort() built in!) than learning math.
 And they do. You can find them on odesk and elance charging $10/hr and blowing past deadlines, producing unworkable code.
Sort of. Most computer science departments actually came out of philosophy departments. In terms of implementing algorithms (sorting etc.), yes there is a lot of math involved in that. But there is a lot of computer science (and programming) that is involved in epistemologically describing and modeling objects that does not involve math as directly. Ultimately, though, you're right: it's all math at its base.
As someone who has started studying programming and CS recently, avoiding becoming a guy who "glues APIs together" has been one of my goals. I want to learn the underlying principles, not just the surface-level implementations that change every few years.
Absolutely do learn the fundamentals. Be able to look off into space and imagine the flow of a system at many different levels of abstraction. Understand how compilers, interpreters, and operating systems wrangle your hardware into submitting to your will. Learn and design algorithms. Spend time thinking about how your computer gets from point A to point B for every program you use. Do all those things and more, but then be willing to embrace being somebody who "glues APIs together" when appropriate, or somebody who creates new APIs when appropriate, or somebody who creates new APIs using others that you have glued together, and then make something with all that abstract, algorithmic thinking and all that glue.
As an informatics student a lot of my math skills are within logics and discreet mathematics. The last thing people see at high school is calculus, which makes them assume that that's what I'm good at. Truth be told I couldn't integrate for the life of me. Give me a nice complex logical sentence any day and you'll watch me drawing up venn diagrams like I've done nothing else all my life.
Thinking about complex algorithms (not just wiring APIs) is still worlds removed from high school pencil-and-paper algorithm repetition.
I would be "good at math" if it were about how well we could invent methods of solving problems, rather than how accurately we can apply the method we were taught 100 times.
I have a pretty good grasp of the behavior of systems, it's just that I'm likely to drop a coefficient or confuse a 0 and a 9, which is the source of nearly every B. I have rarely lost points in a situation where I would not have known how to write a program to do the work for me.
While I agree with your assertion that CS is math (I've upset many people by stating that computer science is fundamentally a subset of mathematics), I disagree with equating those with weaker math skills with those who are incapable of creating elegant code and meeting deadlines.
We have a variety of tools and abstractions in Computer Science which allow us to view what is fundamentally mathematics from a more abstract and 'natural' standpoint. I've known many people with a poor grasp of higher level math who had an innate ability to understand logic and hierarchies, making them extremely skillful at solving business problems.
I assert that something on the order of less than one in ten programmers need to have significant command of mathematics proper. I'll take nine programmers with solid domain knowledge who can write clear, concise code on a schedule, who are self-aware and will defer to the one research guy, over a team of nine research guys. ;-)
If you are writing a sorting algorithm there will be a lot of math as in equations involved.
If you are writing a complex model, while it is ultimately math, it has more in common with the skills required to write a great essay than it does with the skills required to do complex calculus. A great essay is understandable on multiple levels of detail: if you read just the introduction you should get a sense of what is going to happen in the essay. If you want a more detailed explanation of what exactly happens it should be contained in a logical place later on in the essay. The body paragraphs should reference the structure of the introduction and they should contain those arguments in more detail. If you are writing a particularly large body of writing you might need a more expansive structure: chapters, maybe even multiple volumes etc.
The same should be true of your application. If I read the main file of it I should get a basic idea of what is going to happen. If I want more detail I should be able to understand clearly where to look for the detail I want.
> The truth is that I'm pretty bad at math, but in terms of logical syntax and parsing I am pretty good.
The sad truth is that you have a very limited view of what math is if you think of logical syntax and parsing as something other than math.
Frankly, I'm a little tired of the position calculus holds, where it is the pons asinorum for everyone who wants to do the more advanced (that is, non-arithmetic non-trivial-algebra) math regardless of what their true focus is. I think proof construction should be its own class and CS folk should take that and discrete math in order to move up the ladder. Engineers-in-training could take proof construction if they want a math minor and, yes, calculus their little brains out because calculus is what physics uses for a language.
Frankly, I'm a little tired of the position calculus holds
You are not alone. Here is a quotation from John Stillwell that I put in a FAQ for parents about mathematics education:
"What should every aspiring mathematician know? The answer for most of the 20th century has been: calculus. . . . Mathematics today is . . . much more than calculus; and the calculus now taught is, sadly, much less than it used to be. Little by little, calculus has been deprived of the algebra, geometry, and logic it needs to sustain it, until many institutions have had to put it on high-tech life-support systems. A subject struggling to survive is hardly a good introduction to the vigor of real mathematics.
". . . . In the current situation, we need to revive not only calculus, but also algebra, geometry, and the whole idea that mathematics is a rigorous, cumulative discipline in which each mathematician stands on the shoulders of giants.
"The best way to teach real mathematics, I believe, is to start deeper down, with the elementary ideas of number and space. Everyone concedes that these are fundamental, but they have been scandalously neglected, perhaps in the naive belief that anyone learning calculus has outgrown them. In fact, arithmetic, algebra, and geometry can never be outgrown, and the most rewarding path to higher mathematics sustains their development alongside the 'advanced' branches such as calculus. Also, by maintaining ties between these disciplines, it is possible to present a more unified view of mathematics, yet at the same time to include more spice and variety."
That's from the preface to his book Numbers and Geometry (New York: Springer-Verlag, 1998), which is a delight to read and full of thought-provoking problems.
My eyes were similarly opened to the unnatural focus on calculus in mathematical education by the book "Everything and More" by David Foster Wallace. It is about Georg Cantor's search for an understanding of infinity, but spends much of its time laying groundwork with a lengthy adventure through math history, including many of the topics Stillwell mentions in that quote.
I agree that many programmers need to work on improving their writing skills. However, I disagree with the notion that the humanities department is suited to providing an education in the kind of writing skills CS students need. The humanities are full of fuzzy concepts that defy precise definition and the writing styles associated with those fields tolerate a level of ambiguity that is inappropriate for CS, engineering, or the physical sciences. If you really want to learn to be a great writer capable of expressing CS concepts unambiguously and concisely then a course in technical writing taught by science/engineering faculty is what you need. An even better way to improve your writing skills is to get involved in research and publish a paper in the scientific literature. The "biggest pedantic miserable fascist sonofabitch" editors you can find in the university are not in the humanities department. They're the faculty in science and engineering whose livelihood depends upon writing amazingly clear and concise documents that withstand the intense scrutiny of NSF and NIH grant review committees, journal editors, and peer reviewers who genuinely care about whether or not the experiments are described unambiguously and in sufficient detail to enable others to replicate the experimenter's results.
> The humanities are full of fuzzy concepts that defy precise definition
Perhaps its beside your point, but this is exactly what's most important about learning how to write. There's a whole lot more that you learn by exploring 'fuzzy concepts' and non-precise systems. Approaching natural language like a science or system is delusional at best. Reading and writing "amazingly clear and concise documents" is just one way of using language as a tool.
"Fuzzy concepts that defy precise definition" are part of everyone's daily work so its better to learn how to deal with them.
In a normal job, you won't use your skills only for writing official documents but also for writing numerous mails, info-files and participating in chats and online discussions during the day. How well these are written will have a huge impact on the receivers ability to figure out what you are after. More then often the things discussed are not scientific facts.
Yes! Written communication is so important, especially so with collaborative technical works.
Some tips: learn to state or restate a problem as a problem rather than an unimplemented solution. Consider: "I need a faster horse which eats less food" vs "I need a mode of transport which is faster and has less upkeep". This is especially important when dealing with feedback and bug reports from users. Learn how to extract the essential complexity of the problems they are facing and don't become biased by the possible solutions they offer up.
Also, be as direct, concise, and clear in written communications (email threads, commit messages, bug tracking comments, etc.) as possible. Make a habit of listing and relisting assumptions and presumed findings. Make a habit of summing up and distilling results, especially when new people are added to a discussion or issue. This saves so much time and avoids so many missteps due to ambiguity.
Additionally, teach yourself how to discuss technical topics without becoming excessively emotionally involved. Address the technical issues, don't fall into thinking that a criticism of your idea is an attack on you, learn to play devil's advocate. Learn to progress toward the best possible technical solution regardless of who had which idea.
Some of the most rewarding courses I took during my time in college were writing courses, in both fiction and poetry. Definitely, it helped refine my grammar and composition skills.
But the creative writing courses really provided a lot of other valuable experience too. Having to put together a creative work involves parts of my brain I never really used while coding -- it was sort of a challenge to put aside the methodical, linear path I live in while programming and have to imagine a world, then put someone in it, and have them do things that people might want to know about.
The other nice thing about workshop-based writing courses is that you generally read and comment on works written by your fellow students. You learn new craft skills from reading their work for sure, but you also learn how to give constructive criticism where it needs to be given.
This sort of diplomacy is something you need to practice in order to be good at it. It will help you later when you're in a code review meeting at work and you are the guy who can step up and say something more useful than "you're doing it all wrong, that code sucks, and so do you."
I have a one-word piece of advice for anyone who wants to learn how to write:
Don't worry about which software to use, how to customize your template, or how to promote your thoughts. Just find a service that lets you start writing right away, and then start writing about what interests you or inspires you.
If you feel intimidated by formatting or structure, a trick that works well is pretend you are writing an email to a friend, explaining to that friend something that he or she may not understand very well. Real friends or strangers may start to read your posts. How do they respond to your presentation of facts, observations, and arguments? Use the feedback to tweak your approach.
Your organization and "voice" may seem awkward at first, but regular practice -- every day, if you can manage -- will help you develop your skills. After 100 hours you'll notice a big improvement. After 1000 hours, you will be well on your way to being a master.
People can't just learn to write. They write incoherently because they think incoherently.
When I tutor children I ignore the topic they are having trouble with. I go back to basics and teach them basic critical reasoning skills. Their performance in everything skyrockets.
The fact that our society is failing at teaching children how to reason about basic decisions is cause for serious alarm. I'm looking forward to Eliezer Yudkowsky's forthcoming book on how to think correctly (currently use How to Solve It as a guide for teaching others).
I can not emphasize how important this is. I skimmed my way through most of my classes in college, dropped out, then became a self-taught developer. While I do well as a developer, this is the one skill that I miss the most.
Not just CS majors — I'm an art school grad and after 20 years I'm amazed at just how much writing my career has required of me. And it's not just writing skills, but communication skills in general which includes public speaking and presentation. And sadly I'll even add one more skill which you can't even acquire in school — just having patience to do hand holding is more important than I would ever have imagined.
If BS is a problem, the subject probably isn't interesting. If page minimum lengths become requirements, expect lots of filler when students have said everything that needs to be said in less than the required page length. (If it's a maximum, expect highly dense paragraphs that, while containing lots of information, lose their ease of communication and the endeavor of better communication has been lost.) When weekly or daily writing becomes the norm, expect quality to go down since there are many more important things and the papers will be rushed. Nevertheless, Strunk & White + Practice = Success. Getting people to pump out their first million words, which will inevitably be crap, should be a goal of the educational system.
Clarity should rule above everything else, correct grammar included. This encompasses the "What's the point?" question, since if there is no point, the paper may be grammatically perfect but shouldn't be clear.
After a few quarters of CS and internships in the industry, I realized how great opportunity it was to change majors in order to focus entirely on writing within a superb Humanities department. The lack of a CS degree hasn't stunted any bit of my work as an engineer, and having demonstrated writing skills can only make you more employable.
I would add more than just writing - as he touched on, all communication skills. And yeah, definitely not for only computer science majors. Any person needs to work on their verbal communication skills as well!
Poor CS students. People are always giving them advice, Learn more SQL, learn functional programming, learn whats going on at the low level hardware, contribute to open source, start a blog, get on github. I seem to remember Computer Science is ranked as one of the hardest degrees, It certainly was no picnic for me. Leave the poor kids alone.