Michał Taszycki

Programming Workout

This video was recorded on http://wrocloverb.com. You should follow us at https://twitter.com/wrocloverb. See you next year!

Times are changing... Technology is moving forward... Command line tools are becoming obsolete... Programmers today don't need to touch type... Using mouse to copy and paste is perfectly fine... You can always look up those design patterns on the web... Your IDE can do a lot of things for you so you don't need to think... Can you feel that? Can you feel that this is TRUE? Then stop being UNPROFESSIONAL and think again!

In this talk I'm gonna convince you that learning seemingly obsolete skills can have huge impact on your productivity. I'll show you how those skills and other seemingly unimportant factors can impact your career. I will help you to find a way to improve them in order to become a better programmer. I'll also show you tools that can facilitate this process. You will either leave this talk with strong resolution to level up, or curl up in your comfort zone with your lovely mouse and IDE. I will show you how PROGRAMMERS WORK OUT.

wroc_love.rb 2012

00:00:11.710 Okay, so today I'm going to talk about programming workout. Now, let's not start like that. Most of you know that yesterday there was a party, and many of you were probably there. There's a high probability that the party is still going on, so before I start, I need to say that I am very, very impressed by each and every one of you in this audience.
00:00:20.179 Well, you were partying last night. You should be tired right now; you probably didn’t get much sleep last night, and some of you might still have a bit of a hangover. Okay, so to make the start better and to help lift the gloomy atmosphere, I would like to conduct a small experiment. I need your help, just a little bit.
00:00:31.000 Could you please stand up for me right now? Seriously. Okay, just look around, but don’t spill your coffee. Let’s do two small things for all the impressive people around you. Look around and see those faces? Yes. First, let’s smile at them. And then, let’s give them a small applause.
00:00:50.780 Alright, seriously, you're awesome! Now you can sit back, relax, and enjoy the talk. I want to share with you an idea about programming workouts. What I mean by programming workout is basically a set of routines for developers to follow in order to become better developers. If you follow them consistently and regularly, you should become a better developer.
00:01:03.360 I know it might seem a bit cryptic right now and may not make much sense, but please bear with me for a moment, and I’ll explain in about 15 minutes. So, who am I? My name is Michał Taszycki. You can find me on Twitter and GitHub using the handle 'michałdy'. First, I would like to tell you a bit about my journey as a software developer.
00:01:21.800 It all started when I was in primary school, and I saw a screen like this. Do you recognize it? Yes, the Commodore 64. I still remember the first program I wrote: 10 PRINT "HELLO"; 20 GO TO 10. It was a pretty complicated task for that time. Back then, I used to type out programs that I found in magazines, which was not really creative work. But since then, everything progressed quickly.
00:01:44.000 I finished my studies and got my master's degree in Kraków. I also studied for a year in Scotland and then worked in a few corporations. In ABB, I worked on automated tests for Java Web Services. Then in Sabre, I was dealing with legacy code written in C++ over a ten-year period by different developers, which was quite amusing.
00:02:02.800 Eventually, I realized one of my childhood dreams and became a game developer. I worked in Scotland at Cohort Studios and in Warsaw on projects like MotorStorm, which was one of the first games on PlayStation 3, and also worked on porting Saints Row from Xbox to PC.
00:02:22.680 After that, I joined Applike and worked there for about three years as a Rails developer and sometimes as a project leader. I enjoy my work there. Additionally, I am a member of the software craftsmanship group in Kraków, where we organized the first code retreat last year, inviting Corey Haines, the creator of code retreat workshops.
00:02:40.180 We also participated in the global day of code retreat, where I was honored to lead the code retreat in Warsaw. It was a fantastic event happening in 90 different cities around the world, with over 200 developers participating, starting simultaneously at 9 PM.
00:02:57.600 Now, why am I telling you all of this? During my journey as a software developer, I have met many programmers, and as you know, they are perfectly normal people. I’ve encountered a lot of good developers, some not-so-great programmers, but I’ve also met a few exceptional ones.
00:03:16.800 For instance, there’s John Carmack, the genius behind classic games like Quake, Doom, and Wolfenstein, among others. He’s a truly exceptional programmer. Another well-known figure is Gary Bernhardt, whom I had the opportunity to meet in Amsterdam. However, I didn’t realize just how impressive he was until I watched his Destroy All Software screencasts.
00:03:33.000 If you haven’t seen them, I highly recommend you subscribe. If you can't afford to, consider canceling your Spotify subscription and getting access to his screencasts instead—you will thank me later. Gary is a magician with programming.
00:03:52.600 Through my interactions with exceptional programmers, I noticed that they often appeared normal from the outside. However, when you see them at work, they display remarkable skills, consistently finding excellent solutions to problems. They work quickly, efficiently, and are masters of various aspects of development.
00:04:11.860 They have mastered their tools, programming languages, and, in some cases, they excel in specific areas like quick adaptations to new things. So, you might be tempted to attribute their skills to talent. But I believe this perception is misleading.
00:04:27.580 Talent is often seen as something you're born with or predisposed to. Everyone has some degree of talent; however, I suggest we look deeper. Reflect on your time in primary school—did you have a subject where you felt particularly gifted?
00:04:40.780 For example, many of you might have found math easy. But did this perception change when you entered high school? Did you find subjects becoming harder, requiring more effort to achieve the same level of proficiency?
00:04:57.890 I discovered that there are a few key qualities that define exceptional developers. First is having a clear vision. This means understanding what you want to be, what you want to become, and how you intend to get there. This clear vision enables you to extract actionable goals that help you move forward.
00:05:16.910 One trait we've noticed in these exceptional developers is their commitment to hard work. In my opinion, hard work is often underrated. There’s a misconception that programmers are lazy. It’s time to challenge this assumption.
00:05:36.440 While we benefit from fantastic tools and IDEs that make coding easier, we must not neglect the importance of hard work. It can sometimes feel as if we no longer need to remember variable names or framework methods because resources like Google and Stack Overflow provide quick answers.
00:05:52.930 I’m not arguing against convenience. But as a consequence, we might not remember things as we once did, and that’s a skill we risk losing if we don’t practice it. Learning to work hard is vital in all areas of our lives.
00:06:11.190 Speaking of hard work, do you remember Agatha's lightning talk from yesterday? She talked about her colleague Basia, who consistently receives compliments from clients for her excellent work. Agatha mentioned Basia didn't understand why. Well, I believe I can shed light on that.
00:06:25.030 The answer is that Basia is a hard worker. She manages to accomplish a lot of mundane tasks quickly and effectively, and she doesn’t become fatigued by them. Hard work isn't a talent; it's a skill that can be developed.
00:06:41.640 Now that we’ve talked about the qualities of exceptional developers, how do we go about becoming one? It may sound simple, but it's not easy. Creating a clear path to enhance our skills is not always straightforward.
00:06:58.950 When observing other developers, it’s not always clear what they did to reach their level of proficiency. So let’s look at another group of people we perceive as exceptional: athletes. Think of your favorite athlete, whether they be a soccer player, boxer, runner, or gymnast.
00:07:16.580 Now, let's focus on a specific athlete. Do you recognize this individual? It’s Arnold Schwarzenegger, the former Governor of California, but he’s best known as one of the most accomplished bodybuilders in the world. He’s achieved numerous goals—among them is his aspiration to be president of the United States.
00:07:35.490 Schwarzenegger exemplifies the four qualities I mentioned earlier: he has a clear vision, knows what he wants to achieve, knows how to extract goals from that vision, and is a remarkable hard worker. People who trained with him in the gym observed his exceptional work ethic.
00:07:53.350 This strong work ethic translates into all aspects of life. Exceptional athletes develop their skills through consistent workouts—training their muscles and honing their skills. Why can't we apply this same idea to our programming skills?
00:08:11.430 Let's explore how we can create our own programming workout routine. It's quite simple: you pick exercises, group them, perform them, rest, and start all over again. You can work out whenever you feel comfortable—whether you are a morning person or prefer to work late.
00:08:29.860 The key is to set a regular schedule. Aim for a couple of times a week for a workout. Each session can last anywhere from half an hour to one and a half hours—equivalent to one, two, or three Pomodoros, if you know what I mean.
00:08:44.900 When considering physical workouts, there are well-established theories regarding workout design. One could dive deep into literature on the subject, but we can also stick to simpler exercises to start with. So how can we define the programming skills we want to train?
00:09:05.270 I propose categorizing our skills into primary and secondary skills. Primary skills directly contribute to achieving our goals. Depending on your objectives, for becoming a good developer, key areas to focus on could include debugging, test-driven development, refactoring, and understanding different programming paradigms.
00:09:19.960 Additionally, mastering your programming language and frameworks is essential. If you want to get comfortable with Ruby on Rails, for instance, practice generating a Rails installation multiple times until it's second nature.
00:09:41.090 Secondary skills also aid in your development journey, albeit indirectly. For instance, touch typing can significantly enhance your productivity along with IDE mastery. Familiarity with keyboard shortcuts and command-line fundamentals will increase your workflow efficiency.
00:09:58.700 Can you navigate your shell and perform commands without needing a mouse? Skills such as source control proficiency and quick reading are vital as well. So, let’s develop a sample workout template—consider a weekly plan.
00:10:17.540 On Monday, for example, start your day with 15 minutes of touch typing, aiming for accuracy—try to make as few mistakes as possible. Next, switch to refactoring, picking a small segment of source code to practice the extract method—complete all steps manually without an IDE, and then revert the changes and repeat.
00:10:34.570 If you emulate the way athletes train—performing sets and repetitions—you might do three sets of two repetitions with rests in between. Following refactoring, consider doing some Vim practice—again, five sets of three repetitions tailored to a challenge.
00:10:55.300 Focus on various techniques and gradually increase your speed with certain commands. This repetition will engrain best practices into your muscle memory for more efficient coding sessions.
00:11:08.490 For Wednesday, you could do another 15 minutes of touch typing, primarily focusing on speed rather than accuracy. Then, engage in legacy code practice—select a technique from literature or resources that specialize in dealing with legacy systems.
00:11:26.540 For example, pick a technique detailed in Martin Fowler's book on effective legacy code management and practice it with several repetitions. Another exercise could be a programming kata, where your goal should be to create a small program with optimal coding practices.
00:11:40.240 If you prefer Friday, consider another touch typing session with a focus on difficult characters, such as brackets; you could also practice the 'tell, don't ask' principle by refactoring existing code. The goal is to make compliance with this principle your objective.
00:11:57.570 The precise details of your workout can differ. For example, if you're working on a particular language, pick challenges that require mastery, whether from coding challenges like Project Euler or specialized puzzles from various reputable sources.
00:12:12.150 Remember, it doesn't have to look exactly like I described—it can be a dedicated session for touch typing or debugging. Just as running for half an hour counts as a workout, so does half an hour dedicated to touch typing.
00:12:28.420 Next, you must measure your accomplishments. Monitoring your progress during each exercise is essential. Track your times, repetitions, and success rates. For example, how many refactorings can you accomplish within five minutes?
00:12:43.040 None of these measures must be overly complicated. Sometimes you can record screencasts of your coding. Assess your flow, think critically about what you can improve, and repeat the process.
00:13:02.190 Every workout should be tailored to your individual strengths and weaknesses. For example, if you can touch type small letters but struggle with uppercase letters or symbols, be conservative in your expectations.
00:13:18.910 Find a skill that's slightly above your comfort level, workout with that skill via repetitions, and only when you're confident should you gradually elevate the challenge.
00:13:36.320 You might wonder where to find ideas for workout routines. There are many resources available. For instance, if you want to master Vim, check the Vim Golf page or watch Vim casts to enhance your skills.
00:13:52.020 Engage with what experts share. If you attended any good workshops recently, practice what you learned. Use resources like Rubicon or Project Euler for challenges that sharpen your programming prowess.
00:14:06.230 Watching screencasts from seasoned programmers can be profoundly insightful. Not only will you learn techniques, but you’ll also witness different problem-solving approaches.
00:14:23.670 Commingle with developers, as a community can foster success. Look at other coders in action; that competition can be motivating.
00:14:36.920 Having a workout buddy is also beneficial. They can provide encouragement when motivation wanes—like when you'd rather not go to the gym. They will nudge you, reminding you to stick to your goals.
00:14:50.790 Furthermore, seek knowledge sharing among peers. Share workout goals, templates, and progress updates. Collaboration can strengthen your skills.
00:15:02.730 The bottom line is simple: if you like these ideas and want to become a better developer, I’d love to help build a community of like-minded individuals. I’m starting a project called Programming Workout.
00:15:19.590 If you're interested, visit programmingworkout.com and leave your email. Upon readiness, I'll share sample workout routines.
00:15:36.200 These will consist of structured exercises for three days a week—Monday, Wednesday, and Friday. If someone prefers not to create their own workout, they can follow guidance provided on the site.
00:15:52.750 In the future, I aim to create a vibrant and interactive platform for discussing programming workouts and sharing ideas. Working together with a substantial community, we can not only measure progress but also optimize our learning path.
00:16:05.820 If this resonates with you, don’t hesitate to contact me on Twitter or leave your email address. If you have any inquiries or topics you want to discuss, feel free to reach out.
00:16:19.200 That’s all I wanted to share with you today, so thank you for coming and paying attention. If you have any questions, I’ll be happy to answer them now.
00:16:38.570 (Q&A session begins)