Paralysis

Sometimes I look at my code and think about the tasks I have left to accomplish and I freeze up. They are too big, too new and complex to hold in my head all at once. Too intimidating. I can’t even imagine what it is like in real projects. Having to deal with code other people have written. Having to stay focused. It really reminds me that I am nowhere near as comfortable with the concepts as I want to be.

There have been plenty of times where I let that paralysis take over. I walk away from the computer or shut down the IDE and watch youtube videos or something. I am learning ways to cope with it though. The most effective has been to just tell myself I need to write a few lines of code. Something small. It doesn’t even have to do anything, yet. The other day that was flipping my findLowest function into a findHighest.

The findLowest function allows me to determine which cell to drop the checker into. The findHighest serves a twofold function. First, it searches the originating column and finds the topmost checker. What that allows me to do is dispense with a two part (column, row) input. Now all I need is the column. The game will do the rest. It feels simpler, and I like simple!

Another example was a tweak I made to findLowest. In an actual game of backgammon, one can have more than 5 checkers in a column. They just start stacking up on each other. I haven’t gotten that far yet, and if you tried to add a sixth checker, the function didn’t know what to do, there is no 6th cell! In order to get around that, for now, if the 5th cell is full, it just “eats” the checker. It’s a stopgap. I need to nest the findlowest in a way that it will start stacking checkers and it will check for stacked checkers first. One step at a time.

The important thing is to keep moving forward. To find a way to work through the overwhelming amount of learning I still have ahead of me.Breaking things down into discrete steps that I can wrap my head around keeps me from locking up as much. I also keep coming back to the idea of testing and TDD and I really need to stop talking about it and start doing it.

Advertisements

It’s the little things.

One of the things I had been hung up on was how to move the checker into the lowest available spot in a column. I’d taken a shot at writing a function to do it. I would pass it the column to search and then loop through the values, using getElementById to look for an empty cell. It didn’t work. I’m not sure why it didn’t work. I tweaked it and rewrote it and tweaked it some more. I could hardcode values in and it would do what I wanted it to. Great.

Eventually I enlisted the help of one of my mentors, Chris Gomez. We used Cloud9’s collaboration tools to dig around in my code and run little tests. Finally, I found myself in the in the dev console of firefox, setting breakpoints and watching expressions. Without those tools, I don’t know how much longer it would have taken for me to find the problem. I was doing too much work. I had one too many steps. Luckily I could see that one of the expressions was evaluating to ’empty’. That was exactly what I was looking for. I think took that expression and tried to do more work on it, which ended up giving me a null and killing the loop.

I had what I needed. I cleaned up the function. Manually tested it a half a dozen times, and gave a spirited “Hell yes!” to my empty room. Made my day.

findLowest

Finally, code samples!

I guess I have put it off long enough. At some point I knew I would have to show other pfilledBoardeople my code, as embarrassingly naive and novice as it is. So let’s get it out of the way in one fell swoop. Here is everything I have done. It is sloppy, messy, not well commented, hacked together and sometimes difficult for no reason. And I’m okay with that.

My earliest work is in the index.html and the top of the css file. It is basically me working through the battleship game in the Head First book, with some added flourishes. The meat of my own work is in the two backgammon files. That is where, so far, I have made my most creative mistakes.

Here is my board with some, uh…, test features turned on. The board itself is an image and the playing field is composed of several tables that I have aligned to the board. Then each celcellCSSl of the table has one of three css classes applied to it. .fillWhite uses an image, confusingly enough, an orange checker. .fillBlack, even more confusingly, makes the entire cell white (note to self, change that to a black fill… done). Finally there is .empty that, for testing purposes makes the cell grey.

movedBoard

After moving some of the checkers a few times.

Aside from setting up the board, the user can also move checkers using an input box. This is another stepping stone/test function while I work out the real input scheme. I just recently got the move function to turn the origin cell to empty instead of just “adding” a new checker to the board in the destination position. I also have the moves hardcoded to 2 spots and flipping between the players every move. It’s confusing, but it works for now.

There are a lot of things to talk about with even just this early stage and simplistic implementation. Design and decision choices. A couple questions I can answer easily together. Why am I using a table for the board? Why am I using an input box to move the checkers? Because I ripped those ideas right from the battleship game. I, essentially, don’t know of another way to do it. In fact, this is a good time to talk about my overarching design philosophy for this particular project. I aim to get it done and make it work however I can. I can always rewrite, but for now I just want to see this through.

I do try to keep my functions small and simple whenever I have the brainpower to do so. One place that shows well is in the functions to fill and empty cells. I pass in the minimum amount of information the need and update the view. Here they are:

fillEmpty

That’s it. I have run into some issues. To clear the entire board with the emptyCell function, I need to feed it the id of every cell. That means either storing all of the cell values in an array or building a function to create those values and feed them to emptyCell. Also, who knows how many other creative solutions I haven’t thought of. What I have decided to do instead is utilize jQuery, with mixed success. I’ll figure it out. At least half of the “fun” of coding for me has been troubleshooting. I see a lot of troubleshooting in my future!