SlideShare une entreprise Scribd logo
1  sur  28
Change begins with awareness
Appetite comes with testing
“It's a dangerous business, Frodo, going out
your door. You step onto the road, and if you
don't keep your feet, there's no knowing
where you might be swept off to.”
J.R.R. Tolkien, The Lord of the Rings
Change begins with awareness
Defect Cost Increase
Change begins with awareness
Defect Cost Increase
Change begins with awareness
Stress cycle
Change begins with awareness
Testing as...
documentation
Change begins with awareness
Testing as...
instrument for
cooperation
Change begins with awareness
Testing as...
instrument for
open source
cooperation
Change begins with awareness
Pair programming
Change begins with awareness
All begins with...
...a need
Change begins with awareness
And...
“Supporting multiple user classes is not easy at all. It would
make the bundle code far more complex as we would
basically need to change all places interacting with the user
to be able to handle all user classes. I don't really want to
go this way (it will also make it more likely to introduce
bugs).”
...a delusion
Change begins with awareness
But...
In Symfony2, all core classes use the service container,
so it is easy to extend, configure and use any object
...a hope
Change begins with awareness
Service Container
Dependency Injection Container
use AcmeHelloBundleMailer;
$mailer = new Mailer('sendmail');
$mailer->send('info@netmeans.net', ... );
Change begins with awareness
Service Container
Dependency Injection Container
class Mailer
{
private $mailerType;
public function __construct($mailerType)
{
$this->mailerType = $mailerType
}
public function send($to, ...)
{
...
}
}
services:
my_mailer:
class: AcmeHelloBundleMailer
arguments: [sendmail]
Change begins with awareness
Service Container
Dependency Injection Container
class HelloController extends Controller
{
public function sendEmailAction()
{
$mailer = $this->get('my_mailer');
$mailer->send('info@netmeans.net', ... );
}
}
Change begins with awareness
FOSUserBundle
fos_user:
db_driver: orm
firewall_name: main
user_class: AcmeUserBundleEntityUser
Change begins with awareness
FOSUserBundle
fos_user:
db_driver: orm
firewall_name: main
user_class: AcmeUserBundleEntityUser
service:
user_manager: custom_user_manager
Change begins with awareness
So ...
...a solution
We have to create our custom
UserManager that accepts in the
constructor an object that have the
responsibility to discriminate user
types
Change begins with awareness
First of all: test
We start writing some functional
tests to check correct integration
of FOSUserBundle
Change begins with awareness
Custom UserManager
Class UserManager extends FOSUserBundleEntityUserManager
{
protected $userDiscriminator;
public function __construct(..., UserDiscriminator $userDiscriminator)
public function getClass()
{
return $this->userDiscriminator->getClass();
}
}
Change begins with awareness
UserDiscriminator
public function getClass()
{
return 'Acme/UserBundle/Entity/UserOne';
}
Change begins with awareness
From here it's all smooth
With little iterations, we improve
UserManager and UserDiscriminator
with unit and functional tests,
passing from a dirty code to a more
elegant one
Change begins with awareness
NmnMultiUserBundle
fos_user:
db_driver: orm
firewall_name: main
user_class: AcmeUserBundleEntityUser
service:
user_manager: nmn_user_manager
registration:
form:
handler: nmn_user_registration_form_handler
profile:
form:
handler: nmn_user_profile_form_handler
Change begins with awareness
NmnMultiUserBundle
parameters:
nmn_user_discriminator_parameters:
classes:
user_one:
entity: AcmeUserBundleEntityUserOne
registration: AcmeUserBundleFormTypeRegistrationUserOneFormType
profile: AcmeUserBundleFormTypeProfileUserOneFormType
factory:
user_two:
entity: AcmeUserBundleEntityUserTwo
registration: AcmeUserBundleFormTypeRegistrationUserTwoFormType
profile: AcmeUserBundleFormTypeProfileUserTwoFormType
factory:
Change begins with awareness
NmnMultiUserBundle
Ok, it is an hack :)
A lazy way to use for free most of the
functionality of FOSUserBundle ...
... but it is ready to be improved by
anyone.
Change begins with awareness
NmnMultiUserBundle
github.com/netmeansnet/NmnMultiUserBundle
github.com/netmeansnet/NmnMultiUserBundleSandbox
travis-ci.org/#!/netmeansnet/NmnMultiUserBundle
@leonardo_nmn
@euxpom
Change begins with awareness
Some Books
I know this sounds strident and unilateral, but given the record I don't
think the surgeons should have to defend hand-washing, and I don't
think programmers should have to defend TDD
The Clean Coder
A code of Conduct for Professional Programmers
Martin, Robert C.
Some Books
In software development, “perfect” is a verb, not an adjective
Extreme Programming Explained
Embrace Change
Beck, Kent
Change begins with awareness
In XP, testing is as important as programming
Change begins with awareness
Some Books
Building testable applications is Hard
The Grumpy Programmer's Guide To Building
Testable Applications in PHP
Hartjes, Chris
The reason for investing in automated testing is obvious: any bugs you
catch before your application makes it into production cost less in terms
of resources (money, developer time) to fix than fixing it into production

Contenu connexe

Similaire à Appetite comes with testing

Environment Variables in Angular
Environment Variables in AngularEnvironment Variables in Angular
Environment Variables in AngularKnoldus Inc.
 
Feedback loops between tooling and culture
Feedback loops between tooling and cultureFeedback loops between tooling and culture
Feedback loops between tooling and cultureChris Winters
 
Idempotency of commands in distributed systems
Idempotency of commands in distributed systemsIdempotency of commands in distributed systems
Idempotency of commands in distributed systemsMax Małecki
 
Selenium web driver | java
Selenium web driver | javaSelenium web driver | java
Selenium web driver | javaRajesh Kumar
 
The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)Matthias Noback
 
Slide 1 - Oklahoma State University - Welcome
Slide 1 - Oklahoma State University - WelcomeSlide 1 - Oklahoma State University - Welcome
Slide 1 - Oklahoma State University - Welcomebutest
 
My programming final proj. (1)
My programming final proj. (1)My programming final proj. (1)
My programming final proj. (1)aeden_brines
 
Lesson10 behavioral patterns
Lesson10 behavioral patternsLesson10 behavioral patterns
Lesson10 behavioral patternsOktJona
 
The quest for global design principles - PHP Benelux 2016
The quest for global design principles - PHP Benelux 2016The quest for global design principles - PHP Benelux 2016
The quest for global design principles - PHP Benelux 2016Matthias Noback
 
Building Large Scale Javascript Application
Building Large Scale Javascript ApplicationBuilding Large Scale Javascript Application
Building Large Scale Javascript ApplicationAnis Ahmad
 
Vendredi Tech_ la programmation fonctionnelle.pptx
Vendredi Tech_ la programmation fonctionnelle.pptxVendredi Tech_ la programmation fonctionnelle.pptx
Vendredi Tech_ la programmation fonctionnelle.pptxGuillaume Saint Etienne
 
Appendices
AppendicesAppendices
Appendicesloisy28
 
How Does A Persuasive Essay Look Like. Kolobbo
How Does A Persuasive Essay Look Like. KolobboHow Does A Persuasive Essay Look Like. Kolobbo
How Does A Persuasive Essay Look Like. KolobboSamantha Jones
 
Transforming Novices into Skilled Accessibility Testers - CSUN 2016
Transforming Novices into Skilled Accessibility Testers - CSUN 2016Transforming Novices into Skilled Accessibility Testers - CSUN 2016
Transforming Novices into Skilled Accessibility Testers - CSUN 2016Mark Stimson
 
Cucumber presentation
Cucumber presentationCucumber presentation
Cucumber presentationAkhila B
 
Evolve Your Code
Evolve Your CodeEvolve Your Code
Evolve Your CodeRookieOne
 
Android Activities.pdf
Android Activities.pdfAndroid Activities.pdf
Android Activities.pdfssusere71a07
 

Similaire à Appetite comes with testing (20)

Environment Variables in Angular
Environment Variables in AngularEnvironment Variables in Angular
Environment Variables in Angular
 
JUNit Presentation
JUNit PresentationJUNit Presentation
JUNit Presentation
 
Feedback loops between tooling and culture
Feedback loops between tooling and cultureFeedback loops between tooling and culture
Feedback loops between tooling and culture
 
Legacy is Good
Legacy is GoodLegacy is Good
Legacy is Good
 
Idempotency of commands in distributed systems
Idempotency of commands in distributed systemsIdempotency of commands in distributed systems
Idempotency of commands in distributed systems
 
Selenium web driver | java
Selenium web driver | javaSelenium web driver | java
Selenium web driver | java
 
The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)
 
Slide 1 - Oklahoma State University - Welcome
Slide 1 - Oklahoma State University - WelcomeSlide 1 - Oklahoma State University - Welcome
Slide 1 - Oklahoma State University - Welcome
 
My programming final proj. (1)
My programming final proj. (1)My programming final proj. (1)
My programming final proj. (1)
 
Lesson10 behavioral patterns
Lesson10 behavioral patternsLesson10 behavioral patterns
Lesson10 behavioral patterns
 
The quest for global design principles - PHP Benelux 2016
The quest for global design principles - PHP Benelux 2016The quest for global design principles - PHP Benelux 2016
The quest for global design principles - PHP Benelux 2016
 
Building Large Scale Javascript Application
Building Large Scale Javascript ApplicationBuilding Large Scale Javascript Application
Building Large Scale Javascript Application
 
Vendredi Tech_ la programmation fonctionnelle.pptx
Vendredi Tech_ la programmation fonctionnelle.pptxVendredi Tech_ la programmation fonctionnelle.pptx
Vendredi Tech_ la programmation fonctionnelle.pptx
 
ANDROID FDP PPT
ANDROID FDP PPTANDROID FDP PPT
ANDROID FDP PPT
 
Appendices
AppendicesAppendices
Appendices
 
How Does A Persuasive Essay Look Like. Kolobbo
How Does A Persuasive Essay Look Like. KolobboHow Does A Persuasive Essay Look Like. Kolobbo
How Does A Persuasive Essay Look Like. Kolobbo
 
Transforming Novices into Skilled Accessibility Testers - CSUN 2016
Transforming Novices into Skilled Accessibility Testers - CSUN 2016Transforming Novices into Skilled Accessibility Testers - CSUN 2016
Transforming Novices into Skilled Accessibility Testers - CSUN 2016
 
Cucumber presentation
Cucumber presentationCucumber presentation
Cucumber presentation
 
Evolve Your Code
Evolve Your CodeEvolve Your Code
Evolve Your Code
 
Android Activities.pdf
Android Activities.pdfAndroid Activities.pdf
Android Activities.pdf
 

Dernier

THE COUNTRY WHO SOLVED THE WORLD_HOW CHINA LAUNCHED THE CIVILIZATION REVOLUTI...
THE COUNTRY WHO SOLVED THE WORLD_HOW CHINA LAUNCHED THE CIVILIZATION REVOLUTI...THE COUNTRY WHO SOLVED THE WORLD_HOW CHINA LAUNCHED THE CIVILIZATION REVOLUTI...
THE COUNTRY WHO SOLVED THE WORLD_HOW CHINA LAUNCHED THE CIVILIZATION REVOLUTI...漢銘 謝
 
RACHEL-ANN M. TENIBRO PRODUCT RESEARCH PRESENTATION
RACHEL-ANN M. TENIBRO PRODUCT RESEARCH PRESENTATIONRACHEL-ANN M. TENIBRO PRODUCT RESEARCH PRESENTATION
RACHEL-ANN M. TENIBRO PRODUCT RESEARCH PRESENTATIONRachelAnnTenibroAmaz
 
Application of GIS in Landslide Disaster Response.pptx
Application of GIS in Landslide Disaster Response.pptxApplication of GIS in Landslide Disaster Response.pptx
Application of GIS in Landslide Disaster Response.pptxRoquia Salam
 
Internship Presentation | PPT | CSE | SE
Internship Presentation | PPT | CSE | SEInternship Presentation | PPT | CSE | SE
Internship Presentation | PPT | CSE | SESaleh Ibne Omar
 
Engaging Eid Ul Fitr Presentation for Kindergartners.pptx
Engaging Eid Ul Fitr Presentation for Kindergartners.pptxEngaging Eid Ul Fitr Presentation for Kindergartners.pptx
Engaging Eid Ul Fitr Presentation for Kindergartners.pptxAsifArshad8
 
proposal kumeneger edited.docx A kumeeger
proposal kumeneger edited.docx A kumeegerproposal kumeneger edited.docx A kumeeger
proposal kumeneger edited.docx A kumeegerkumenegertelayegrama
 
GESCO SE Press and Analyst Conference on Financial Results 2024
GESCO SE Press and Analyst Conference on Financial Results 2024GESCO SE Press and Analyst Conference on Financial Results 2024
GESCO SE Press and Analyst Conference on Financial Results 2024GESCO SE
 
INDIAN GCP GUIDELINE. for Regulatory affair 1st sem CRR
INDIAN GCP GUIDELINE. for Regulatory  affair 1st sem CRRINDIAN GCP GUIDELINE. for Regulatory  affair 1st sem CRR
INDIAN GCP GUIDELINE. for Regulatory affair 1st sem CRRsarwankumar4524
 
cse-csp batch4 review-1.1.pptx cyber security
cse-csp batch4 review-1.1.pptx cyber securitycse-csp batch4 review-1.1.pptx cyber security
cse-csp batch4 review-1.1.pptx cyber securitysandeepnani2260
 
Quality by design.. ppt for RA (1ST SEM
Quality by design.. ppt for  RA (1ST SEMQuality by design.. ppt for  RA (1ST SEM
Quality by design.. ppt for RA (1ST SEMCharmi13
 
Testing and Development Challenges for Complex Cyber-Physical Systems: Insigh...
Testing and Development Challenges for Complex Cyber-Physical Systems: Insigh...Testing and Development Challenges for Complex Cyber-Physical Systems: Insigh...
Testing and Development Challenges for Complex Cyber-Physical Systems: Insigh...Sebastiano Panichella
 
Chizaram's Women Tech Makers Deck. .pptx
Chizaram's Women Tech Makers Deck.  .pptxChizaram's Women Tech Makers Deck.  .pptx
Chizaram's Women Tech Makers Deck. .pptxogubuikealex
 
A Guide to Choosing the Ideal Air Cooler
A Guide to Choosing the Ideal Air CoolerA Guide to Choosing the Ideal Air Cooler
A Guide to Choosing the Ideal Air Coolerenquirieskenstar
 
Don't Miss Out: Strategies for Making the Most of the Ethena DigitalOpportunity
Don't Miss Out: Strategies for Making the Most of the Ethena DigitalOpportunityDon't Miss Out: Strategies for Making the Most of the Ethena DigitalOpportunity
Don't Miss Out: Strategies for Making the Most of the Ethena DigitalOpportunityApp Ethena
 
Testing with Fewer Resources: Toward Adaptive Approaches for Cost-effective ...
Testing with Fewer Resources:  Toward Adaptive Approaches for Cost-effective ...Testing with Fewer Resources:  Toward Adaptive Approaches for Cost-effective ...
Testing with Fewer Resources: Toward Adaptive Approaches for Cost-effective ...Sebastiano Panichella
 
General Elections Final Press Noteas per M
General Elections Final Press Noteas per MGeneral Elections Final Press Noteas per M
General Elections Final Press Noteas per MVidyaAdsule1
 
05.02 MMC - Assignment 4 - Image Attribution Lovepreet.pptx
05.02 MMC - Assignment 4 - Image Attribution Lovepreet.pptx05.02 MMC - Assignment 4 - Image Attribution Lovepreet.pptx
05.02 MMC - Assignment 4 - Image Attribution Lovepreet.pptxerickamwana1
 

Dernier (17)

THE COUNTRY WHO SOLVED THE WORLD_HOW CHINA LAUNCHED THE CIVILIZATION REVOLUTI...
THE COUNTRY WHO SOLVED THE WORLD_HOW CHINA LAUNCHED THE CIVILIZATION REVOLUTI...THE COUNTRY WHO SOLVED THE WORLD_HOW CHINA LAUNCHED THE CIVILIZATION REVOLUTI...
THE COUNTRY WHO SOLVED THE WORLD_HOW CHINA LAUNCHED THE CIVILIZATION REVOLUTI...
 
RACHEL-ANN M. TENIBRO PRODUCT RESEARCH PRESENTATION
RACHEL-ANN M. TENIBRO PRODUCT RESEARCH PRESENTATIONRACHEL-ANN M. TENIBRO PRODUCT RESEARCH PRESENTATION
RACHEL-ANN M. TENIBRO PRODUCT RESEARCH PRESENTATION
 
Application of GIS in Landslide Disaster Response.pptx
Application of GIS in Landslide Disaster Response.pptxApplication of GIS in Landslide Disaster Response.pptx
Application of GIS in Landslide Disaster Response.pptx
 
Internship Presentation | PPT | CSE | SE
Internship Presentation | PPT | CSE | SEInternship Presentation | PPT | CSE | SE
Internship Presentation | PPT | CSE | SE
 
Engaging Eid Ul Fitr Presentation for Kindergartners.pptx
Engaging Eid Ul Fitr Presentation for Kindergartners.pptxEngaging Eid Ul Fitr Presentation for Kindergartners.pptx
Engaging Eid Ul Fitr Presentation for Kindergartners.pptx
 
proposal kumeneger edited.docx A kumeeger
proposal kumeneger edited.docx A kumeegerproposal kumeneger edited.docx A kumeeger
proposal kumeneger edited.docx A kumeeger
 
GESCO SE Press and Analyst Conference on Financial Results 2024
GESCO SE Press and Analyst Conference on Financial Results 2024GESCO SE Press and Analyst Conference on Financial Results 2024
GESCO SE Press and Analyst Conference on Financial Results 2024
 
INDIAN GCP GUIDELINE. for Regulatory affair 1st sem CRR
INDIAN GCP GUIDELINE. for Regulatory  affair 1st sem CRRINDIAN GCP GUIDELINE. for Regulatory  affair 1st sem CRR
INDIAN GCP GUIDELINE. for Regulatory affair 1st sem CRR
 
cse-csp batch4 review-1.1.pptx cyber security
cse-csp batch4 review-1.1.pptx cyber securitycse-csp batch4 review-1.1.pptx cyber security
cse-csp batch4 review-1.1.pptx cyber security
 
Quality by design.. ppt for RA (1ST SEM
Quality by design.. ppt for  RA (1ST SEMQuality by design.. ppt for  RA (1ST SEM
Quality by design.. ppt for RA (1ST SEM
 
Testing and Development Challenges for Complex Cyber-Physical Systems: Insigh...
Testing and Development Challenges for Complex Cyber-Physical Systems: Insigh...Testing and Development Challenges for Complex Cyber-Physical Systems: Insigh...
Testing and Development Challenges for Complex Cyber-Physical Systems: Insigh...
 
Chizaram's Women Tech Makers Deck. .pptx
Chizaram's Women Tech Makers Deck.  .pptxChizaram's Women Tech Makers Deck.  .pptx
Chizaram's Women Tech Makers Deck. .pptx
 
A Guide to Choosing the Ideal Air Cooler
A Guide to Choosing the Ideal Air CoolerA Guide to Choosing the Ideal Air Cooler
A Guide to Choosing the Ideal Air Cooler
 
Don't Miss Out: Strategies for Making the Most of the Ethena DigitalOpportunity
Don't Miss Out: Strategies for Making the Most of the Ethena DigitalOpportunityDon't Miss Out: Strategies for Making the Most of the Ethena DigitalOpportunity
Don't Miss Out: Strategies for Making the Most of the Ethena DigitalOpportunity
 
Testing with Fewer Resources: Toward Adaptive Approaches for Cost-effective ...
Testing with Fewer Resources:  Toward Adaptive Approaches for Cost-effective ...Testing with Fewer Resources:  Toward Adaptive Approaches for Cost-effective ...
Testing with Fewer Resources: Toward Adaptive Approaches for Cost-effective ...
 
General Elections Final Press Noteas per M
General Elections Final Press Noteas per MGeneral Elections Final Press Noteas per M
General Elections Final Press Noteas per M
 
05.02 MMC - Assignment 4 - Image Attribution Lovepreet.pptx
05.02 MMC - Assignment 4 - Image Attribution Lovepreet.pptx05.02 MMC - Assignment 4 - Image Attribution Lovepreet.pptx
05.02 MMC - Assignment 4 - Image Attribution Lovepreet.pptx
 

Appetite comes with testing

  • 1. Change begins with awareness Appetite comes with testing “It's a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there's no knowing where you might be swept off to.” J.R.R. Tolkien, The Lord of the Rings
  • 2. Change begins with awareness Defect Cost Increase
  • 3. Change begins with awareness Defect Cost Increase
  • 4. Change begins with awareness Stress cycle
  • 5. Change begins with awareness Testing as... documentation
  • 6. Change begins with awareness Testing as... instrument for cooperation
  • 7. Change begins with awareness Testing as... instrument for open source cooperation
  • 8. Change begins with awareness Pair programming
  • 9. Change begins with awareness All begins with... ...a need
  • 10. Change begins with awareness And... “Supporting multiple user classes is not easy at all. It would make the bundle code far more complex as we would basically need to change all places interacting with the user to be able to handle all user classes. I don't really want to go this way (it will also make it more likely to introduce bugs).” ...a delusion
  • 11. Change begins with awareness But... In Symfony2, all core classes use the service container, so it is easy to extend, configure and use any object ...a hope
  • 12. Change begins with awareness Service Container Dependency Injection Container use AcmeHelloBundleMailer; $mailer = new Mailer('sendmail'); $mailer->send('info@netmeans.net', ... );
  • 13. Change begins with awareness Service Container Dependency Injection Container class Mailer { private $mailerType; public function __construct($mailerType) { $this->mailerType = $mailerType } public function send($to, ...) { ... } } services: my_mailer: class: AcmeHelloBundleMailer arguments: [sendmail]
  • 14. Change begins with awareness Service Container Dependency Injection Container class HelloController extends Controller { public function sendEmailAction() { $mailer = $this->get('my_mailer'); $mailer->send('info@netmeans.net', ... ); } }
  • 15. Change begins with awareness FOSUserBundle fos_user: db_driver: orm firewall_name: main user_class: AcmeUserBundleEntityUser
  • 16. Change begins with awareness FOSUserBundle fos_user: db_driver: orm firewall_name: main user_class: AcmeUserBundleEntityUser service: user_manager: custom_user_manager
  • 17. Change begins with awareness So ... ...a solution We have to create our custom UserManager that accepts in the constructor an object that have the responsibility to discriminate user types
  • 18. Change begins with awareness First of all: test We start writing some functional tests to check correct integration of FOSUserBundle
  • 19. Change begins with awareness Custom UserManager Class UserManager extends FOSUserBundleEntityUserManager { protected $userDiscriminator; public function __construct(..., UserDiscriminator $userDiscriminator) public function getClass() { return $this->userDiscriminator->getClass(); } }
  • 20. Change begins with awareness UserDiscriminator public function getClass() { return 'Acme/UserBundle/Entity/UserOne'; }
  • 21. Change begins with awareness From here it's all smooth With little iterations, we improve UserManager and UserDiscriminator with unit and functional tests, passing from a dirty code to a more elegant one
  • 22. Change begins with awareness NmnMultiUserBundle fos_user: db_driver: orm firewall_name: main user_class: AcmeUserBundleEntityUser service: user_manager: nmn_user_manager registration: form: handler: nmn_user_registration_form_handler profile: form: handler: nmn_user_profile_form_handler
  • 23. Change begins with awareness NmnMultiUserBundle parameters: nmn_user_discriminator_parameters: classes: user_one: entity: AcmeUserBundleEntityUserOne registration: AcmeUserBundleFormTypeRegistrationUserOneFormType profile: AcmeUserBundleFormTypeProfileUserOneFormType factory: user_two: entity: AcmeUserBundleEntityUserTwo registration: AcmeUserBundleFormTypeRegistrationUserTwoFormType profile: AcmeUserBundleFormTypeProfileUserTwoFormType factory:
  • 24. Change begins with awareness NmnMultiUserBundle Ok, it is an hack :) A lazy way to use for free most of the functionality of FOSUserBundle ... ... but it is ready to be improved by anyone.
  • 25. Change begins with awareness NmnMultiUserBundle github.com/netmeansnet/NmnMultiUserBundle github.com/netmeansnet/NmnMultiUserBundleSandbox travis-ci.org/#!/netmeansnet/NmnMultiUserBundle @leonardo_nmn @euxpom
  • 26. Change begins with awareness Some Books I know this sounds strident and unilateral, but given the record I don't think the surgeons should have to defend hand-washing, and I don't think programmers should have to defend TDD The Clean Coder A code of Conduct for Professional Programmers Martin, Robert C.
  • 27. Some Books In software development, “perfect” is a verb, not an adjective Extreme Programming Explained Embrace Change Beck, Kent Change begins with awareness In XP, testing is as important as programming
  • 28. Change begins with awareness Some Books Building testable applications is Hard The Grumpy Programmer's Guide To Building Testable Applications in PHP Hartjes, Chris The reason for investing in automated testing is obvious: any bugs you catch before your application makes it into production cost less in terms of resources (money, developer time) to fix than fixing it into production