//@roofimon
“ ”
“ ”
You can not find the best
solution but you can find the
optimal one.
Agenda
• Software Development in my perspective
• Methodology
• TDD
• Tools
• Q n A
• Little bit about @roofimon
• 26 2518 1 2
• A-F
• IT Technical Architect DTAC
• Architect ?
• “ ”
Software Development
•
• ?
• “ ”
•
• IT
?
Just an Example
• Programmer
• Project Management
• Solution Architecture
• System Integration
• Database Administration
• Testing
• Security
• Operation
• Infrastructure
- -
English for Communication
000102 - -
English for Academic Purposes (EAP
II)
000103 - -
English for Academic Purposes I
(EAP II)
000112 - -
Thai for Academic Purposrs(???
Software Development
and Operation is like
grocery store
How to build software like 7-11
• Work
• Not over budget
• In time
• Easy to transition
• Easy to operate and maintain
We need
• Methodology
• Good Programmer
• Tools
Lack of Methodology
How to survive?
Methodology
Methodology reflect …
Methodology
Team
Structure
Individual
Behavior
Discipline
Which one is the best?
Which one is the suitable for us?
The Greatest Waterfall
The Greatest Waterfall
Requirement
Analysis
Design
Implementation
Integration
Testing
Maintenance
Waterfall Team
Waterfall Discipline
• Project is divided into sequential phases.
• Emphasis an entire system at one time.
• Tight control is maintained through the use of
extensive written documentation.
Waterfall s..ks?
Waterfall not wrong
• 90% of enterprise firm in Thailand still using
waterfall model.
• It’s big , really big. 100 people involve with
project.
• Match with their procurement process
• Strong Audit process.
• “Trust ??”.
Developer Discipline
• Depends on developers themselves
• Mostly, make it fast.
• Mostly, make it done.
• Deadline ahead
• Quality ummmmm QA team will cover it for
somehow
• Aggressive Regression Test
• Customer will come when our software is “done”.
• Change request, Change request, Change request
What about small organization?
• They need something that is really “work”.
• They can spend time with your team.
• So Waterfall again?
• We need methodology that focus on
delivering software that working.
Agile Development Methodology
WhyAgile?
Requirement
Analysis
Design
Implementation
Integration
Testing
Maintenance
Customers
Analyst
Architect
Labor
Labor
Tester
Three simple truths
• 1. It is impossible to gather all the
requirements at the beginning of a project.
• 2. Whatever requirements you do gather are
guaranteed to change.
• 3. There will always be more to do than time
and money will allow.
Agile Team
Discipline
• Customer satisfaction by rapid delivery of useful software
• Welcome changing requirements, even late in development
• Working software is delivered frequently (weeks rather than
months)
• Working software is the principal measure of progress
• …
• …
• …
• Regular adaptation to changing circumstances
Developer Discipline
• According to 3 simple truth
• Agile coder will carry these four basic activities
along with them
– Coding
– Testing
– Listening
– designing
Anyway
• Grocery Store does exist but …?
• Waterfall and Agile
• Waterfall still dominate the market.
• Waterfall itself doesn’t encourage
programmer to write good code.
• We need something.
• Applied TDD into development phase in
Waterfall 
We understand the story, so we
Happy.
Produce good code
Good Programmer = Good Software
• Understandable
• Testable
Understandable
The Program
• a1 is a yng and gftd sftwreng attempting to
hackMnfrm() of sftw company ENCOM in
order to fndEvdc() that senior executive
a2 stole() a1's cde and prsnt() it as his own,
earning him a rapid series of promotions. a1 is
blcked() by the MCP, an ai that ctrl the ENCOM
mnfrm.
The Program
kevinFlynn is a young and gifted
SOFTWARE_ENGINEER attempting to hack() into
the mainframe of encom =
SoftwareCompany(“ENCOM”) in order to
findEvidence() that ENIOR_EXECUTIVE
edDillinger stole(kevinFlynn) code and presented
it as his own, earning him a rapid series of
promotions. kevinFlynn is blocked() by the
MasterControlProgram , an
artificialIntelligence that controls(encom) the
ENCOM mainframe.
Understandable
• Use Intention-Revealing Names
• Make Meaningful Distinctions
• Use Pronounceable Names
• Use Searchable Names
• Avoid Encodings
Use Intention-Revealing Names
//================================
int d // elapsed time in days
//=================================
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;
Use Intention-Revealing Names
public List<int[]> getThem() {
List<int[]> list1 = new
ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4) list1.add(x);
return list1;
}
Use Intention-Revealing Names
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells =
new ArrayList<Cell>();
for (Cell cell : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
Use Searchable Names
int realDaysPerIdealDay = 4;
const int WORK_DAYS_PER_WEEK = 5;
int sum = 0;
for(int j=0; j<NUMBER_OF_TASKS; j++){
int realTaskDays =
taskEstimate[j]*realDaysPerIdealDay;
int realTaskWeeks =
(realdays / WORK_DAYS_PER_WEEK);
sum += realTaskWeeks;
}
Avoid Side Effect
public class UserValidator {
private Cryptographer cryptographer;
public boolean checkPassword(String userName,
String password) {
User user = UserGateway.findByName(userName);
if (user != User.NULL) {
String codedPhrase =
user.getPhraseEncodedByPassword();
String phrase =
cryptographer.decrypt(codedPhrase,
password);
if ("Valid Password".equals(phrase)) {
Session.initialize();
return true; }
} return false;
}
}
Testable
• What?
• We just understand our code.
• Dependency?
Test Driven Development AKA TDD
– Executable Document Spec
– Executable functional checking
– Executable dependency checking
– Executable integration test
Normal Cycle
• Read function spec
• Start coding
• Monkey see and monkey do
• It might not effect to other functions
• Waiting for defect ticket
TDD cycle
• Read function spec
• (Re)Write Test
• Run Test fail
• Write Production Code
• Run all test
• Refactor
• Cool 
Demo
Code
Part II Tools
• Project Management
• Collaboration
• Development Environment
• Development Tools
• Testing
• Continuous Integration
• Deployment
• Monitoring
Project Management and
Collaboration
# Flexible issue tracking system
# Gantt chart and calendar
# News, documents & files management
# Feeds & e-mail notifications.
# Per project wiki
# Per project forums
Redmine Demo
Version Control
• You are not alone
• Code is your asset
• Choose one:
• GIT, SVN, CVS
Development Tools
• Build Tool
• Library dependency checking
• Single Repository
• Check Style
• IDE
Testing
• Junit
• DB Unit
• Mockito
• Selenium
JUnit
• JUnit is a unit testing framework
• Unit test itself is not enough we need
company
DBUnit
• Why do we need to test our database?
• You need [multiple] databases
Mock Object
• Mock objects are simulated objects that mimic
the behavior of real objects in controlled ways.
• supplies non-deterministic results
• has states that are difficult to create or reproduce
• is slow
• does not yet exist or may change behavior;
• would have to include information and methods
exclusively for testing purposes
Web App Test
• Selenium is a suite of tools to automate web
app testing across many platforms.
Continuous Integration
• Execute all unit test in integration
environment
• Code coverage checking
• Automatic Branch/Tag
Deployment
Monitoring

Kku2011

Editor's Notes

  • #2 ทักทายเล็กน้อย
  • #3 เนื่องจากเป็นการบรรยายในสถาบันการศึกษาครั้งแรกใน ชีวิต ก่อนหน้านี้จะเน้นไปทางงานไม่เป็นทางการเช่น BarCamp, OSSFest, …
  • #4 เนื่องจากเป็นการบรรยายในสถาบันการศึกษาครั้งแรกใน ชีวิต ก่อนหน้านี้จะเน้นไปทางงานไม่เป็นทางการเช่น BarCamp, OSSFest, …
  • #10 การทำงานในโลกแห่งความเป็นจริงนั้นใช้กฏ 80:20 ได้เสมอแต่ขึ้นอยู่กับตำแหน่งหน้าที่ที่เราทำ เด็กๆ บริษัทเล็กๆ 80:20 งานเทคนิคอลต่อการสื่อสารผู้ใหญ่ บริษัทใหญ่มาก 80:20 สือสาร:ต่องานเทคนิคอล เรามักจะพบอยู่เสมอว่าเราใช้เวลาไปสามสี่ชั่วโมงเพื่อ กำหนดคำว่า customer ให้ตรงกันหลีกเลี่ยงไม่ได้ว่า โลกเรา Globalize มากๆเราไม่ได้อยู่คนเดียว เราไม่สามารถทำงานคนเดียว เราไม่สามารถทำงานประเทศเดียวได้ เราต้องเกรียนอินเตอร์ เราต้องสื่อสารกับชาวโลกได้
  • #11 ทุกคนคิดว่าเหมือนอะไร ผมว่าเหมือนร้านขายของชำ หลายท่านคงคิดว่าเหมือนสร้างตึกแต่การสร้างตึกมันดู rigid ไปนิดมัน build to last มากไปนิดถ้าเทียบกับการสร้างซอฟท์แวร์
  • #12 เริ่มจากเล็กๆ ไม่มีแผนอะไรเลย อยากได้อะไรก็สุมๆๆๆๆๆๆ เข้าไป ผิดไหม? ขายของได้เหมือนกัน แต่ถ้าเจ๊ป่วย? แต่ถ้าเจ๊อยากยกร้านให้ลูก? มีตัวอย่างของ code ที่เกิดจากการคิดแบบนี้ให้ดู ว่าเมพส์ขนาดไหน หลายท่านอาจจบไปทำงานแล้วไปเจองานที่ต้อง maintain code ที่เป็นนี้ ต้องทำใจ มันมีที่มาแบบที่สอง รู้ว่าจะขายอะไร รู้แน่ๆ แต่ขายอะไรสุ่มสี่สุ่มห้าไม่ได้ ดีไหม? ถ้าเจ๊ป่วย? ถ้าเจ๊อยากยกร้านให้ลูก?สุดแต่ลูกค้าจะเลือกว่าจะเอาแบบไหน ลูกค้าให้ความสำคัฐกับการจัดการแค่ไหนการจัดการและ operate มีผลต่อธุรกิจแค่ไหน การทำ Software ไม่ใช่แค่ทำให้เสร็จตาม feature แล้วจบ มันต้องคิดต่อไปให้ครบจนถึงการ operate ด้วยดังนั้นถ้าเราต้องการสร้างซอฟท์แวร์ให้เมือน 7-11 หรือคล้ายๆ ที่ transition และ operate ได้ง่ายหน่อย
  • #13 เพื่อให้งานที่เราสร้างออกมาดี เราน่าจะมีวิธีคิดที่ดีเพื่อที่จะได้สร้างของที่ดี ดูแลง่ายออกไปให้ใช้งาน
  • #14 กระบวนการ ทีมงาน เครื่องมือที่ดีและเหมาะสมอยู่ดีๆจะออกไปเขียนโค้ด ดุ่มๆก็คงจะออกเกรียนกันไปนิด ต้องมีกรอบกันบ้าง ดังนั้นกรอบต้องมีตั้งแต่กรอบของทีม และกรอบของตัวนักพัฒนาเอง ไม่มีใครทำอะไรตามใจตัวเองได้มากนักหรอกครับในโลกแห่งความเป็นจริง ถ้าอยากทำอะไรตามใจตัวเองมากต้องเป็น สุดเขต เสลดเป็ด ผมอินดี้ ไม่เน้นขาย
  • #15 การสร้างงานแบบนี้เราไม่ต้องสอนกัน มันเป็นเรื่องของธรรมชาติ ถ้าเราทำอะไรไปเรื่อยๆดุ่ยๆไม่ค่อยมีแผน ผลมักจะออกมาเป็นแบบนี้เสมอ ที่ผ่านมาเมื่อต้นปีผมเพิ่งได้รับการชักชวนให้ไปร่วมแก้ปัยหาระบบที่เป็นเหมือนร้านขายของชำแบบนี้ โดยมีข้อแม้คือระบบห้ามหยุดเพราะการซื้อขายเกิดขึนตลอดเวลา 24*7 ตัวอย่างcode ของ Taradและตัวอย่าง Database Schema ของ สพฐ ถ้าได้เข้าไปทำงานที่ที่ไม่มี methodology สิ่งเดียวที่เราทำได้คือ สวดมนต์
  • #16 Methodology สำคัญมากๆ เนื่องจากมันเป็นจุดเริ่มต้อนของทุกอย่าง ในกระบวนพัฒนาซอฟท์แวร์ methodologyถ้าเราเลือกขึ้นมาหนึ่งตัวเราจะพบว่า methodology จะ reflect to 3 things: team, individual discipline and tools (ไม่ทั้งหมดแต่เกือบทั้งหมด) ดังนั้นวันที่เราจบออกไปทำงานเป็น รุ่นน้องที่สุดในทีมเราจะรู้ว่าเราต้องเจออะไรบ้างจาก methodology ที่บริษัทนั้นใช้ หรือ ถ้าโชคดีมากๆอาจไปเจอบริษัทที่ไม่มี methodology อะไรเลยเป็นแบบ อินดี้ ก็ขอให้โชคดีครับ ทุกอย่างมีที่มาที่ไปบางคนจบออกไปอาจจะอึดอัดกับการทำงานแบบนี้แบบนั้นแต่อยากให้เข้าใจว่าทุกอย่างมีเหตุผลของมัน ถ้าเราเข้าใจมันเราจะมีความสุข
  • #18 ปัจจุบันถ้าเราไปgoogleดูว่ามี Software Development Methodology กี่แบบเยอะมากๆ Prototyping, Spiral abcแต่ที่โด่งดังมหัศจรรย์ขั้นเทพที่สุดคือ Waterfall เรามาดูกันหน่อยว่าถ้าเราเลือก waterfall มันจะ reflect อะไรบ้าง ยังไง
  • #19 แต่บางครั้งเราไม่ได้เลือกเอง มันถูกเลือกมาแล้ว สิ่งที่เราทำได้คือเข้าใจมัน เพื่อให้เราทำงานอย่างมีความสุข หาวิธีปรับเอาเองโดยที่ไม่ violate disciplineคำถามคือ methodology ไหนได้รับความนิยมสูงสุด ตลอดกาล คลาสสิก เจอแน่ๆ
  • #20 Develop RFPกระบวนการรวบรวมสิ่งที่อยากได้ทั้งหมดเขียนเป็น Request For Proposal, Present Proposal โชว์ว่าทำได้ทุกอย่าง compile หมดทุกข้อเข้ากระบวนการจัดซื้อ ต่อรองราคา(เพิ่งโม้ไปเยอะว่าทำได้), Analysis ลงไปรับ requirement จากลูกค้า พบว่าโอวจอร์จ เก็บ Gap จะถอนใจได้เอกสารมาอีกกองDesign ได้เอกสารมาอีกกอง Implement เริ่มเครียด เวลาเหลือน้อยเมื่อเทียบกันสิ่งที่ต้องทำIntegration Testing โอวบั๊กเยอะมาก
  • #21 Develop RFPกระบวนการรวบรวมสิ่งที่อยากได้ทั้งหมดเขียนเป็น Request For Proposal, Present Proposal โชว์ว่าทำได้ทุกอย่าง compile หมดทุกข้อเข้ากระบวนการจัดซื้อ ต่อรองราคา(เพิ่งโม้ไปเยอะว่าทำได้), Analysis ลงไปรับ requirement จากลูกค้า พบว่าโอวจอร์จ เก็บ Gap จะถอนใจได้เอกสารมาอีกกองDesign ได้เอกสารมาอีกกอง Implement เริ่มเครียด เวลาเหลือน้อยเมื่อเทียบกันสิ่งที่ต้องทำIntegration Testing โอวบั๊กเยอะมาก
  • #22 มีหน้าที่ที่ชัดเจน เชี่ยวชาญงานที่ทำมากๆ มีการกำหนด KPI และตัววัดที่ชัดเจนได้ง่าย แต่ Hop มันจะเยอะหน่อย
  • #31 เอา Waterfall มากลับด้านใหม่เราจะไม่แยกทุกอย่างออกจากกันเป็นphase ของการทำงานแต่จะเป็น phase ของ features แทน ? แล้วเราเอากระบวนที่เราทำใน waterfall มา repeat ทุกๆ phase ดังนั้นเราจะเห็นว่า team ของ Agile จะไม่สามารถแบ่งเป็น role ได้ เพราะทุกๆ phase หรือ iteration นั้นจะต้องทำทุกอย่างใหม่เกือบหมดลูกค้าเลือก feature ที่ต้องการเห็นก่อน(ไม่ใช่ แผนงามๆ) Analyst-&gt;Design-&gt;Code(Test TestTest)-&gt;Test-&gt;Integration-&gt;Deployดังนั้น Software ที่ถุกสร้างภายให้ Agile Methodology จะต้องมีความยืดหยุ่นสูงมาก ทนต่อการเปลี่ยนแปลง
  • #32 Three simple truths ที่เราต้องทำใจยอมรับก่อนเข้าลัทธิ Agile คือ
  • #37 ได้ผลออกมาทั้งคู่ แต่ Waterfall จะเหนื่อยกว่านิดนึงตรงที่กระบวนการทำงานไม่เปิดโอกาสให้ user ได้เข้ามาเห็นผลงานจนกว่าจะเสร็จแล้วซึ่งบางทีเพี้ยนไปมาก แต่ agile เองก็ยังไม่เป็นที่ยอมรับขององค์กร ดังนั้น อย่ารอ เราจึงเอาส่วนที่ทำได้มาทำก่อนแต่การจะได้มาซึ่งสิ่งนั้น Programmer ต้องมีวินัยสูงมากๆ สูงยังไงมาดูหรือถ้าทำ
  • #38 บางคนถอดใจไม่เข้าใจ ไม่ทำงาน เซ็ง ติสต์แตก
  • #39 แทนที่เราจะนั่งเสียหัวกับเรื่องเอกสารเรื่อง requirementไม่นิ่ง ยิ่งเราพยายามทำให้มันนิ่งมันยิ่งดิ้น ดังนั้นเราหันกลับด้านมาทำซอฟท์แวร์ให้ maintain ได้ง่านเพื่อให้มันดิ้นได้ทัน requirement จะดีกว่าไหม7-11 จะออกมาดี ช่างต้องมี skill ที่ดีด้วย
  • #41 Codingสมัยใหม่อาจไม่ใช่สมการทางคณิตศาสตร์แล้ว ก่อนหน้านี้เราอาจมีข้อจำกัดเรื่อง Hardware: Memory, CPU หรือ Storage แต่ปัจจุบันเราผ่านพ้นเรื่องเหล่านั้นมาไกลแล้ว Hardware ราคาไม่แพงแล้วแต่ที่แพงกว่าคือค่าดูแลรักษา Software ดังนั้นเราควรจะเปลี่ยนมุมมองการเขียน Code เสียใหม่ให้เป็นเหมือนกับการเขียน “นิยาย”
  • #43 แบบนี้อ่านง่ายและเข้าใจมากกว่าไหม ครับดังนั้นการเขียน Software มันคือการเรียบเรียงความคิดและเขียน นิยาย ยาวๆออกมาหนึ่งเรื่อง ดังนั้นในโลกแห่งความเป็นจริงการสร้างSoftware คือการจำลอง Business Process ของลูกค้าลงมาให้เป็นภาษา programming มันคือการเขียนเอกสารเป็นการ represent ออกมาด้วยภาษาอื่นๆนั่นเอง ดังนั้นเป็นโปรแกรมเมอร์เองก็ต้องเล่าเรื่องให้เป็น ให้คนเข้าใจ ไปหัดเขียนจดหมายรักจีบสาวก็จะดี
  • #45 Comment เป็นเรื่องที่ดี แต่ comment ไม่ได้ตามตัวแปรไปทุกที่นะครับ
  • #46 มันทำอะไร?
  • #47 Meaningful Name, Pronounceable Name
  • #54 ประมาณ15-20 นาที
  • #62 พฤติกรรมของ Developer หน้าใหม่ไร้สิวคือ เขียนไปเรื่อยๆ ทับไปเรื่อยๆ แล้วก็หาที่กลับไม่เจอCode อยู่ไหน ของใครถูกใครเขียนทับผมไม่ได้ทำเมื่อวานwork นี่ไม่ใช่ code ผมทำไม copy มาไม่ครบไอ้ที่ copy มานี่ถูกแล้วหรอ
  • #64 ของใช้ส่วนตัวของโปรแกรมเมอร์ที่เราต้องมีไว้ใช้งานเสมอ
  • #67 For example, an alarm clock program which causes a bell to ring at a certain time might get the current time from the outside world. To test this, the test must wait until the alarm time to know whether it has rung the bell correctly. If a mock object is used in place of the real object, it can be programmed to provide the bell-ringing time (whether it is actually that time or not) so that the alarm clock program can be tested in isolation.
  • #69 เอา code ของทุกคนมาแล้ว execute รวมหมด