Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)
-
Upload
letagilefly -
Category
Technology
-
view
725 -
download
10
description
Transcript of Scrum Gathering 2012 Shanghai_工程实践与技术卓越分会场:编程练习(尹哲)
Programming Exercises
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日星期二