What I learned today:
Underlining Principles of being a Software Craftsman:
*Estimating tasks and using the point system - Accurately assessing how long any task will take, how difficult it will be, and thus how many points it should be worth, is never easy. The points might initially be based off of man ours, but quickly a point becomes a point based on how many points you judged another similar task would take. This means the point system is usually indefinite. Especially when you just begin talking about a feature or task, write it on a note card, and are suddenly trying to guess the full extent of its complexity. Of course any developer will get better and better at this over time, but still can be surprised that a task took three times as long as he/she thought.
One strategy that I saw today to counteract this issue is having a group of developers all vote at once on a feature. They would hold out there hands and on three stick out fingers according to how many points they thought the task was worth, as if they were playing a game of rock paper scissors. This can increase the accuracy of the estimation, when you average all of the guesses together, but it still isn't perfect.
The challenge in estimating points leads to the challenge in calculating a team's average velocity (where velocity is how many points they finish in an iteration). A team's velocity might be 18 one iteration, and just a few weeks later it might suddenly be half that. This makes me think that there has to be a better and more accurate way of judging the speed of any group of developers, but I haven't thought of one yet...
*Taking a step back and looking at the big picture - After Spiking out my text box for a few days, I got a pretty good understanding of how each and every piece should work. I was constantly fiddling, moving things around, trying out new ideas, and experimenting with different strategies. I was pretty confident that I understood how to make a text box.
Then Micah asked me to design the text box, how I would write it in my final version, in its entirety. He told me to write it down on paper using the UML design structure. So after I did a little research, I got a pen and paper and started drawing boxes and connecting lines together. The more I drew the worse everything got. It wasn't long before I realized a pen... just wasn't going to work out. Micah of course already knew this, and by the time I went over to him he was holding a pencil and big eraser for me to use.
I tried again, and this time I had an even better idea of how I wanted my system to work. As I began to tie my classes together started holding more and more of my task in my brain at once. Then there was a single moment when an awesome wave rushed through me and I realized I had moved out several levels of abstraction and was now holding my entire project in my brain in full detail. It was at this point that I began noticing many patterns, and a repetitive nature I had not seen when I was first hacking away at my code.
This was my Rubik's Cube moment. When I saw strategies I could use to solve my problem as a whole rather than side by side. I felt like an architect who had just made a model of my building, tore it down, and began making sketches.
I think this is another thing that defines a Craftsman. A Craftsman will have the ability to see the big picture, and draw lines between what seemed to be unconnected places.
General Knowledge of Language:
Unfortunately I didn't do a whole lot of coding today so I didn't learn any general rules of languages.
*Macs and PCs use the ctrl and command buttons quite differently. On a Mac you can use Cmd to jump to opposing ends of text (in a text box) and use Alt to jump to the end of a word. A PC however uses Ctrl to jump to the end of words, and for Java Swing text boxes at least, Alt doesn't let you do a arrow jumping... I know this is world shaking, but it is interesting none the less. Also, Ctrl C is actually an ASCII character.
Thats all for today. Lots of driving through thick snow, and sitting in on iteration meetings.