This book is new. If you'd like to go through it, then join the Learn Code Forum to get help while you attempt it. I'm also looking for feedback on the difficulty of the projects. If you don't like public forums, then email email@example.com to talk privately.
Part I: Initial Knowledge
The very first thing you need to learn is everything. I know that's intimidating, but as I mentioned in the introduction, you are going to only practice three skills for the entire book. Each exercise is going to enforce each of the skills as you complete other tasks. I may tell you to "make a copy of the cat command", but what you are really learning is how to be creative. I may tell you to "create a linked list data structure", but what you're really doing is applying structured code review processes to your programming practice. The secret of this book is that you are only using the projects and exercises as a vehicle to learn three important practices: Process, Creativity, and Quality.
Ideally there's nothing magical about these three concepts. Process is simply the steps you use to create something. Creativity is simply how you generate and implement ideas. Quality is simply how you make sure those implementations aren't junk. The meat is in the application. How do you apply a process to your personal development skills? How do you analyze whether you've been building quality software or not? How do you take an idea and turn it into reality? All three of these are interconnected as you need a process to help you get creative and then a process for ensuring quality, which also requires being creative since no process works all the time. It's a vicious, beautiful cycle.
The process for completing this book is simply this:
- I will give you a goal of working on Process, Creativity, or Quality for a part of the book. Usually it will be two concepts at a time or maybe just one. For example, in Part II you are working on creativity by hacking on simple tools in a 45 minute fast session. You are also analyzing your starting process since, if you find it difficult to start, you won't be very creative.
- The beginning of each exercise will give you a prompt or goal to think about while you work on the exercise. Each of these prompts will ask you to focus on one or more aspects of what you're working on. Exercise 4 in Part II gives you the task of simply implementing something, and then in Exercise 5 you start to list the things that blocked you and try to eliminate them or make them more efficient. Other exercises ask you to look at your physical environment and fix anything distracting. Each time you'll think about these prompts and then work on the exercise, attempting to focus on that particular task.
- At the end of each exercise there are Study Drills that give you more challenges to work on. They may be related to the project or they might be more about the process, creativity, or quality issue you're dealing with in the exercise.
- Some exercises are "Challenge Mode". That means you are given a description of a tool to implement, usually based on an existing Unix tool, and then told to implement it but without any code to look at. There may be small pieces of sample code you'll need to study first, but usually there is no Python in these challenges. The solutions are available online in a Git project at http://bit.ly/lmpthwsolve on Github.
- Other exercises will be educational descriptions of something you have to implement based on my code. These exercises will explain something, such as an algorithm, and then you are to implement them as exactly as possible and find any bugs you can. Typically these exercises will focus on Quality since you'll be asked to write automated tests, track your error rates, and find solutions to additional problems in the Study Drills.
- Finally, you'll use a Lab Journal to take notes and keep track of metrics you can use to improve how you work. I am very explicit about treating this as a journal, meaning a very private personal account of your improvement that you should not share with anyone. Especially nobody who is a manager at your company. This kind of information can be used to take advantage of you as a worker, so guard it carefully.
Your goal when going through this book is not just to whip up a few copies of some Unix tools. Your goal is to use these small Unix tool projects to focus on aspects of your ability to work on larger projects.
What If I Hate Your Stupid Personal Process Zed?
That's completely alright. This book is meant to be something that helps you grow and improve, so if you are not quite ready to analyze how you work then save that for later. You can simply do all of the challenges in your own way and your own time, then come back and attempt the projects with the constraints on your process. Every exercise stands on its own and the personal development portions apply to almost anything you work on. Do what you can and come back when you need to work on how you work.
What If I Find Out I'm Terrible?
That is a very real possibility, but my method works to help you know why you are terrible and what to do in order to fix it. Then it's just a matter of working on it until you start getting better. Keep your journal private, and nobody will know just how terrible you are. Then when you're done you'll know exactly where you stand and what you need to work on. No more guessing at whether you're a fraud or can really do the job. You'll objectively know your strengths and weaknesses so you can stop worrying about where you stand in the world.
However, you probably are not as terrible as you think. This book is meant to be a private course in improving your objective outlook on your skills. That means you should be focusing not on how good you are at something, but how much you improve. If you find yourself getting upset at your performance on a particular exercise then you need to break it down and find out what you can improve. You also need to look at that one exercise in the context of all the others you've completed and objectively rate your improvement. Focusing on improvement helps you think objectively (not positive or negative) and keep learning.