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

Post on 18-Dec-2014

725 views 10 download

description

讲师 :尹哲 尹哲是Odd-e团队中的一名敏捷教练。他在软件行业有超过12年的经验,其中大部分是在电信领域。他有丰富的培训和咨询软件工程的经验,如测试驱动开发,系统工程实践以及分析实践等。他在敏捷与精益教练方面也很有经验,尤其是Scrum。他在研发管理和软件设计两方面都有很强的能力。他同是还是敏捷社区和开源软件的积极参与者. 话题介绍: 专业的软件工程师需要通过不断的练习来保持自己的最佳状态和自我提升。该话题将会介绍两种不同类型的编程练习,一种是解决一个特定的问题,另一种则是提高团队协作和对编程设计原则的理解。同时,话题中将有一些关于测试驱动开发和软件设计的内容,让听众一起来思考。

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

Programming Exercises

12年6月5日星期二

Who am I?

2尹哲:terry@odd-e.com twitter: terryyin weibo: terry尹哲

12年6月5日星期二

Programming Exercises

12年6月5日星期二

Why Programming Exercises?

4

12年6月5日星期二

5

12年6月5日星期二

Does software company need to train programmers?

6

Question

12年6月5日星期二

7

vs.

Leonhard Euler Dojo

12年6月5日星期二

What is ProjectEuler.net?

8

12年6月5日星期二

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日星期二

10

ProjectEuler.net

12年6月5日星期二

11

ProjectEuler.net

12年6月5日星期二

Expectations

12

Mathematics

Solution implementing

High performance coding

Solving problem

individually

12年6月5日星期二

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日星期二

Another Example

14

12年6月5日星期二

• 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日星期二

16

12年6月5日星期二

17

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

12年6月5日星期二

#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日星期二

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日星期二

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日星期二

What is Cyber Dojo?

21

12年6月5日星期二

22

12年6月5日星期二

23

12年6月5日星期二

24

12年6月5日星期二

RED - GREEN - REFACTOR

25

12年6月5日星期二

26

12年6月5日星期二

27

12年6月5日星期二

28

12年6月5日星期二

Which One Do You Prefer?

29

12年6月5日星期二

Poker Hands

30

12年6月5日星期二

Poker Hands Kata

31

12年6月5日星期二

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日星期二

Example: Complicated Transaction

33

12年6月5日星期二

Why Did I Do It Right With Only One Try?

34

12年6月5日星期二

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日星期二

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

36

12年6月5日星期二

Training

37

Discussin workshop

Developin concurrence

Deliverfor acceptance

12年6月5日星期二

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日星期二

Coaching

39

12年6月5日星期二