Skip navigation

Monthly Archives: January 2012

One quick note this time. There is a lot to absorb in Satyagraha, but I am taking it in slowly (around 2 chapters per day), and the ideas are beginning to stick a little bit.

1. Revisiting a point I made in my last post about Gandhi, it still impresses me how often Gandhi says that non-violence is something a practitioner should die for. The process does not work if you are not laying your life on the line. Otherwise it cannot be taken seriously, and you are not truly committed.

This also applies to arrests and imprisonment. According to Gandhi, a Satyagrahi is not to complain or resist arrest in any way. This seems entirely counter-intuitive to our current conception of non-violent resistance – which seems to largely consist of provoking people until the police arrive, so you can “resist” the police. That’s not what Gandhi’s idea of resistance is about. What a Satyagrahi resists is participation in an unjust system: you are supposed to be demonstrating that you would rather make large sacrifices than cooperate in a government or other organization that uses violence to enforce an unjust set of circumstances. For example, unfair taxation; an occupation of an entire nation by a colonial power; slavery; things like that. You demonstrate your non-participation by giving things up: your privileges, honors, posts and – scary thought these days – your jobs, to convince the offenders that you will not submit to any system that does not fit your morals.

This is not how Occupy Wall Street is (was? is it still going?) operating – or really any modern protest I’ve seen recently, including the protests against SOPA/PIPA. Interestingly, Maddox, of “The Best Page in the Universe” and “Alphabet of Manliness” fame, has offered a plan for action against SOPA that seems to be the closest to Gandhi’s principles. It’s not quite there, as he is essentially suggesting that corporations that support SOPA/PIPA should be punished with boycotts – and punishment is explicitly excluded from Satyagraha – but he is the only person I have yet heard who has insisted that protests are meaningless without personal sacrifice. If there are more, please comment and let me know.

This brings up the question: what kinds of non-violent sacrifices can we make that would really change how our government and society at large work?

So here is where I begin to report the little lessons I learn while studying to be a programmer.

This first post is not so fresh in my mind – I’m describing something I worked on roughly a month ago as an exercise in Zelle’s book. But my notes are pretty clear.

The project was pretty simple: choose a card game, design a program in python for playing it, use a simple gui (I used a modification of Tkinter supplied by Zelle), include a splash screen. It was an extensive practice in object-oriented design – so the point was to make good use of classes. (For those who don’t know, OOD is essentially writing chunks of code that can be recalled by a name so you can play around with sticking big chunks of code together like legos instead of writing line after line of the same little details over and over.)

And I did make good use of classes. With one big mistake.

So for those familiar with Blackjack, you have a few actions you can choose from each turn. Mostly, that’s going to be hitting (getting a new card) or standing (ending your turn). Most of blackjack consists of these two things. Because most of the game is these two things, I wrote the program around them. I thought about the other options for only a second. I only thought about doubling down, which is a special kind of hitting and standing that effects your wager, and nothing else. So, no problem.

Except there’s this other important aspect of the game: splitting. I thought I could just “cram it in” like doubling down. No need to spend too much time figuring it out.

This was the mistake. You see, splitting requires you to play with two hands (at least four cards). I had enough forsight to leave enough room in the gui for two hands. So that worked out. There is a minor problem there, because sometimes you can split a split hand (depending on house rules), which means I would need to set up for three hands. I decided it was not worth thinking about. This was just an exercise in a textbook, it needed to be very good, with a lot of effort put in, but not perfect. I decided this house would allow only one split. Fine.

The problem was in coding. It became a nightmare, figuring out how to redesign the program to get input from the user when it was a split. I won’t go into the details. I will say that I spent about 8 hours working on this, and at least 4 of them were trying to get splits to work.

What was the problem? I discounted splits because they are not normal. They occur maybe 5% of the time, at most. I made the mistake of thinking that, since this happened 5% of the time, it warranted 5% of my attention. It warranted more, and it got its attention with a vengeance.

How could I have done better? Spent time mapping out options and observing patterns. I thought that, since I understand blackjack pretty well, and I even coded a primitive version of the same thing a few weeks prior, I could just breeze through. What I didn’t realize was how object oriented programming requires you to step up your planning efforts. You need to spend the time figuring out just what is an object – just what are the essential components of the program – and exactly how everything fits together.

If I had planned this game out, taken the time to map everything in a flow chart or something similar, I would have realized that it would have been easier to make a “normal” hand a simpler version of a “split” hand than it was to make a “split” hand a more complicated version of a “normal” hand. I should have expanded my definition of what a hand is to include a split hand. What I was doing was kind of looking at a split hand as an afterthought – a particular tweaking of a normal hand – and therefore not worth thinking about too much until I got to it.

A more general definition of a hand, based on a more careful perspective, would have allowed me to include the shared characteristics of both normal and split hands, saving me the step of redesigning everything towards the end of the process and making the whole process faster and easier.

You’re probably detecting a kind of moral lesson out of this. And I think there definitely is one. In any situation, it’s better to accept all cases and account for them – whether its at home, in politics, in your day to day affairs of life – than it is to marginalize. If you want to see beauty and some kind of order in your life, you have to make sure you are making relevant distinctions. If not, you risk either rejecting something valuable or neglecting something significant.

See, programming has a lot to teach. More to come.

I want to begin recording my thoughts and misadventures as I go about teaching myself how to program. I would like to share my curriculum of self-study, once it’s finished. Every day, it seems, I’m getting more and more ideas about what to put into it to make it function. It’s a lot. I’m going to divide my time between general programming languages, web development, math pertinent to the topic (especially algorithm design), operating systems (mostly Linux), network and server administration and finally – which is an entire subject unto itself – electronics and basics of computer engineering. This is, perhaps, a lifetime curriculum. Maybe it will take multiple lifetimes. We’ll see.

But right now, going at my steady tortoise-pace (which I hope will help me across the finish line) I’m studying two languages: Python and C++. I probably won’t be talking about C++ for a while, because I’m studying it as part of a college course which is going relatively slow for me.

My main text right now is Zed A. Shaw’s book, Learn Python the Hard Way.  From one perspective, beginning this book after finishing Zelle’s Python Programming was a step backward. I’ve been reading lessons about many of the things I’ve learned before – all the basic stuff, like printing, loops, decision structures and classes. There are a few functions and concepts that Shaw introduces that simply don’t appear in Zelle’s book, such as argument variables. If that were the only advantage, it would not have been a good use of my type. I’m finding it invaluable, though, for two important reasons:

1. Zelle’s book uses Python 3, Shaw uses Python 2. The two are different enough for starting over to be helpful for me to learn the differences.

2. Shaw is an outstanding teacher. Sure, he has a different aim than Zelle – Zelle is an academic who is committed to developing a very thorough, solid introduction to the concepts of computer science, where Zed is trying to provide a quick, practical guide to the realities of programming.

But it’s more than that. Shaw has helped me learn how to learn. And this is coming from somebody who dropped out of high school and attended a bizarre liberal arts college because he cynically believed (and still tends to believe) that nobody knows how to teach anything. Zed helps me in two ways.

First is the way the book is structured and the scope of the exercises, divided between daily lessons and week-long “missions” (my term, not his), where he asks you to devote yourself, single-mindedly to one purpose, whether its to design a program, memorize symbols or expressions, or spend time exploring the internet to read code. Everything weaves together nicely; he obviously took care to decide what is important to simply practice, what is important to simply gloss over and what is necessary to etch into your skull with a diamond pen.

This leads into the second great thing about the book: Shaw’s tone, his comments, his attitude. Though a bit cynical (I can often feel a restrained anger toward the missteps of his predecessors and peers), it is infinitely helpful. In the process of steering the reader away from unhelpful trends out there in the forum of computer science, he provides an example to the reader of how to be wary and circumspect about the different opinions out there – an attitude that will help anyone to be more focused, to be more skilled, to be excellent. As an illustration, in Exercise 34, he warns readers not to bother reading about Edsger Dijkstra’s opinions on cardinality – essentially saying that this topic is not worth the time of a beginning programmer (also, that Dijkstra’s opinion is not worth very much, but I have no way of judging that). Not that I was about to go out and read anything by Dijkstra, but it’s good to hear from an instructor what is worth my time for now and what isn’t.

In the end, I like this book, because I feel confident that I am being guided toward proficiency. None of the particular points and warnings are, if taken generally, anything new to me (how to be circumspect, how to avoid pointless arguments, how to memorize a list of symbols), but this book fits them all together in a beautiful whole.

I’m just over halfway finished, currently working on a week-long mission project. The assignment was to write a simple text adventure. For some reason, I’ve decided to go overboard: I’ve created a function that has the text print across the screen, character-by-character instead of string by string; and I’ve added a whole slew of Nintendo-era sound effects to a graphics-less game. Perhaps this game will become the subject of a future article on “feature-creep,” but, for the time being, I’m having fun.

As a final note, Shaw has created a site called Learn Code the Hard Way, as a follow up to the success of the Python book. As far as I know, only the Python and Ruby versions are complete; he’s working on a handful more and is now offering online courses. I’m curious to see how his teaching endeavors will develop. But, for the time being, back to the Python mines.

Wherever man adheres to being something or doing something, there his roots remain in the human, and out of his roots he can become whole, and in whatever he engages himself, in knowledge or in the word, in beauty or in joy, in death or in eternal honor, he can be saved through himself and can himself establish his life. But where man adheres to the illusion of possessing something, there he tears up his roots out of the human; they no longer draw up healing to him from out of the human earth, and I know no help for him.


— Martin Buber (after Rabbi Nachman of Bratzlav), “The Master of Prayer”

I dream of becoming a homesteader. I’m not very close to that – yet – as far as I know – but I still like thinking about it. Before I even begin writing about how to make that happen, I want to record my thoughts on why it’s important. Here’s the first I’ve come up with.

1. We must spend so much time taking care of our homes, vehicles, gardens, tools, electronics and toys anyway.

We spend a lot of time, work and energy taking care of our things – and it’s horribly draining. Why not channel all this effort into a means of living? It would do two things: first, it would lessen the pressure for us to find work in order to live; second, it would take an amount of work we already find ourselves engaged in and make it infinitely more meaningful. Doing work that you know is not returning very much value is draining. Good work makes you feel good. In my experience, it makes me feel stronger, more solid; where doing what I consider to be pointless toil leaves me feeling empty, weak, empty, devoid of substance.  I find myself less solid than the world around me, less able to stand up to it and do what needs to get done.

So there would be a very definite and direct kind of fulfillment, to gradually shift to providing directly for myself, without the intermediary of an economy.

I’m currently reading Dover Press’s printing of an old collection of Gandhi’s newspapers articles. It’s titled “Non-violent Resistance (Satyagraha)”, and you can find it here.

Anyway, rather than treat this as a book review, I thought I’d periodically share my notes on what I’m learning from the book.

I began reading the book largely because of the Occupy Wall Street Protests. I wanted to learn for myself, from a respected practitioner, what non-violent protests are truly supposed to be about. Granted that, until I finish the book, the contents of these notes are not to be taken as any kind of prescription for modern times. I am merely going to set down ideas that strike me as being particularly insightful or essential. It will be equal parts for my own personal clarification and memory and to share with all of you out there. So I begin.

0. Satyagraha means “grasping the truth.” Taking this as symbolic for all of Gandhi’s teachings on non-violence, it means the focus is not on attacking or disrupting the unjust directly but on holding on to what is true. It is something positive, rather than negative.

1. Gandhi does not advocate non-violence in all situations. In what I have read so far, he insists that using violence for political gains is ineffective and unjust. He explicitly writes that using violence for self-defense in emergency situations (he describes an assassination attempt) is perfectly acceptable. I have not read his opinion on war; my assumption is that he is against it.

2. Gandhi makes a distinction between non-violent protest and passive-resistance. He believes that passive-resistance refers to concession; to being non-violent because any attempt at violence would be defeated. He considers this to be participating in the violence by fearing it. He conceives of non-violent protest as something active – something planned and executed to gain something; not as a means of avoiding the offending party’s violence.

3. Everywhere is the word discipline. Discipline, discipline, discipline. He writes that actions of non-violent resistance that are not grounded in strict discipline and disorganization are mere criminal acts. He believes that non-payment of taxes is, theoretically, an acceptable and helpful tool in resisting an unjust government, but at one point he dissuades people from using it, because he does not feel that the people of India are sufficiently trained in the discipline of non-violence to not join it too easily.  He rather urges political leaders to spend more time planning and training their people than to rush into actions with severe consequences.

4. Non-violence must be total and completely thorough to be effective. Violence is not just physical violence, but also hateful speech, implicit participation in power structures that support violence or injustice, and any kind of punitive behavior. On the latter: he points out that staging boycotts against one party (e.g., the British Empire) is punitive rather than productive and therefore has no part in non-violent protest. Simply to reject is harmful. One must take up residence in what is true and helpful for one’s self. The protest, the resistance, is the rejection of any attempt to deny them that.

5. The most obviously “non-violent” part of non-violent resistance has to do with police action. Gandhi insists that non-violent protesters must not resist or complain about police action, arrest or imprisonment. It is a much bolder statement to willingly and cordially go to prison as the result of not-participating in unjust circumstances than it is to complain about the police. This could mean accepting injury and death as a consequence.

6. Gandhi says a non-violent protester must be willing to sacrifice his or her life for the cause.

7. Over and over gain, Gandhi writes that government is not anything bad in itself; it is only bad when it acts unjustly. To me, this portrays government more than ever as a machine that must be made to serve its people – not as a fundamental bugbear or source of strife. Part of keeping the machine running well is making sure that the people could live without it – at least for a short while – if they needed it. It would be good to think of it as an essential convenience in human life – a simple machine like a hammer, a wheel, a rope. Though you could live without one if, somehow, it became too much of a problem for you – it would probably be very stressful to do so for a long time.

That’ll be it for now. More to come.