Agile Singapore
November 07, 2013
230

# 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

## Transcript

1. Programming
Exercises
Terry Yin

2. Who am I?
2

3. Why Programming Exercises?
3

4. 4

5. Quality vs. Quantity
5

6. Gamiﬁcation
6

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

8. 8
vs.
Leonhard Euler Dojo

9. What is ProjectEuler.net?
9

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

11. 11
ProjectEuler.net

12. 12
ProjectEuler.net

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

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

Good coding habit?

15. Another Example
15

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;!
}!

17. 17

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

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?

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");
}
OK, too hard to reuse. It’s not
that hard to invent the wheel again.

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

22. What is Cyber Dojo?
22

23. 23

24. 24

25. 25

26. RED - GREEN - REFACTOR
26

27. 27
Unit Test
Integration Test
Functional Test

28. 28

29. 29

30. 30

31. Refactoring Dojo
31

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.

33. Which One Do You Prefer?
33

34. Poker Hands
34

35. Poker Hands Kata
35

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

37. Example: Complicated
Transaction
37

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

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

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