Practice C# program number two is progressing. If you feel brave and opt to inspect the Github link provided, you’ll probably feel the same awkward sense of confusion at the use of “progressing”, however.
This post is a call–or plea–for help. My console-calculator program is an attempt to discover how I might use object-oriented design and expand my technical knowledge. At this point, I feel as though I’m regressing into the same patterns that limited me ten years ago. In addition, I’ll share my thoughts and feelings as a novice trying to learn programming on my own – and what lessons I’m extracting for Agile coaches.
In my task breakdown, my first objective was to establish a “calculator class” and get the program working with a method to perform addition. As I moved through my tasks, adding code to allow additional numbers to the calculation and a subtraction method, I’ve noticed the ability to read my own code is declining! I’m having flashbacks of my poorly written programs from many years ago: stepping through lines of code one after the other just to understand where I was, where I needed to go, and what I was trying to accomplish.
My most recent commit enhances the calculator to perform addition and subtraction of whole numbers, including “continuing” the calculation with new numbers. To reach this point of functionality, I felt like I was throwing code at holes to make everything work in the “moment”, without having a good sense of how everything comes together. I can’t help but think developers would prefer to code in a proactive state, versus my very reactive state.
Worse, I’m repeating code and intentionally leaving it there because I can’t figure out how to make the ugliness disappear. Previously, I learned how to extract duplicate code to a method, but this current puzzle would necessitate the return of multiple outputs. There’s this oddly intuitive part of me that wonders if that fact itself is pointing red flags at bad design… and another part that wonders if OO design might be in play here. Couldn’t I use a new class instance to handle two variables that need to be “consumed” elsewhere? Even if true, I have no idea how to do this… and this lack of knowledge is very intimidating.
This program was meant to begin exploring how object-oriented design could change my perception of programming. And a calculator seems like an easy way to start! Yet here I am struggling mightily and rapidly falling back into the space where I felt confident that programming was just not a skill suited for my intellectual ability. I’m definitely capable of writing code (and learning code) that eventually “does the job”. But it quickly becomes unwieldy, messy, and hard to maintain. If it’s this difficult for me to write a wonky console calculator, I shudder to think at what’s needed to build a “real” application.
With that little pity-party aside, I’ll conclude with thoughts from an Agile coaching perspective:
- Technical knowledge learned in isolation is capped at the individual’s ability (at that moment). What I learn will be limited by my ability to learn it through a single means of learning (self-study). What an important lens for team development to look through!
- Software teams must grow technical and emotional skills. There appears to be a “tipping point” in technical skill where attention to emotional development becomes important. Clearly a team of novices, i.e. a team of Zachs, requires a high degree of programming mentor-ship, not an Agile coach like myself.
- Is this experiment effectively implementing an inspect-adapt loop? What might a better way look like?
- My anxiety to complete tasks and reach the next stage of functionality might be similar to an imposed team deadline. I want to “make it work”, they want to “meet the deadline”… the result in both cases might be poor code that creates additional pain in the future.