According to student evaluations, most of my students appreciate short programming assignments. Yet, every year, some students think that programming is below them or unimportant.

Maybe I should start my courses with this theorem:

Theorem. If you understand an idea, you can implement it in software.

There is no denying that programming requires a lot of technical knowledge. Most programmers do technical jobs, involving testing, building or refactoring code. But programming is ultimately a communication form. And it is as noble as Mathematics or English. Let us compare:

  • Writers are considered sexy and non-technical people. Yet, grammar and spelling are technical. Moreover, most writers earn a living by writing ads for boring products. Some of them make a living with grand novels, but fewer than you think.
  • Physicists are great thinkers. Yet, their mathematical derivations are often mind-numbing and technical. Many physicists spend years running extremely technical experiments. And when they don’t, they program extremely complex (and technical) simulations.

For some reason, being a writer is somehow considered more prestigious than being a programmer. If you ask me, Linus Torvalds is every bit as cool J. K. Rowling. And I’d rather have a lunch date with Linus.

24 Comments

  1. I wonder if it should be extended to:

    If and only if you understand an idea, you can implement it in software.

    ?

    Comment by AdamJTP — 1/3/2010 @ 16:40

  2. I think there are ideas you are able to program that you do not fully understand :) But you have a great point.

    Comment by Ólafur Waage — 1/3/2010 @ 16:53

  3. not if your idea (or algorithm) is a proof by contradiction :)

    Comment by Suresh — 1/3/2010 @ 16:54

  4. Writers can be poor at spelling and grammar, and often the great thinking portion of their careers is considered the rough draft and content editing, whereas spelling and grammar (if not left entirely to the word processor) is considered menial and left to an editor if possible.

    Physicists are keen to hand-wave away second- or third-order effects, and frequently save themselves work by approximating solutions. Experimental and computational physicists (I never worked with any theoretical ones) frequently delegate the technical part of the work to students or lab techs. Most of the people in LHC pictures doing physical work do not hold PhD’s. (And often, I think you’d be disappointed with the quality of the code we produce.:))

    I think it’s important for people involved in algorithm development to be good at basic low-error coding, that’s why architecture students spend so much time building models, working out the details of how their structures work.

    It seems like an accident of the times that the writers and physicists of computer programming (in my opinion, something like the great pseudocode programmers or algorithm developers) are also required to do their own debugging, testing, refactoring, and documenting of their own code.

    Comment by Timmyson — 1/3/2010 @ 16:57

  5. @Timmyson I think there is a huge difference between 30 lines of code as part of an assignment, and maintaining LHC software.

    I don’t care how smart you are… if you can’t write throw-away code to express an idea, you won’t get away with delegating “technical duties”.

    The experimental physicist who delegates the setting up of the experiment is not delegating because he couldn’t do it. In fact, he has to know how to do it because sooner or later, one student will fail to show up, or screw up the work badly.

    Comment by Daniel Lemire — 1/3/2010 @ 17:22

  6. AdamJTP: understanding the idea is not a sufficient condition.

    Trying to implement and idea is a great way to clarify it.

    The same holds true with writing: if you knew what you were thinking, it would be easy to write. Only the writing is what helps you gel the idea.

    Comment by Daniel Haran — 1/3/2010 @ 17:31

  7. I do an enormous amount of ‘throw-away’ programming, helping someone solve a particular problem for their dissertation or research project.

    As someone who ran a small business for many years, I tell students that companies are not looking people who know the theory of who to do something. They are looking for people who can make something that works.

    Often, working with larger organizations, I will be on a team with several people who know ‘in theory’ the process for solving a problem, but the only person who can actually write the code is me. You can guess when layoffs come who are the first people to go.

    Actually, the person I would have loved to have lunch with is Grace Hopper.

    Comment by AnnMaria — 1/3/2010 @ 17:34

  8. “Programming is below them or unimportant” – how is this possible? For what job are they preparing? Why exactly are they taking your classes?

    Designs, as with any theories, need to be tested. If you cannot test, you cannot learn what works.

    Are there really still outfits that have “analysts” that do design, “programmers” that write code, and keypunch operators to … nevermind. That old model should be dead.

    Comment by Preston L. Bannister — 1/3/2010 @ 21:07

  9. @Bannister Overwhelmingly, my students are grateful for the practical side of my courses.

    But yes, there is a small fraction of students who study Computer Science and cannot be bothered by programming.

    I don’t understand the phenomenon.

    Comment by Daniel Lemire — 1/3/2010 @ 21:13

  10. I fully understand the halting problem, but I cannot implement the general case in software since it is provably undecidable. Your theorem is therefor proved incorrect. :) Though, I think with some rephrasing, you could be on to something.

    Comment by jeffamaphone — 1/3/2010 @ 22:22

  11. That is fine…we still need people to cook the frys!

    Comment by Enlightenment — 2/3/2010 @ 9:20

  12. @Daniel

    I was a CS student from UBC. I have to say that lately I’ve developed a bit of “hate” with CS students. I felt that they’re too cocky; they think that they’re the smartest bunch of people in this programming world. Yet most of CS students I met couldn’t really make a good decision on how to write code. Basically their Software Development/Engineering skill is almost close to zero. They don’t know how to write maintainable code but they boasted their code is the fastest by doing hacks/shortcuts/nifty-tricks.

    Maybe this is the side effect from learning about “Algorithms and Data Structure” and reading those wonderful hacks programmers did in the past? Such that they put high value on performance instead of correctness, robustness, and etc.

    On the other hand, most of Computer Engineering students I met are wiser so to speak.

    Comment by Ed — 2/3/2010 @ 9:30

  13. Interesting. The differential between “Computer Science” and “Computer Engineering” is more recent than my time in school.

    In Physics (my original school-major) there were some (Virginia Trimble, for one) that drew a sharp line between empirical and theoretic practitioners. (I have always thought that theory without empirical grounding was meaningless.)

    Clearly I have no sympathy for those who lack an empirical grounding. Got one fired, as useless.

    Comment by Preston L. Bannister — 3/3/2010 @ 0:46

  14. Programming is a form of communication in that it is a set of instructions given to a machine. At the time of writing, this is still somewhat different from communicating with another person.

    Comment by Edward Bilodeau — 3/3/2010 @ 15:48

  15. @Bilodeau

    (1) I don’t require students to *only* produce code. Just like mathematics, code is not “self-sufficient”. (Though, sometimes it is.)

    (2) People on http://stackoverflow.com/ seem to do fine communicating with each other with a mix of English and code.

    Comment by Daniel Lemire — 3/3/2010 @ 16:09

  16. Yes, but writing supporting documentation or talking to others people about something while making references to it (i.e. including bits of code) is nothing new. It isn’t specific to programming.

    So when I see a statement like “but programming is ultimately a communication form” I focus on that aspect that is specific to programming, which is the creation of instructions for a machine.

    You can of course communicate things other people through programming, but only if they are thinking like machines, with all the associated limitations.

    Comment by Edward Bilodeau — 3/3/2010 @ 16:31

  17. @Bilodeau


    You can of course communicate things other people through programming, but only if they are thinking like machines, with all the associated limitations.

    I think that Computer Scientists are trained to think like machines.

    I think that the best developers out there think like machines. At least some of the time. (This may explain why some of them have difficulty getting dates, but that’s for another blog post.)

    Comment by Daniel Lemire — 3/3/2010 @ 16:37

  18. Any fool can write code that a computer can understand. Good programmers write code that humans can understand. ~Martin Fowler

    Comment by Daniel Haran — 3/3/2010 @ 16:38

  19. @Haran Agreed! That measure of quality is necessary because people need to be able to understand the instructions that other people write for these machines. Achieving that quality makes the overall system (i.e. the computer + its human operators) work.

    From the computer’s perspective, is human-understandable code better? (That’s an honest question: I would guess not, but I’m not up on the research in this area, if in fact there is any.)

    Comment by Edward Bilodeau — 3/3/2010 @ 16:45

  20. @Lemire I agree that it is necessary for programmers to think like machines in order to do their jobs. The complexity of the systems demand it.

    Someone might argue, though, that there is a difference between thinking like a machine and being very knowledgeable about how a machine behaves.

    (Someone might also point out that machines don’t think.)

    Comment by Edward Bilodeau — 3/3/2010 @ 16:48

  21. In my experience, code that is hard for a human to understand usually contains errors. If the programmer is unclear about what they want to do when writing the code, the code will generally read badly. When a programmer comes back to same section of code to make changes, if what the code does is not clear, any changes are likely to introduce errors.

    If you understand very clearly what to do and how to do it, then you can write very clear code.

    This is one of my outer-metrics. If a programmer cannot explain clearly what they are trying to done, then they will probably do it badly. If you are reading code and cannot tell with certainty what the code is doing, then it was not clear to the writer, and the code is likely to contain errors.

    In theory human-readability and correct execution could be independent. In practice there is a very strong correlation.

    Comment by Preston L. Bannister — 3/3/2010 @ 16:56

  22. I disagree with the theorem you propose. When I was younger (in high school) I wanted to program a tic-tac-toe playing program. Of course I understood the game, but could not program the machine to play it well. Only after studying computer science did I see the options available, including brute force table lookup and the more elegant min-max approaches.

    Comment by Anonymous — 5/3/2010 @ 19:53

  23. I think programming is like writing, like painting, like creating music — there’s a creative component and a technical component. J.K. Rowling’s books are very creative, but they were coded using Grammar 2000.

    Comment by Sabine — 6/3/2010 @ 11:27

  24. I forgot to add — a lot of students have a hard time with the concept of learning technique before creating a masterpiece, or even a decent piece of work.

    Comment by Sabine — 6/3/2010 @ 11:31

Sorry, the comment form is closed at this time.

« Blog's main page

Powered by WordPress