SlideShare une entreprise Scribd logo
1  sur  151
Télécharger pour lire hors ligne
Effective Code Review
Dave Liddament
@daveliddament
WHY THIS TALK?
EFFECTIVE CODE REVIEW
REDUCES OVERALL COST OF
SOFTWARE DEVELOPMENT
@daveliddament
COST OF A BUG
Cost
DESIGN WRITING

CODE
TEST RELEASE MAINTENANCE
FIND BUGS SOONER
@daveliddament
COST OF A BUG
Cost
DESIGN WRITING

CODE
TEST RELEASE MAINTENANCE
FIND BUGS SOONER
@daveliddament
Dave Liddament
Lamp Bristol
Organize:
- PHP-SW user group
- Bristol PHP Training
@daveliddament
@daveliddament
EFFECTIVE CODE REVIEW
AGENDA
▸ Why
▸ Code quality
▸ What is code review
▸ Benefits
▸ Implementation
▸ Tips
▸ Integrating code review into project workflow
@daveliddament
CODE QUALITY
EFFECTIVE CODE REVIEW REQUIRES…
@daveliddament
CODE QUALITY
EFFECTIVE CODE REVIEW REQUIRES…
@daveliddament
CODE QUALITY
EFFECTIVE CODE REVIEW REQUIRES…
@daveliddament
CODE QUALITY
EFFECTIVE CODE REVIEW REQUIRES…
@daveliddament
CODE REVIEW IS THE
SYSTEMATIC EXAMINATION OF
SOURCE CODE…
Wikipedia
WHAT IS CODE REVIEW
@daveliddament
IT IS INTENDED TO FIND MISTAKES
OVERLOOKED IN SOFTWARE
DEVELOPMENT, IMPROVING THE
OVERALL QUALITY OF SOFTWARE.
Wikipedia
WHAT IS CODE REVIEW
@daveliddament
WHAT IS CODE REVIEW
HOW IS IT DONE
@daveliddament
WHAT IS CODE REVIEW
HOW IS IT DONE
@daveliddament
WHAT IS CODE REVIEW
HOW IS IT DONE
@daveliddament
CODE REVIEW BENEFITS
@daveliddament
CODE REVIEW BENEFITS
WHAT ARE DEFECTS?
@daveliddament
CODE REVIEW BENEFITS
WHAT ARE DEFECTS?
Bugs
@daveliddament
CODE REVIEW BENEFITS
WHAT ARE DEFECTS?
Bugs
Evolvability
@daveliddament
CODE REVIEW BENEFITS
AN EVOLVABILITY DEFECT IS…
Code that makes code base less
compliant with standards, more error
prone, or more difficult to modify,
extend or understand.
@daveliddament
CODE REVIEW BENEFITS
WHAT ARE DEFECTS?
Bugs
Evolvability [1, 2]
@daveliddament
CODE REVIEW BENEFITS
EVOLVABILITY IS IMPORTANT
▸ Low evolvability costs money:
▸ New features took 28% longer to implement [3]
▸ Fixing bugs took 36% longer [3]
▸ Software structure may account for 25% of total maintenance
costs [4]
@daveliddament
CODE REVIEW BENEFITS
COST TO DEVELOP SIMILAR SIZED FEATURE OVER TIME
@daveliddament
CODE REVIEW BENEFITS
Cost
Time into project
COST TO DEVELOP SIMILAR SIZED FEATURE OVER TIME
@daveliddament
CODE REVIEW BENEFITS
Cost
Time into project
COST TO DEVELOP SIMILAR SIZED FEATURE OVER TIME
@daveliddament
CODE REVIEW BENEFITS
Cost
Time into project
COST TO DEVELOP SIMILAR SIZED FEATURE OVER TIME
@daveliddament
CODE REVIEW BENEFITS
TAKE AWAY
▸ The majority of code review comments will not be “bugs”.
▸ Most comments will be code improvements.
▸ Lower technical debt. Lower overall cost.
▸ Studies back this up.
▸ Remember to sell the right metric to management.
@daveliddament
CODE REVIEW BENEFITS
SECURITY REVIEW
@daveliddament
CODE REVIEW BENEFITS
SECURITY REVIEW
▸ Writing sensitive data to logs (e.g. password)
@daveliddament
CODE REVIEW BENEFITS
SECURITY REVIEW
▸ Writing sensitive data to logs (e.g. password)
▸ Bugsnag / error log reporting
@daveliddament
CODE REVIEW BENEFITS
SECURITY REVIEW
▸ Writing sensitive data to logs (e.g. password)
▸ Bugsnag / error log reporting
▸ Files that shouldn’t be there? (e.g. malware)
@daveliddament
CODE REVIEW BENEFITS
SECURITY REVIEW
▸ Writing sensitive data to logs (e.g. password)
▸ Bugsnag / error log reporting
▸ Files that shouldn’t be there? (e.g. malware)
▸ OWASP top 10
@daveliddament
CODE REVIEW BENEFITS
SECURITY REVIEW
▸ Writing sensitive data to logs (e.g. password)
▸ Bugsnag / error log reporting
▸ Files that shouldn’t be there? (e.g. malware)
▸ OWASP top 10
▸ OWASP top 10 cheat sheet
@daveliddament
CODE REVIEW BENEFITS
SECURITY REVIEW
▸ Writing sensitive data to logs (e.g. password)
▸ Bugsnag / error log reporting
▸ Files that shouldn’t be there? (e.g. malware)
▸ OWASP top 10
▸ OWASP top 10 cheat sheet
▸ Not / weakly hashing passwords
@daveliddament
CODE REVIEW BENEFITS
SECURITY REVIEW
▸ Writing sensitive data to logs (e.g. password)
▸ Bugsnag / error log reporting
▸ Files that shouldn’t be there? (e.g. malware)
▸ OWASP top 10
▸ OWASP top 10 cheat sheet
▸ Not / weakly hashing passwords
▸ Rolled your own authentication / hashing / encryption algorithms
@daveliddament
CODE REVIEW BENEFITS
SPREAD THE KNOWLEDGE
@daveliddament
CODE REVIEW BENEFITS
NO MORE SILOS
@daveliddament
CODE REVIEW BENEFITS
NO MORE SILOS
XXX
@daveliddament
CODE REVIEW BENEFITS
NO MORE SILOS
XXX
@daveliddament
CODE REVIEW BENEFITS
NO MORE SILOS
XXX
@daveliddament
CODE REVIEW BENEFITS
NO MORE SILOS
XXX
@daveliddament
CODE REVIEW BENEFITS
MENTORING
@daveliddament
CODE REVIEW BENEFITS
Rateofintroducingbugs
Experience / Skill
SKILL AND EXPERIENCE VS BUGS
@daveliddament
CODE REVIEW BENEFITS
YOU’RE BEING WATCHED!
@daveliddament
CODE REVIEW BENEFITS
YOU’RE BEING WATCHED!
[5]
@daveliddament
CODE REVIEW BENEFITS
BENEFITS
▸ Reduce defects
▸ Studies that back this up
▸ Find security vulnerabilities
▸ Spread knowledge
▸ Mentoring
▸ Peer pressure improves code quality
@daveliddament
EFFECTIVE CODE REVIEW
REDUCES OVERALL COST OF
SOFTWARE DEVELOPMENT
@daveliddament
IMPLEMENTATION
@daveliddament
IMPLEMENTATION
@daveliddament
IMPLEMENTATION
WE CAN AUTOMATE
@daveliddament
IMPLEMENTATION
WE CAN AUTOMATE
▸ Tests
@daveliddament
IMPLEMENTATION
WE CAN AUTOMATE
▸ Tests
▸ Code style (php-cs-fixer)
@daveliddament
IMPLEMENTATION
WE CAN AUTOMATE
▸ Tests
▸ Code style (php-cs-fixer)
▸ Lint (php, yaml, twig, doctrine, composer)
@daveliddament
IMPLEMENTATION
WE CAN AUTOMATE
▸ Tests
▸ Code style (php-cs-fixer)
▸ Lint (php, yaml, twig, doctrine, composer)
▸ Static analysis (Psalm, PHPStan, Phan)
@daveliddament
IMPLEMENTATION
WE CAN AUTOMATE
▸ Tests
▸ Code style (php-cs-fixer)
▸ Lint (php, yaml, twig, doctrine, composer)
▸ Static analysis (Psalm, PHPStan, Phan)
▸ 3rd party security checks (sensiolabs/security-checker)
@daveliddament
IMPLEMENTATION
DO THE TESTS TEST THE REQUIRED FUNCTIONALITY
@daveliddament
IMPLEMENTATION
DO THE TESTS TEST THE REQUIRED FUNCTIONALITY
Input Expected Output
my blog my-blog
hello Dave hello-Dave
@daveliddament
IMPLEMENTATION
DO THE TESTS TEST THE REQUIRED FUNCTIONALITY
Input Expected Output
my blog my-blog
hello Dave hello-Dave
@daveliddament
IMPLEMENTATION
ARE THE TESTS ADEQUATE
@daveliddament
IMPLEMENTATION
ARE THE TESTS ADEQUATE
Input Expected Output
my blog my-blog
it’s Saturday its-saturday
@daveliddament
IMPLEMENTATION
HOW MANY TESTS DO WE NEED?
/**
* @param int $id
* @return bool
* @throws NotFoundException
*/
public function isAllowed(int $id): bool
{
.. some implementation ..
}
/**
* @param int $id
* @return bool
* @throws NotFoundException
*/
public function isAllowed(int $id): bool
{
.. some implementation ..
}
@daveliddament
IMPLEMENTATION
WILL I UNDERSTAND THIS
CODE IN 6 MONTHS TIME?
@daveliddament
“THE RATIO OF TIME SPENT READING VERSUS WRITING
IS WELL OVER 10 TO 1. WE ARE CONSTANTLY READING
OLD CODE AS PART OF THE EFFORT TO WRITE NEW
CODE. …
[THEREFORE,] MAKING IT EASY TO READ MAKES IT
EASIER TO WRITE.”
Robert C. Martin (Clean Code)
COST OF WRITING CODE CODE
@daveliddament
WILL I UNDERSTAND THE CODE IN 6 MONTHS TIME?
WHAT DOES THIS CODE DO?
$userFields = [
'Username',
'Email',
'FirstName',
'LastName',
'Phone',
];
foreach ($userFields as $key) {
if ($userDetails->{'get'.$key}()) {
$user->{'set'.$key}($userDetails->{'get'.$key}());
}
}
@daveliddament
WILL I UNDERSTAND THE CODE IN 6 MONTHS TIME?
WHAT DOES THIS CODE DO? (2)
if ($userDetails->getUsername()) {
$user->setUsername($userDetails->getUsername());
}
if ($userDetails->getEmail()) {
$user->setEmail($userDetails->getEmail());
}
if ($userDetails->getFirstName()) {
$user->setFirstName($userDetails->getFirstName());
}
if ($userDetails->getLastName()) {
$user->setLastName($userDetails->getLastName());
}
if ($userDetails->getPhone()) {
$user->setPhone($userDetails->getPhone());
}
@daveliddament
WILL I UNDERSTAND THE CODE IN 6 MONTHS TIME?
/**
* Represents a location in the UK.
*(eg city, town, village)
*/
class Location
{
/**
* @return string URL
*/
public function getUrl(): string
{
return $this->url;
}
@daveliddament
WILL I UNDERSTAND THE CODE IN 6 MONTHS TIME?
WHAT IS URL?
/**
* Represents a location in the UK.
*(eg city, town, village)
*/
class Location
{
/**
* @return string URL
*/
public function getUrl(): string
{
return $this->url;
}
@daveliddament
WILL I UNDERSTAND THE CODE IN 6 MONTHS TIME?
WHAT IS URL?
/**
* Represents a location in the UK.
*(eg city, town, village)
*/
class Location
{
/**
* @return string URL
*/
public function getUrl(): string
{
return $this->url;
}
@daveliddament
WILL I UNDERSTAND THE CODE IN 6 MONTHS TIME?
if ($agent->getType() === 1) {
… do something …
}
@daveliddament
WILL I UNDERSTAND THE CODE IN 6 MONTHS TIME?
WHAT DOES 1 MEAN?
if ($agent->getType() === 1) {
… do something …
}
@daveliddament
IS THE CODE AS OBVIOUS AND EXPLICIT AS IT POSSIBLY CAN BE
HOW DO WE MAKE THIS MORE OBVIOUS
class MarketingCampaign
{
public function addAddress($address)
{
.. some implementation ..
}
}
@daveliddament
IS THE CODE AS OBVIOUS AND EXPLICIT AS IT POSSIBLY CAN BE
HOW DO WE MAKE THIS MORE OBVIOUS (2)
class MarketingCampaign
{
public function addEmailAddress($emailAddress)
{
.. some implementation ..
}
}
@daveliddament
IS THE CODE AS OBVIOUS AND EXPLICIT AS IT POSSIBLY CAN BE
HOW DO WE MAKE THIS MORE OBVIOUS (3)
class MarketingCampaign
{
/**
* Adds email address, person will then be
* messaged as part of the campaign.
*/
public function addEmailAddress($emailAddress)
{
.. some implementation ..
}
}
@daveliddament
IS THE CODE AS OBVIOUS AND EXPLICIT AS IT POSSIBLY CAN BE
HOW DO WE MAKE THIS MORE OBVIOUS (4)
class MarketingCampaign
{
/**
* Adds email address, person will then be
* messaged as part of the campaign.
*/
public function addEmailAddress(
string $emailAddress): void
{
.. some implementation ..
}
}
@daveliddament
IS THE CODE AS OBVIOUS AND EXPLICIT AS IT POSSIBLY CAN BE
HOW DO WE MAKE THIS MORE OBVIOUS (4)
class MarketingCampaign
{
/**
* Adds email address, person will then be
* messaged as part of the campaign.
*/
public function addEmailAddress(
EmailAddress $emailAddress): void
{
.. some implementation ..
}
}
@daveliddament
QUESTIONS TO ASK IN CODE REVIEW
ARE WE FOLLOWING
PROJECT CONVENTIONS?
@daveliddament
ARE WE FOLLOWING PROJECT CONVENTIONS
interface LocationRepository
{
public function findClosestTo($point);
public function findByName($name);
public function findBySlug($slug);
public function searchForLocation($name, $type);
public function findAllByType($type);
}
@daveliddament
ARE WE FOLLOWING PROJECT CONVENTIONS
INCONSISTENT METHOD NAME
interface LocationRepository
{
public function findClosestTo($point);
public function findByName($name);
public function findBySlug($slug);
public function searchForLocation($name, $type);
public function findAllByType($type);
}
@daveliddament
@daveliddament
QUESTIONS TO ASK IN CODE REVIEW
DO THE COMMENTS MATCH
THE CODE?
@daveliddament
QUESTIONS TO ASK IN CODE REVIEW
HAS DEFENSIVE CODING
BEEN USED?
@daveliddament
HAS DEFENSIVE CODING BEEN USED
/**
* Set status (one of started|finished|quit)
*
* @param string $status
*/
public function setStatus(string $status): void
{
$this->status = $status;
}
/**
* Set status (one of started|finished|quit)
*
* @param string $status
*/
public function setStatus(string $status): void
{
$this->status = $status;
}
@daveliddament
HAS DEFENSIVE CODING BEEN USED
MISSING CHECK THAT STATUS IS A VALID VALUE
/**
* Set status (one of started|finished|quit)
*
* @param string $status
*/
public function setStatus(string $status): void
{
$this->status = $status;
}
/**
* Set status (one of started|finished|quit)
*
* @param string $status
*/
public function setStatus(string $status): void
{
$this->status = $status;
}
@daveliddament
QUESTIONS TO ASK IN CODE REVIEW
CORRECT NAMING
@daveliddament
QUESTIONS TO ASK IN CODE REVIEW
CORRECT NAMING
▸ Language for domain or project you’re working on
@daveliddament
QUESTIONS TO ASK IN CODE REVIEW
CORRECT NAMING
▸ Language for domain or project you’re working on
▸ Design patterns
@daveliddament
QUESTIONS TO ASK IN CODE REVIEW
HAS TECHNICAL DEBT BEEN
DOCUMENTED?
@daveliddament
HAS TECHNICAL DEBT BEEN DOCUMENTED
ALL TODO COMMENTS MUST REFERENCE A TICKET
// TODO: Refactor to method https://trello.com/c/Aaa123
… some hacky code …
@daveliddament
QUESTIONS TO ASK IN CODE REVIEW
CAN ARCHITECTURE BE
IMPROVED?
@daveliddament
QUESTIONS TO ASK IN CODE REVIEW
ARE THERE ANY BUGS?!
@daveliddament
QUESTIONS TO ASK IN CODE REVIEW
CHECK LIST
▸ Do the tests fully test the required functionality
▸ Will I understand this code in 6 months
▸ Does the code follow project conventions
▸ Is the code obvious and explicit
▸ Do comments match the code
▸ Has defensive coding been used
▸ Has technical debt been documented
▸ Can architecture be improved
▸ Are there any bugs
@daveliddament
QUESTIONS TO ASK IN CODE REVIEW
CHECK LIST: TLDR
▸ Correct tests
▸ Clean code
▸ No bugs
@daveliddament
CODE REVIEW TIPS
@daveliddament
CODE REVIEW TIPS
EVERYONE SHOULD CODE REVIEW
@daveliddament
ASK PROGRAMMERS TO
REVIEW 10 LINES OF CODE
THEY’LL FIND 10 ISSUES…
Anyone who’s done code review
CODE REVIEW TIPS
@daveliddament
ASK THEM TO DO 500 LINES
THEY’LL SAY IT’S GOOD TO GO
Anyone who’s done code review
CODE REVIEW TIPS
@daveliddament
CODE REVIEW TIPS
SMALL COMMITS
@daveliddament
CODE REVIEW TIPS
SMALL COMMITS
@daveliddament
CODE REVIEW TIPS
SMALL COMMITS
DEPRECATE: The price calculation service
@daveliddament
CODE REVIEW TIPS
SMALL COMMITS
DEPRECATE: The price calculation service
ADD: Facade to 3rd party price calculation service
@daveliddament
CODE REVIEW TIPS
SMALL COMMITS
DEPRECATE: The price calculation service
ADD: Facade to 3rd party price calculation service
UPDATE: Use new price calculator code
@daveliddament
CODE REVIEW TIPS
SMALL COMMITS
DEPRECATE: The price calculation service
ADD: Facade to 3rd party price calculation service
UPDATE: Use new price calculator code
REMOVE: Deprecated price calculation service
@daveliddament
CODE REVIEW TIPS
HOW MUCH SHOULD YOU REVIEW IN ONE GO?
▸ Fewer than 400 lines of code at a time [6]
▸ Under 500 line of code reviewed per hour [6]
▸ Max 1 hour review at a time [6]
@daveliddament
CODE REVIEW TIPS
GOOD COMMITS
@daveliddament
CODE REVIEW TIPS
GOOD COMMITS
▸ Small
@daveliddament
CODE REVIEW TIPS
GOOD COMMITS
▸ Small
▸ Focus on one thing
@daveliddament
CODE REVIEW TIPS
GOOD COMMITS
▸ Small
▸ Focus on one thing
▸ Whitespace changes into their own commits
@daveliddament
CODE REVIEW TIPS
GOOD COMMITS
▸ Small
▸ Focus on one thing
▸ Whitespace changes into their own commits
▸ Reference to story, bug report, Trello/Jira card
@daveliddament
CODE REVIEW TIPS
GOOD REVIEW COMMENTS
@daveliddament
CODE REVIEW TIPS
GOOD REVIEW COMMENTS
▸ Don’t be an idiot. Don’t be rude
@daveliddament
CODE REVIEW TIPS
GOOD REVIEW COMMENTS
▸ Don’t be an idiot. Don’t be rude
▸ Not critical of the author
@daveliddament
CODE REVIEW TIPS
GOOD REVIEW COMMENTS
▸ Don’t be an idiot. Don’t be rude
▸ Not critical of the author
▸ State problem and solution
@daveliddament
CODE REVIEW TIPS
GOOD REVIEW COMMENTS
▸ Don’t be an idiot. Don’t be rude
▸ Not critical of the author
▸ State problem and solution
▸ Link to Stack Overflow, blog, etc
@daveliddament
CODE REVIEW TIPS
GOOD REVIEW COMMENTS
▸ Don’t be an idiot. Don’t be rude
▸ Not critical of the author
▸ State problem and solution
▸ Link to Stack Overflow, blog, etc
▸ Use: “Let’s chat”
@daveliddament
CODE REVIEW TIPS
GOOD REVIEW COMMENTS
▸ Don’t be an idiot. Don’t be rude
▸ Not critical of the author
▸ State problem and solution
▸ Link to Stack Overflow, blog, etc
▸ Use: “Let’s chat”
▸ Use: “Question”
@daveliddament
CODE REVIEW TIPS
GOOD REVIEW COMMENTS
▸ Don’t be an idiot. Don’t be rude
▸ Not critical of the author
▸ State problem and solution
▸ Link to Stack Overflow, blog, etc
▸ Use: “Let’s chat”
▸ Use: “Question”
▸ Compliment
@daveliddament
CODE REVIEW TIPS
RECEIVING REVIEW COMMENTS
@daveliddament
CODE REVIEW TIPS
RECEIVING REVIEW COMMENTS
▸ Don’t be an idiot. Don’t be rude
@daveliddament
CODE REVIEW TIPS
RECEIVING REVIEW COMMENTS
▸ Don’t be an idiot. Don’t be rude
▸ Don’t take offence
@daveliddament
CODE REVIEW TIPS
RECEIVING REVIEW COMMENTS
▸ Don’t be an idiot. Don’t be rude
▸ Don’t take offence
▸ Do say if you disagree
@daveliddament
CODE REVIEW TIPS
RECEIVING REVIEW COMMENTS
▸ Don’t be an idiot. Don’t be rude
▸ Don’t take offence
▸ Do say if you disagree
▸ Compliment
@daveliddament
CODE REVIEW TIPS
CODE REVIEW TIPS
▸ Get everyone involved
▸ Keep commits small
▸ Be constructive in code review comments
▸ Link to relevant bugs / stories / Trello cards
@daveliddament
SETUP GITHUB
CODE CAN ONLY BE DEPLOYED IF:
▸ CI passes
▸ Code review passes
@daveliddament
SETUP GITHUB
@daveliddament
SETUP GITHUB
@daveliddament
SETUP GITHUB
@daveliddament
SETUP GITHUB
@daveliddament
SETUP GITHUB
@daveliddament
SETUP GITHUB
@daveliddament
SETUP GITHUB
@daveliddament
SETUP GITHUB
@daveliddament
SETUP GITHUB
@daveliddament
SETUP GITHUB
@daveliddament
SETUP GITHUB
@daveliddament
SETUP GITHUB
@daveliddament
EFFECTIVE CODE REVIEW
INTEGRATING CODE REVIEW INTO PROJECT WORKFLOW
▸ Easy with tools like Github
▸ No excuse not to start using today
@daveliddament
EFFECTIVE CODE REVIEW
WHAT WE’VE COVERED
▸ Why
▸ Code quality
▸ What is code review
▸ Benefits
▸ Implementation
▸ Tips
▸ Integrating code review into project workflow
@daveliddament
WRAP UP
Cost
DESIGN WRITING

CODE
TEST RELEASE MAINTENANCE
FIND BUGS SOONER
@daveliddament
WRAP UP
WHAT ARE DEFECTS?
Bugs
Evolvability [1, 2]
@daveliddament
WRAP UP
SPREAD THE KNOWLEDGE
@daveliddament
WRAP UP
MENTORING
@daveliddament
WRAP UP
YOU’RE BEING WATCHED!
@daveliddament
WRAP UP
YOU’RE BEING WATCHED!
[5]
@daveliddament
WRAP UP
@daveliddament
WRAP UP
SUMMARY: REVIEW CHECKLIST
▸ Security problems
▸ Correct tests
▸ Clean code
▸ Bugs
@daveliddament
@daveliddament
WRAP UP
EVERYONE SHOULD CODE REVIEW
@daveliddament
EFFECTIVE CODE REVIEW
REDUCES OVERALL COST OF
SOFTWARE DEVELOPMENT
@daveliddament
REFERENCES
REFERENCES
▸ [1] Mika V. Mantyla and Casper Lassenius “What Types of Defects Are Really
Discovered in Code Reviews?” IEEE Transactions on Software Engineering
▸ [2] Harvey Siy, Lawrence Votta “Does The Modern Code Inspection Have Value?”
▸ [3] R.K. Bandi, V.K. Vaishnavi, and D.E. Turk, “Predicting Maintenance
Performance Using Object-Orientated Design Complexity Metrics”
▸ [4] R.D. Banker, S.M. Datar, C.F. Kemerer, and D. Zweig, “Software Complexity
and Maintenance Costs,”
▸ [5] https://www.bbc.co.uk/news/uk-37502136
▸ [6] https://smartbear.com/learn/code-review/best-practices-for-peer-code-
review/
@daveliddament
CREDITS
IMAGE CREDITS
‣ © Can Stock Photo / kmitu
‣ © Kirsty Andrews
‣ © Jez Kent
‣ © Can Stock Photo / focalpoint
‣ © Can Stock Photo / sellingpix
‣ © Can Stock Photo / robwilson39
‣ © Can Stock Photo / lindwa
‣ © Can Stock Photo / piedmont_photo
‣ © Can Stock Photo / pressmaster
‣ © Can Stock Photo / marish

Contenu connexe

Similaire à Effective codereview | Dave Liddament | CODEiD

Save time by applying clean code principles
Save time by applying clean code principlesSave time by applying clean code principles
Save time by applying clean code principles
Edorian
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012
Michelangelo van Dam
 

Similaire à Effective codereview | Dave Liddament | CODEiD (20)

Becoming a Git Master - Nicola Paolucci
Becoming a Git Master - Nicola PaolucciBecoming a Git Master - Nicola Paolucci
Becoming a Git Master - Nicola Paolucci
 
Dealing with Legacy Perl Code - Peter Scott
Dealing with Legacy Perl Code - Peter ScottDealing with Legacy Perl Code - Peter Scott
Dealing with Legacy Perl Code - Peter Scott
 
New Ideas for Old Code - Greach
New Ideas for Old Code - GreachNew Ideas for Old Code - Greach
New Ideas for Old Code - Greach
 
Developer Best Practices - The secret sauce for coding modern software
Developer Best Practices - The secret sauce for coding modern softwareDeveloper Best Practices - The secret sauce for coding modern software
Developer Best Practices - The secret sauce for coding modern software
 
resolvendo problemas de comunicação em equipes distribuídas com bdd
resolvendo problemas de comunicação em equipes distribuídas com bddresolvendo problemas de comunicação em equipes distribuídas com bdd
resolvendo problemas de comunicação em equipes distribuídas com bdd
 
Postman On Steroids
Postman On SteroidsPostman On Steroids
Postman On Steroids
 
Save time by applying clean code principles
Save time by applying clean code principlesSave time by applying clean code principles
Save time by applying clean code principles
 
Observability driven development
Observability driven developmentObservability driven development
Observability driven development
 
Developer Tests - Things to Know
Developer Tests - Things to KnowDeveloper Tests - Things to Know
Developer Tests - Things to Know
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12
 
Measuring Your Code
Measuring Your CodeMeasuring Your Code
Measuring Your Code
 
Measuring Your Code 2.0
Measuring Your Code 2.0Measuring Your Code 2.0
Measuring Your Code 2.0
 
Becoming a Git Master
Becoming a Git MasterBecoming a Git Master
Becoming a Git Master
 
Cloudbrew 2019 observability driven development
Cloudbrew 2019   observability driven developmentCloudbrew 2019   observability driven development
Cloudbrew 2019 observability driven development
 
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and GulpOptimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
 
Developing a Culture of Quality Code (Midwest PHP 2020)
Developing a Culture of Quality Code (Midwest PHP 2020)Developing a Culture of Quality Code (Midwest PHP 2020)
Developing a Culture of Quality Code (Midwest PHP 2020)
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012
 
The road to continuous deployment (DomCode September 2016)
The road to continuous deployment (DomCode September 2016)The road to continuous deployment (DomCode September 2016)
The road to continuous deployment (DomCode September 2016)
 
Influx/Days 2017 San Francisco | Christine Yen
Influx/Days 2017 San Francisco | Christine YenInflux/Days 2017 San Francisco | Christine Yen
Influx/Days 2017 San Francisco | Christine Yen
 
From grep to BERT
From grep to BERTFrom grep to BERT
From grep to BERT
 

Plus de CODEiD PHP Community

Domain Driven Design | Артём Антоненко | CODEID |
Domain Driven Design | Артём Антоненко | CODEID |Domain Driven Design | Артём Антоненко | CODEID |
Domain Driven Design | Артём Антоненко | CODEID |
CODEiD PHP Community
 

Plus de CODEiD PHP Community (11)

GRASP - General Responsibility Assignment Software Principles
GRASP -  General Responsibility Assignment Software PrinciplesGRASP -  General Responsibility Assignment Software Principles
GRASP - General Responsibility Assignment Software Principles
 
The PHP developer stack for building chatbots | Christoph Rumpel | CODEiD
The PHP developer stack for building chatbots | Christoph Rumpel | CODEiDThe PHP developer stack for building chatbots | Christoph Rumpel | CODEiD
The PHP developer stack for building chatbots | Christoph Rumpel | CODEiD
 
Ioc container | Hannes Van De Vreken | CODEiD
Ioc container | Hannes Van De Vreken | CODEiDIoc container | Hannes Van De Vreken | CODEiD
Ioc container | Hannes Van De Vreken | CODEiD
 
Contract testing | Евгений Кузьмин | CODEiD
Contract testing | Евгений Кузьмин | CODEiDContract testing | Евгений Кузьмин | CODEiD
Contract testing | Евгений Кузьмин | CODEiD
 
Running microservices successfully | Bastian Hofmann | CODEiD
Running microservices successfully | Bastian Hofmann | CODEiDRunning microservices successfully | Bastian Hofmann | CODEiD
Running microservices successfully | Bastian Hofmann | CODEiD
 
Graphql + Symfony | Александр Демченко | CODEiD
Graphql + Symfony | Александр Демченко | CODEiDGraphql + Symfony | Александр Демченко | CODEiD
Graphql + Symfony | Александр Демченко | CODEiD
 
Mastering message queues | Tobias Nyholm | CODEiD
Mastering message queues | Tobias Nyholm | CODEiDMastering message queues | Tobias Nyholm | CODEiD
Mastering message queues | Tobias Nyholm | CODEiD
 
Symfony4: A new way to develop applications | Antonio Peric | CODEiD
Symfony4: A new way to develop applications | Antonio Peric | CODEiDSymfony4: A new way to develop applications | Antonio Peric | CODEiD
Symfony4: A new way to develop applications | Antonio Peric | CODEiD
 
Domain Driven Design | Артём Антоненко | CODEID |
Domain Driven Design | Артём Антоненко | CODEID |Domain Driven Design | Артём Антоненко | CODEID |
Domain Driven Design | Артём Антоненко | CODEID |
 
CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"
CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"
CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"
 
CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...
CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...
CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...
 

Dernier

+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 

Dernier (20)

Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 

Effective codereview | Dave Liddament | CODEiD