# Appendix A {-}
-My journey as a programmer started when I was in elementary school. I became interested in computers after reading about them in the World Book Encyclopedia and hoped to work with them some day. What I didn't realize was that those encyclopedias were out-of-date and only showed the larger, more expensive mainframe and mini computers of the 1960s and not the more modern microcomputers that were introduced in the 1970s. When I realized that an Apple ][ was a microcomputer and that it was designed for the home market I began my quest to get a computer of my own (AKA: I started dropping not-so-subtle hints to my parents that I wanted a computer). I scoured magazines like Popular Computing and Byte Magazine looking for the right computer; from the Commodore VIC-20 and Sinclair ZX-80 to the Radio Shack TRS-80 Model III. My parents took me to computer stores and I marveled at the variety of machines that were there (and likely made a few sales-people nervous as I poked and prodded the new and rather expensive machines). Finally my dad picked up an Atari 400 computer with tape drive and I began learning BASIC programming in earnest. Around the same time my school opened a "computer lab" with three Commodore PET 4032 machines (complete with floppy disk drives) and I found myself spending every moment I could with those machines. In high school I took two programming courses, one in BASIC and the other in Pascal (which was my first exposure to procedural languages, and the basic concepts of computer science). In college I majored in Computer Science (with a bachelor of science) and did my best to keep up with all of the things that they tried to teach me. Unfortunately I wasn't a great student (especially in mathematics). I struggled with (and later dropped) my compilers class, and felt like I was falling behind where other students succeeded. Most of our classes used Pascal (which I was becoming more familiar with) but there were a few classes that used COBOL, Ada, SNOBOL, C, and assembly language. I graduated with modest scores and returned home.
+My journey as a programmer started when I was in elementary school. I became interested in computers after reading about them in the World Book Encyclopedia and hoped to work with them some day. What I didn't realize was that those encyclopedias were out-of-date and only showed the larger, more expensive mainframe and mini-computers of the 1960s and not the more modern microcomputers that were introduced in the late 1970s. When I realized that an Apple ][ was a microcomputer and that it was designed for the home market I began my quest to get a computer of my own (AKA: I started dropping not-so-subtle hints to my parents that I wanted a computer). I scoured magazines like Popular Computing and Byte Magazine looking for the right computer; from the Commodore VIC-20 and Sinclair ZX-80 to the Radio Shack TRS-80 Model III (Even the Rockwell AIM-65 or Heathkit H89 would have worked. I wasn't picky back then.) My dad took me to computer stores and I marveled at the variety of machines that were there (and likely made a few sales-people nervous as I poked and prodded the new and rather expensive machines). Finally my dad picked up an Atari 400 computer with tape drive, and I began learning BASIC programming in earnest. Around the same time my school opened a "computer lab" with three Commodore PET 4032 machines (complete with floppy disk drives), and I found myself spending every moment I could with those machines. In high school I took two programming courses, one in BASIC and the other in Pascal (which was my first exposure to procedural languages, and the basic concepts of computer science). In college I majored in Computer Science with a Bachelor of Science and did my best to keep up with all of the things that they tried to teach me. Unfortunately, I wasn't a great student (especially in mathematics). I struggled with and later dropped my compilers class, and felt like I was falling behind where other students succeeded. Most of our classes used Pascal, which I was becoming more familiar with, but there were a few classes that used COBOL, Ada, SNOBOL, C, and assembly language. I graduated with modest scores and returned home.
-Throughout my career I've straddled the divide between system administration and programming. My first jobs tasked me with maintaining various sorts of computers: desktop PCs, UNIX-based machines, and backing up the occasional VAX machine. It wasn't until one of my positions needed a website that my career added more programming to my resume. Programming websites in the 1990s was where I really started to learn and understand Perl, SQL, relational databases, and HTML. The web was so new in the 1990s that all of the folks on our projects were learning at the same time. I leveraged my Perl knowledge into several other jobs and projects doing web-based programming. Perl in the 1990s was a language where the basics were simple to learn but the language could handle really complex ideas and data structures. Perl and CGI made it easy to get something onto a web page that had some interactivity. Where Perl becomes complex is the syntax for things like regular expressions, and the tendency for Perl programmers to value code that does multiple actions on the same line. The Perl community also valued code that was clever, which lead me to wonder on several occasions if I was clever enough to be a Perl programmer.
+Throughout my career I've straddled the divide between system administration and programming. Linux was similar to the SunOS machines that I admired in college, so I transitioned to using that as my primary OS around 1995. My first jobs tasked me with maintaining various sorts of computers: desktop PCs, UNIX-based machines, and backing up the occasional VAX machine. It wasn't until one of my positions needed a website that I added more programming to my resume. Programming websites in the 1990s was where I really started to learn and understand Perl, SQL, relational databases, and HTML. The web was so new in the 1990s that all of the folks on our projects were learning at the same time. I leveraged my Perl knowledge into several other jobs and projects doing web-based programming. Perl in the 1990s was a language where the basics were simple to learn but the language could handle really complex ideas and data structures. Perl and CGI made it easy to get something onto a web page that had some interactivity. Where Perl becomes complex is the syntax for things like regular expressions, and the tendency for Perl programmers to value code that does multiple actions on the same line. The Perl community also values code that is clever, which lead me to wonder on several occasions if I was clever enough to be a Perl programmer.
One of the companies I worked at decided to migrate a Perl system over to a Java-based environment. They looked at the skills of the existing development team and decided they needed to outsource the project to another company. This was a common trend in the early 2000s for reasons that are outside of the scope of this book. This gave me my first taste as a team leader. I know a lot of programmers migrate over into managerial roles but at the time I didn't feel I had fully explored my programming potential. I sat down on several occasions and tried to learn Java but it never clicked for me. Java web development always felt more cumbersome than Perl CGI scripts that I created. It also didn't help that we were shipping `.war` files into a Tomcat system, which seemed like they were comprised of a lot of configuration metadata and very little code. This is what I was referring to when I spoke about being OK with giving up on learning something --- sometimes what we try to learn is more of a chore. Having something that is a chore isn't going to provide a good learning experience.
-It was around this time that I began learning Python on my own using Pygame. I took the plunge by entering my first [Pyweek](http://pyweek.org) competition. Pyweek is a week-long competition where folks build an entire game from scratch in one week. It was a challenge but was also one of the most rewarding experiences I've had in programming. I build a game called "Busy Busy Bugs" that was playable during a time when I really didn't know what I was doing. In many ways I was learning to swim by throwing myself into the proverbial deep end. I wasn't in any danger but the desire to get something done at the end of a week drove me in ways I didn't think was possible.
+It was around this time that I began learning Python on my own using Pygame. I took the plunge by entering my first [Pyweek](http://pyweek.org) competition. Pyweek is a week-long competition where folks build an entire game from scratch in one week. It was a challenge, but was also one of the most rewarding experiences I've had in programming. I build a game called "Busy Busy Bugs" that was playable during a time when I really didn't know what I was doing. In many ways I was learning to swim by throwing myself into the proverbial deep end. I wasn't in any danger, but the desire to get something done at the end of a week drove me in ways I didn't think was possible.
-As the technical lead position wore on I found myself wanting to do something else. I interviewed at several places and was hired at Sourceforge as a member of the Systems Operations Group. Sourceforge was an amazing experience for me. I dreamed of working for an Open Source company, and few Open Source companies were as well-regarded as Sourceforge and Slashdot were in the Open Source community. But my insecurities and "impostor syndrome" kicked in. Would I be able to cut it? Would they hire me only to realize they'd made a mistake and I wasn't as good as I claimed to be? I was friends with and had gone to school with several of the people who worked at Sourceforge / Slashdot, so I wondered about their motivations for hiring me. Was my getting hired an elaborate prank, or was I hired because several folks in the company knew me? All of these thoughts ran through my head while I worked there. It didn't help that my position was primarily system administration at a level that I was inexperienced at. There was also a programming component to the position, but I constantly felt like I was in way over my head. I lived in constant fear that I was going to be found out and that the job that I wanted would no longer be available to me. Granted I learned a lot and had very supportive and kind management at Sourceforge but I lived in dread whenever my manager would check in on me because I feared that the conversation would only highlight that I wasn't really supposed to be there.
+As the technical lead position continued I found myself wanting to do something else. I interviewed at several places and was hired at Sourceforge as a member of the Systems Operations Group. Sourceforge was an amazing experience for me. I dreamed of working for an Open Source company, and few Open Source companies were as well-regarded as Sourceforge and Slashdot were in the Open Source community, but my insecurities and "impostor syndrome" kicked in. Would I be able to cut it? Would they hire me only to realize they'd made a mistake and I wasn't as good as I claimed to be? I was friends with and had gone to school with several of the people who worked at Sourceforge / Slashdot, so I wondered about their motivations for hiring me. Was my getting hired an elaborate prank, or was I hired because several folks in the company knew me? All of these thoughts ran through my head while I worked there. It didn't help that my position was primarily system administration at a level that I was inexperienced at. There was also a programming component to the position, but I constantly felt like I was in way over my head. I lived in constant fear that I was going to be found out and that the job that I wanted would no longer be available to me. Granted I learned a lot and had very supportive and kind management at Sourceforge but I lived in dread whenever my manager would check in on me because I feared that the conversation would only highlight that I wasn't really supposed to be there.
I'd love to say that it had a happy ending and that my fears were unfounded, but sadly I was let go from that position due to budgetary constraints. I'm grateful for the opportunities I had there, the friends I made, and the experiences I had but I'd be lying if the layoff didn't come with a mixture of sadness and relief. Sadness that I might never have a cool job like that again, and relief that I could put away those impostor syndrome feelings for the time being. In many ways I grew from the experience of working at Sourceforge and learned a lot about myself and my capabilities while working there, but it was also the position where I felt my impostor syndrome at its fullest.
-Later on I was hired for a full-time position doing Python programming. This position allowed me to strengthen my craft as a Python developer. I created many interesting projects there and kept learning more about Python. It helped me to recuperate and broaden my skills. The folks at this position were very supportive and kind. There were times where it got stressful (all jobs seem have stress) but overall it was a positive experience.
+Later on I was hired for a full-time position doing Python programming. This position allowed me to strengthen my craft as a Python developer. I created many interesting projects there and kept learning more about Python. It helped me to recuperate and broaden my skills. The folks at this position were very supportive and kind. There were times where it got stressful (all jobs seem have stress), but overall it was a positive experience.
Sadly I was also laid off from that position (money sucks, y'know?).
-I started my job search in earnest and went to a bunch of interviews. While everyone in the interviews seemed impressed with my skills and my career I fell into one of two categories: either I wasn't a good fit for the position, or I didn't have enough skills in areas they were looking for. I found myself taking timed-coding-tests that felt like they were testing whether I got stressed easily rather than any coding skills I might have. I sat in coding sessions with shadowy figures that barked out commands and requirements while I tried my best to follow them. I did math puzzles and logic problems (which is horrifying if you're not good at either math or logic problems). Promising leads turned into rejection letters (assuming I heard back at all), and desperation set in as I faced the real prospect that I would have to give up programming if I wanted to make a living. Visions of heading back to the beginnings of my career filled me with dread. It seemed like nobody wanted to take a chance on me anymore and I couldn't compete with so many new programmers who hadn't made the mistakes from my career.
+I started my job search in earnest and went to a bunch of interviews. While everyone in the interviews seemed impressed with my skills and my career I fell into one of two categories: either I wasn't a good fit for the position, or I didn't have enough skills in areas they were looking for. I found myself taking timed-coding-tests that felt like they were testing whether I got stressed easily rather than any coding skills I might have. I sat in coding sessions with shadowy figures that barked out commands and requirements while I tried my best to follow them. I did math puzzles and logic problems (which is horrifying if you're not good at either math or logic problems). Promising leads turned into rejection letters (assuming I heard back at all), and desperation set in as I faced the real prospect that I would have to give up programming if I wanted to make a living. Visions of heading back to the beginnings of my career filled me with dread. It seemed like nobody wanted to take a chance on me anymore, and I couldn't compete with so many new programmers who hadn't made the mistakes that I had in my career.
I registered themediocreprogrammer.com during this period. If I was going to be a fuck-up then I might as well own it.
-Fortunately I've had a community of friends and fellow programmers to help support me. My current position is contracting with one of these friends to help him with programming tasks. That position came about from showing up to a programming conference every year (PyOhio). Throughout my struggles I've been fortunate to have a community there to help me. This is why I think communities are so great --- they give us a network of folks that we might not otherwise have, and help us through our triumphs and our struggles.
+Fortunately, I've had a community of friends and fellow programmers to help support me. My current position is contracting with one of these friends to help him with programming tasks. That position came about from showing up to PyOhio (a programming conference) every year. Throughout my struggles I've been fortunate to have a community there to help me. This is why I think communities are so great --- they give us a network of folks that we might not otherwise have, and help us through our triumphs and our struggles.
-I'm a collection of all of these experiences. They all make me who I am. Sometimes I wonder if I should have taken a different path or done something different but that's a futile exercise. The best I can do with these experiences is learn from them and move on. Each day I work to improve and better myself. Each day I make new mistakes, but that's all part of the learning process.
+I'm a collection of all of these experiences. They all make me who I am. Sometimes I wonder if I should have taken a different path or done something different, but that's a futile exercise. The best I can do with these experiences is learn from them and move on. Each day I work to improve and better myself. Each day I make new mistakes, but that's all part of the learning process.
My journey continues.
# Epilogue {-}
-It's a cliché for an author to say the book they wrote is the one they wished they had read when they were confronted with the topic presented in the book. Perhaps it's a cliché because it's true: this book contains the advice that would have helped me when I started this journey. Too often I've wondered if I've measured up to whatever metrics I created to represent the ideal programmer. Many times I saw the success of my peers and wondered if I was defective as a programmer or deficient in my learning. What was I getting wrong that others were getting right?
+It's a cliché for an author to say the book they wrote is the one they wished they had read when they were confronted with the topics presented in the book. Perhaps it's a cliché because it's true: this book contains the advice that would have helped me when I started this journey. Too often I've wondered if I've measured up to whatever metrics I created to represent the ideal programmer. Many times I saw the success of my peers and wondered if I was defective as a programmer or deficient in my learning. What was I getting wrong that others were getting right?
-I've come to realize that every programmer's journey is unique. Your journey is going to wend and wind in directions that are different than the directions that my journey took. You'll have experiences that I can't share, and I've had experiences that will be difficult for you to replicate unless you have a time machine. Neither of our experiences is more or less valid than each other, nor are they more or less valid than the experiences of other programmers. These are our experiences. The areas of our knowledge are only the areas that we've explored so far. There will always be gaps, but we can define those gaps as the areas that we haven't explored yet. There's always more to explore, and that exploration is the fun part of the journey.
+I've come to realize that every programmer's journey is unique. Your journey is going to wend and wind in directions that are different than the directions that my journey took. You'll have experiences that I can't share, and I've had experiences that will be difficult for you to replicate unless you have a time machine. Neither of our experiences is more or less valid than each others', nor are they more or less valid than the experiences of other programmers. These are our experiences. The areas of our knowledge are only the areas that we've explored so far. There will always be gaps, but we can define those gaps as the areas that we haven't explored yet. There's always more to explore, and that exploration is the fun part of the journey.
-No traveler can be at all places at all times. They must travel to each destination as fast or as slow as their transport allows, and stay there for as long as they can before traveling to their next destination. They travel with whatever companions they can find in whatever communities they can build. They build relationships and trust with themselves and others. They use their strengths to help others, and explore and improve their weaknesses. Each day they press onward. Like the traveler we too must choose our destinations and our companions. We can find those who, like us, are traveling down the same road and help us on our journey. We can exchange stories about our successes and failures, and experience each day as another link in our journey.
+No traveler can be at all places at all times. They must travel to each destination as quickly or as slowly as their transport allows, and stay there for as long as they can before traveling to their next destination. They travel with whatever companions they can find in whatever communities they can build. They build relationships and trust with themselves and others. They use their strengths to help others, and explore and improve their weaknesses. Each day they press onward. Like the traveler we too must choose our destinations and our companions. We can find those who, like us, are traveling down the same road and help us on our journey. We can exchange stories about our successes and failures, and experience each day as another link in our journey.
-I continue my journey each day and I hope that as a programmer you continue each day for as long as you are able. We might not be on the same exact roads together but we have the same goal: doing the best we can in each moment.
+I continue my journey each day and I hope that as a programmer you continue your journey each day for as long as you are able. We might not be on the same exact roads together, but we have the same goal: doing the best we can in each moment.
I wish you well on your journeys, and hope to hear the tales of your travels when we meet again.
# Gratitude {-}
-This book would not exist without the folks who accompanied me on my journey, both as instructors and as colleagues. My thanks and appreciation to all of my instructors in my formative years for giving me their best efforts to teach me programming in its various forms. I am indebted to all of my colleagues and programming friends over the years who shared their knowledge with me and trusted me enough to help them along the way. I am also blessed to have many communities that help sustain me, including the [Michigan!/usr/group][1], [PyOhio][2], [Coffee House Coders][3], and the [Ubuntu Michigan Loco][4]. Also to those who don't fit in these neat categories; know that if we spent any time discussing programming or other matters that our discussions are deeply appreciated.
+This book would not exist without the folks who have accompanied me on my journey, both as instructors and as colleagues. My thanks and appreciation to all of my instructors in my formative years for giving me their best efforts to teach me programming in its various forms. I am indebted to all of my colleagues and programming friends over the years who shared their knowledge with me and trusted me enough to help them along the way. I am also blessed to have many communities that help sustain me, including the [Michigan!/usr/group][1], [PyOhio][2], [Coffee House Coders][3], and the [Ubuntu Michigan Loco][4]. Also to those who don't fit in these neat categories; know that if we have spent any time discussing programming or other matters that our discussions are deeply appreciated.
-I also am grateful for the work of Leo Babauta of [Zen Habits][5] which provided me the ideas of mindfulness and focus containers. They have been transformative in my own work, as this book demonstrates. I committed to spending at least 10 minutes each morning to write each section, and the results are the work you see before you.
+I also am grateful for the work of Leo Babauta of [Zen Habits][5] which provided me the ideas of mindfulness and focus containers. They have been transformative in my own work, as this book demonstrates. I committed to spending at least 10 minutes each morning writing each section, and the results are the work you see before you.
-Thank you to those who helped me directly with this project. Thank you to my mom, Sharon Maloney, for her edits to this book. Any mist steaks that remain are an responsibilities of the author. Thank you to Beau Sheldon for reviewing the chapter on mental health and for helping me to better understand and highlight areas where folks struggle. Thank you to my friend David Revoy for his amazing cover art and for his inspiration throughout the project. Thank you to the beta readers for your valuable comments and feedback (their names are currently listed on the Framagit repo but will be listed here in a future revision).
+Thank you to those who helped me directly with this project. Thank you to my mom, Sharon Maloney, for help in my editing of this book. Any mist steaks what remain are an responsibilities of the author. Thank you to Beau Sheldon for reviewing the chapter on mental health and for helping me to better understand and highlight areas where folks struggle. Thank you to my friend, David Revoy, for his amazing cover art and for his inspiration throughout the project. Thank you to the beta readers for your valuable comments and feedback (their names are currently listed on the Framagit repo but will be listed here in a future revision).
My deepest gratitude goes to my wife JoDee and my parents for their support and belief in me. Words cannot express the love and thanks I have for you.