Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Programming Exercises - Terry Yin - Agile SG 2013

Programming Exercises - Terry Yin - Agile SG 2013

Presented in Agile Singapore 2013 Conference

Programming skills are so fundamental these days that people seem to take them for granted. However, a 10 year veteran might only have accumulated 1 year of experience as performing the same programming tasks over 10 years would not have resulted in 10 years' worth of skill development. To improve ones programming skills requires deliberate and intentional practice. This session will introduce a couple of ways to do programming exercises and will demonstrate the difference in their effectiveness. Terry will start you off on the journey to mastering the craft of programming.

Agile Singapore

November 07, 2013
Tweet

More Decks by Agile Singapore

Other Decks in Programming

Transcript

  1. Programming
    Exercises
    Terry Yin

    View Slide

  2. Who am I?
    2

    View Slide

  3. Why Programming Exercises?
    3

    View Slide

  4. 4

    View Slide

  5. Quality vs. Quantity
    5

    View Slide

  6. Gamification
    6

    View Slide

  7. Does software company need to
    train programmers?
    7
    Question

    View Slide

  8. 8
    vs.
    Leonhard Euler Dojo

    View Slide

  9. What is ProjectEuler.net?
    9

    View Slide

  10. 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."

    View Slide

  11. 11
    ProjectEuler.net

    View Slide

  12. 12
    ProjectEuler.net

    View Slide

  13. Expectations
    13
    Mathematics
    Solution implementing
    High performance coding
    Solving problem
    individually

    View Slide

  14. 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?

    View Slide

  15. Another Example
    15

    View Slide

  16. • 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;!
    }!

    View Slide

  17. 17

    View Slide

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

    View Slide

  19. #include!
    "
    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?

    View Slide

  20. 20
    #include
    "
    #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.

    View Slide

  21. 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...

    View Slide

  22. What is Cyber Dojo?
    22

    View Slide

  23. 23

    View Slide

  24. 24

    View Slide

  25. 25

    View Slide

  26. RED - GREEN - REFACTOR
    26

    View Slide

  27. 27
    Unit Test
    Integration Test
    Functional Test

    View Slide

  28. 28

    View Slide

  29. 29

    View Slide

  30. 30

    View Slide

  31. Refactoring Dojo
    31

    View Slide

  32. Code Retreat
    ✓-G[DQCTFQPN[
    ✓7UGCRNCKPVGZVGFKVQT
    ✓4GCNN[UOCNNOGVJQFU
    ✓0QEQPFKVKQPU
    ✓0QNQQRU
    ✓0QRTKOKVKXGV[RGUQPKPVGTHCEG
    ✓0QTGVWTPXCNWGU
    32
    A day-long practice-intensive event for programmers,

    popularized by Corey Haines.

    View Slide

  33. Which One Do You Prefer?
    33

    View Slide

  34. Poker Hands
    34

    View Slide

  35. Poker Hands Kata
    35

    View Slide

  36. 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

    View Slide

  37. Example: Complicated
    Transaction
    37

    View Slide

  38. Why Did I Do It Right
    With Only One Try?
    38

    View Slide

  39. 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"));
    }
    "
    ...

    View Slide

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

    View Slide