Transcript
Page 1: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Programming Exercises

12年6月5日星期二

Page 2: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Who am I?

2尹哲:[email protected] twitter: terryyin weibo: terry尹哲

12年6月5日星期二

Page 3: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Programming Exercises

12年6月5日星期二

Page 4: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Why Programming Exercises?

4

12年6月5日星期二

Page 5: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

5

12年6月5日星期二

Page 6: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Does software company need to train programmers?

6

Question

12年6月5日星期二

Page 7: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

7

vs.

Leonhard Euler Dojo

12年6月5日星期二

Page 8: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

What is ProjectEuler.net?

8

12年6月5日星期二

Page 9: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

ProjectEuler.net

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

9

"Project Euler exists to encourage, challenge, and develop the skills and enjoyment of anyone with an interest in the fascinating world of mathematics."

12年6月5日星期二

Page 10: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

10

ProjectEuler.net

12年6月5日星期二

Page 11: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

11

ProjectEuler.net

12年6月5日星期二

Page 12: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Expectations

12

Mathematics

Solution implementing

High performance coding

Solving problem

individually

12年6月5日星期二

Page 13: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Example: Quick & Dirty

13

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?

12年6月5日星期二

Page 14: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Another Example

14

12年6月5日星期二

Page 15: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

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

15

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

12年6月5日星期二

Page 16: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

16

12年6月5日星期二

Page 17: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

17

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

12年6月5日星期二

Page 18: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

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

18

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

Where’s the code for big number?

12年6月5日星期二

Page 19: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

19

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

Design?

12年6月5日星期二

Page 20: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

20

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...12年6月5日星期二

Page 21: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

What is Cyber Dojo?

21

12年6月5日星期二

Page 22: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

22

12年6月5日星期二

Page 23: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

23

12年6月5日星期二

Page 24: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

24

12年6月5日星期二

Page 25: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

RED - GREEN - REFACTOR

25

12年6月5日星期二

Page 26: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

26

12年6月5日星期二

Page 27: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

27

12年6月5日星期二

Page 28: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

28

12年6月5日星期二

Page 29: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Which One Do You Prefer?

29

12年6月5日星期二

Page 30: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Poker Hands

30

12年6月5日星期二

Page 31: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Poker Hands Kata

31

12年6月5日星期二

Page 32: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

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

32

12年6月5日星期二

Page 33: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Example: Complicated Transaction

33

12年6月5日星期二

Page 34: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Why Did I Do It Right With Only One Try?

34

12年6月5日星期二

Page 35: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

35

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

...

12年6月5日星期二

Page 36: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

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

36

12年6月5日星期二

Page 37: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Training

37

Discussin workshop

Developin concurrence

Deliverfor acceptance

12年6月5日星期二

Page 38: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Odd-eCertified Scrum Developer• One week course simulating how it feels to be on a Scrum project

- Realistic exercise to work on as a team- Topics covered: A-TDD, Build Automation, Sprint Planning, Pair

Programming, Continuous Integration, Test-Driven Development, Working in teams, Collective Code Ownership, Mocking, Code Smells & Refactoring, Good unit tests,Emergent Design, Working with Legacy Code, Craftsmanship

- Maximum 10 people, in Odd-e office- Java and C++ version- Fulfills the ScurmAlliance CSD

38

More info at: http://www.odd-e.com/courses.php?id=201205SingaporeCSD

12年6月5日星期二

Page 39: Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)

Coaching

39

12年6月5日星期二


Recommended