Programming exercises

Post on 02-Nov-2014

489 views 3 download

Tags:

description

This is a motivational talk about practicing programming skills as a professional programmer. I gave the talk many times in many conferences and companies. You can find the video of me giving the talk on this here (in Chinese): http://v.youku.com/v_show/id_XMzI3OTI1MDQw.html I did the talk in English as well, but there's no video online.

transcript

Programming Exercises

Terry Yin

Who am I?

�2

Why Programming Exercises?

�3

�4

Quality vs. Quantity

�5

Gamification

�6

Does software company need to train programmers?

�7

Question

�8

vs.

Leonhard Euler Dojo

What is ProjectEuler.net?

�9

ProjectEuler.net

• Project Euler is a series of challenging mathematical/computer programming problems that requires more than just mathematical insights to solve.

�10

"Project Euler exists to encourage, challenge, and develop the skills and enjoyment of anyone with

an interest in the fascinating world of mathematics."

�11

ProjectEuler.net

�12

ProjectEuler.net

Expectations

�13

Mathematics

Solution implementing

High performance coding

Solving problem individually

Example: Quick & Dirty

�14

Once you solved a problem, you are entitled to join the forum for this problem. You can share your solution with the other people who have also solved it. And the post usually start with this sentence:!

Good coding habit?

Another Example

�15

• It’s too simple for Java, Ruby or Python, for which they can handle big numbers by default."

• So let’s look at C/C++."• Real code copied from

the forum.

�16

int i, j, k, n, sum;!int factorial[10000];!"int* getfactorial(int n)!{! factorial[0] = 1;! k = 0;! for(i = 2; i <= n; i++)! {! for(j = 0; j <= k; j++)! factorial[j] *= i;! for(j = 0; j <= k; j++)! {! if(factorial[j] >= 10)! {! factorial[j+1] += (factorial[j] - (factorial[j] % 10)) / 10;! factorial[j] = factorial[j] % 10;! if(j == k)! k++;! }! }! }! return factorial;!}!"int getsum(int* array, int k)!{! sum = 0;! for(i = 0; i <= k; i++)! sum += array[i];! return sum;!}!"int main()!{! int* factorial = getfactorial(n);! sum = getsum(factorial, k);! cout << "\nThe sum of the digits of " << n << "! is " << sum << ".\n";! return 0;!}!

�17

�18

Big number again. Ha ha, I did that before! Let me reuse it...

#include<iostream>!"using namespace std;!"int i, j, k, n, sum;!int factorial[10000];!"int* getfactorial(int n)!{! factorial[0] = 1;! k = 0;! for(i = 2; i <= n; i++)! {! for(j = 0; j <= k; j++)! factorial[j] *= i;! for(j = 0; j <= k; j++)! {! if(factorial[j] >= 10)! {! factorial[j+1] += (factorial[j] - (factorial[j] % 10)) / 10;! factorial[j] = factorial[j] % 10;! if(j == k)! k++;! }! }! }! return factorial;!}

�19

Why the big number is named ‘factorial’ in my previous implementation?

Where’s the code for big number?

�20

#include <stdio.h> "#define NUMB 120 // 9 * 120 = 1080 total digits. #define SIZE 1000000000 // 9 digit numbers "int main() { int i = 0; int j = 0; int bigNum1[NUMB]; int bigNum2[NUMB]; int bigNum3[NUMB]; int counter = 0; " for (i = 0; i < NUMB; i++) { bigNum1 = 0; bigNum2 = 0; bigNum3 = 0; } " bigNum1[0] = 1; bigNum2[0] = 1; counter = 2; i = 0; " while (i == 0) { counter++; for (j = 0; j < NUMB; j++) { bigNum3[j] = bigNum2[j] + bigNum1[j]; } for (j = 0; j < NUMB-1; j++) { while (bigNum3[j] >= SIZE) { bigNum3[j] -= SIZE; bigNum3[j+1]++; } } if (bigNum3[111] >= 1) break; for (j = 0; j < NUMB; j++) { bigNum1[j] = bigNum2[j]; bigNum2[j] = bigNum3[j]; } } " printf("\n"); printf("P025 answer = %u", counter); }

OK, too hard to reuse. It’s not that hard to invent the wheel again.

�21

Problem solving exercises

✓Train very important skills

✓Often used as interview

questions

✓Probably also train skills in

making maintainable code,

a little.

•Don’t do it before bed time...

What is Cyber Dojo?

�22

�23

�24

�25

RED - GREEN - REFACTOR

�26

�27

Unit Test

Integration Test

Functional Test

�28

�29

�30

Refactoring Dojo

�31

Code Retreat

✓✓✓✓✓✓✓

�32

A day-long practice-intensive event for programmers, !popularized by Corey Haines.

Which One Do You Prefer?

�33

Poker Hands

�34

Poker Hands Kata

�35

Poker Hands in ProjectEuler

•This is not a very hard problem to solve, comparing to most of the problems listed in ProjectEuler.net"

•But it’s hard to solve it without bugs if you don’t have unit tests."

•Problem 54 in projectEuler.net

�36

Example: Complicated Transaction

�37

Why Did I Do It Right With Only One Try?

�38

�39

TEST(poker_hand, comparing){ CHECK(pokerHand("4H 5C 6S 7S TD")< pokerHand("2C 3S 7S 8D KD")); CHECK(!(pokerHand("4H 5C 6S 7S KD")< pokerHand("2C 3S 7S 8D TD"))); CHECK(pokerHand("4H 5C 6S 7S KD")> pokerHand("2C 3S 7S 8D TD")); } TEST(poker_hand, compare_cards){ CHECK(pokerHand("3H 5C 6S 7S 8D")< pokerHand("4H 5C 6S 7S 9D")); CHECK(pokerHand("3H 5C 6S 7S 9D")< pokerHand("4H 5C 6S 7S TD")); CHECK(pokerHand("3H 5C 6S 7S TD")< pokerHand("4H 5C 6S 7S JD")); CHECK(pokerHand("3H 5C 6S 7S JD")< pokerHand("4H 5C 6S 7S QD")); CHECK(pokerHand("3H 5C 6S 7S QD")< pokerHand("4H 5C 6S 7S KD")); CHECK(pokerHand("3H 5C 6S 7S KD")< pokerHand("4H 5C 6S 7S AD")); } TEST(poker_hand, compare_high_cards_2nd){ CHECK(pokerHand("3H 5C 6S 7S 9D")< pokerHand("3H 5C 6S 8S 9D")); } TEST(poker_hand, compare_high_cards_3nd_4th_5th){ CHECK(pokerHand("3H 5C 6S 8S 9D")< pokerHand("3H 5C 7S 8S 9D")); CHECK(pokerHand("3H 4C 7S 8S 9D")< pokerHand("3H 5C 7S 8S 9D")); CHECK(pokerHand("2H 5C 7S 8S 9D")< pokerHand("3H 5C 7S 8S 9D")); } TEST(poker_hand, compare_high_card_and_one_pair){ CHECK(pokerHand("3H 5C 6S 8S 9D")< pokerHand("3H 5C 7S 8S 8D")); } TEST(poker_hand, compare_one_pairs){ CHECK(pokerHand("3H 5C 6S 9S 9D")> pokerHand("3H 5C 7S 8S 8D")); CHECK(pokerHand("5C 6S 9S 9D KD")> pokerHand("5C 7S 8S 8D AD")); CHECK(pokerHand("5C 6S 9S 9D KD")< pokerHand("5C 7S 9S 9D AD")); } "...

Do deliberate exercises. Alone and with the others. Always use good practices. Have fun.

�40