SlideShare a Scribd company logo
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
Effective codereview | Dave Liddament | CODEiD
@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

More Related Content

Similar to 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
Atlassian
 
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
O'Reilly Media
 
New Ideas for Old Code - Greach
New Ideas for Old Code - GreachNew Ideas for Old Code - Greach
New Ideas for Old Code - Greach
HamletDRC
 
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
Kosala Nuwan Perera
 
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
Rodrigo Urubatan
 
Postman On Steroids
Postman On SteroidsPostman On Steroids
Postman On Steroids
Sara Tornincasa
 
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
 
Observability driven development
Observability driven developmentObservability driven development
Observability driven development
Geert van der Cruijsen
 
Developer Tests - Things to Know
Developer Tests - Things to KnowDeveloper Tests - Things to Know
Developer Tests - Things to Know
Vaidas Pilkauskas
 
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
Michelangelo van Dam
 
Measuring Your Code
Measuring Your CodeMeasuring Your Code
Measuring Your Code
Nate Abele
 
Measuring Your Code 2.0
Measuring Your Code 2.0Measuring Your Code 2.0
Measuring Your Code 2.0
Nate Abele
 
Becoming a Git Master
Becoming a Git MasterBecoming a Git Master
Becoming a Git Master
Nicola Paolucci
 
Cloudbrew 2019 observability driven development
Cloudbrew 2019   observability driven developmentCloudbrew 2019   observability driven development
Cloudbrew 2019 observability driven development
Geert van der Cruijsen
 
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
Matthew Davis
 
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)
Scott Keck-Warren
 
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
 
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)
Michiel Rook
 
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
InfluxData
 
From grep to BERT
From grep to BERTFrom grep to BERT
From grep to BERT
QAware GmbH
 
Becoming a Git Master - Nicola Paolucci
Becoming a Git Master - Nicola PaolucciBecoming a Git Master - Nicola Paolucci
Becoming a Git Master - Nicola Paolucci
Atlassian
 
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
O'Reilly Media
 
New Ideas for Old Code - Greach
New Ideas for Old Code - GreachNew Ideas for Old Code - Greach
New Ideas for Old Code - Greach
HamletDRC
 
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
Kosala Nuwan Perera
 
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
Rodrigo Urubatan
 
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
 
Developer Tests - Things to Know
Developer Tests - Things to KnowDeveloper Tests - Things to Know
Developer Tests - Things to Know
Vaidas Pilkauskas
 
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
Michelangelo van Dam
 
Measuring Your Code
Measuring Your CodeMeasuring Your Code
Measuring Your Code
Nate Abele
 
Measuring Your Code 2.0
Measuring Your Code 2.0Measuring Your Code 2.0
Measuring Your Code 2.0
Nate Abele
 
Cloudbrew 2019 observability driven development
Cloudbrew 2019   observability driven developmentCloudbrew 2019   observability driven development
Cloudbrew 2019 observability driven development
Geert van der Cruijsen
 
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
Matthew Davis
 
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)
Scott Keck-Warren
 
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
 
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)
Michiel Rook
 
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
InfluxData
 
From grep to BERT
From grep to BERTFrom grep to BERT
From grep to BERT
QAware GmbH
 

More from 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
CODEiD PHP Community
 
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
CODEiD PHP Community
 
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
CODEiD PHP Community
 
Contract testing | Евгений Кузьмин | CODEiD
Contract testing | Евгений Кузьмин | CODEiDContract testing | Евгений Кузьмин | CODEiD
Contract testing | Евгений Кузьмин | CODEiD
CODEiD PHP Community
 
Running microservices successfully | Bastian Hofmann | CODEiD
Running microservices successfully | Bastian Hofmann | CODEiDRunning microservices successfully | Bastian Hofmann | CODEiD
Running microservices successfully | Bastian Hofmann | CODEiD
CODEiD PHP Community
 
Graphql + Symfony | Александр Демченко | CODEiD
Graphql + Symfony | Александр Демченко | CODEiDGraphql + Symfony | Александр Демченко | CODEiD
Graphql + Symfony | Александр Демченко | CODEiD
CODEiD PHP Community
 
Mastering message queues | Tobias Nyholm | CODEiD
Mastering message queues | Tobias Nyholm | CODEiDMastering message queues | Tobias Nyholm | CODEiD
Mastering message queues | Tobias Nyholm | CODEiD
CODEiD PHP Community
 
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
CODEiD PHP Community
 
Domain Driven Design | Артём Антоненко | CODEID |
Domain Driven Design | Артём Антоненко | CODEID |Domain Driven Design | Артём Антоненко | CODEID |
Domain Driven Design | Артём Антоненко | CODEID |
CODEiD PHP Community
 
CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"
CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"
CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"
CODEiD PHP Community
 
CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...
CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...
CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...
CODEiD PHP Community
 
GRASP - General Responsibility Assignment Software Principles
GRASP -  General Responsibility Assignment Software PrinciplesGRASP -  General Responsibility Assignment Software Principles
GRASP - General Responsibility Assignment Software Principles
CODEiD PHP Community
 
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
CODEiD PHP Community
 
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
CODEiD PHP Community
 
Contract testing | Евгений Кузьмин | CODEiD
Contract testing | Евгений Кузьмин | CODEiDContract testing | Евгений Кузьмин | CODEiD
Contract testing | Евгений Кузьмин | CODEiD
CODEiD PHP Community
 
Running microservices successfully | Bastian Hofmann | CODEiD
Running microservices successfully | Bastian Hofmann | CODEiDRunning microservices successfully | Bastian Hofmann | CODEiD
Running microservices successfully | Bastian Hofmann | CODEiD
CODEiD PHP Community
 
Graphql + Symfony | Александр Демченко | CODEiD
Graphql + Symfony | Александр Демченко | CODEiDGraphql + Symfony | Александр Демченко | CODEiD
Graphql + Symfony | Александр Демченко | CODEiD
CODEiD PHP Community
 
Mastering message queues | Tobias Nyholm | CODEiD
Mastering message queues | Tobias Nyholm | CODEiDMastering message queues | Tobias Nyholm | CODEiD
Mastering message queues | Tobias Nyholm | CODEiD
CODEiD PHP Community
 
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
CODEiD PHP Community
 
Domain Driven Design | Артём Антоненко | CODEID |
Domain Driven Design | Артём Антоненко | CODEID |Domain Driven Design | Артём Антоненко | CODEID |
Domain Driven Design | Артём Антоненко | CODEID |
CODEiD PHP Community
 
CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"
CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"
CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"
CODEiD PHP Community
 
CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...
CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...
CodeID - PHP Odessa Conf: Вячеслав Мозговой "Как сделать сайт быстрым и люб...
CODEiD PHP Community
 

Recently uploaded (20)

Foundation Models for Time Series : A Survey
Foundation Models for Time Series : A SurveyFoundation Models for Time Series : A Survey
Foundation Models for Time Series : A Survey
jayanthkalyanam1
 
PDF Reader Pro Crack Latest Version FREE Download 2025
PDF Reader Pro Crack Latest Version FREE Download 2025PDF Reader Pro Crack Latest Version FREE Download 2025
PDF Reader Pro Crack Latest Version FREE Download 2025
mu394968
 
Creating Automated Tests with AI - Cory House - Applitools.pdf
Creating Automated Tests with AI - Cory House - Applitools.pdfCreating Automated Tests with AI - Cory House - Applitools.pdf
Creating Automated Tests with AI - Cory House - Applitools.pdf
Applitools
 
DVDFab Crack FREE Download Latest Version 2025
DVDFab Crack FREE Download Latest Version 2025DVDFab Crack FREE Download Latest Version 2025
DVDFab Crack FREE Download Latest Version 2025
younisnoman75
 
Automation Techniques in RPA - UiPath Certificate
Automation Techniques in RPA - UiPath CertificateAutomation Techniques in RPA - UiPath Certificate
Automation Techniques in RPA - UiPath Certificate
VICTOR MAESTRE RAMIREZ
 
LEARN SEO AND INCREASE YOUR KNOWLDGE IN SOFTWARE INDUSTRY
LEARN SEO AND INCREASE YOUR KNOWLDGE IN SOFTWARE INDUSTRYLEARN SEO AND INCREASE YOUR KNOWLDGE IN SOFTWARE INDUSTRY
LEARN SEO AND INCREASE YOUR KNOWLDGE IN SOFTWARE INDUSTRY
NidaFarooq10
 
Kubernetes_101_Zero_to_Platform_Engineer.pptx
Kubernetes_101_Zero_to_Platform_Engineer.pptxKubernetes_101_Zero_to_Platform_Engineer.pptx
Kubernetes_101_Zero_to_Platform_Engineer.pptx
CloudScouts
 
Microsoft Excel Core Points Training.pptx
Microsoft Excel Core Points Training.pptxMicrosoft Excel Core Points Training.pptx
Microsoft Excel Core Points Training.pptx
Mekonnen
 
Societal challenges of AI: biases, multilinguism and sustainability
Societal challenges of AI: biases, multilinguism and sustainabilitySocietal challenges of AI: biases, multilinguism and sustainability
Societal challenges of AI: biases, multilinguism and sustainability
Jordi Cabot
 
Not So Common Memory Leaks in Java Webinar
Not So Common Memory Leaks in Java WebinarNot So Common Memory Leaks in Java Webinar
Not So Common Memory Leaks in Java Webinar
Tier1 app
 
Odoo ERP for Education Management to Streamline Your Education Process
Odoo ERP for Education Management to Streamline Your Education ProcessOdoo ERP for Education Management to Streamline Your Education Process
Odoo ERP for Education Management to Streamline Your Education Process
iVenture Team LLP
 
Expand your AI adoption with AgentExchange
Expand your AI adoption with AgentExchangeExpand your AI adoption with AgentExchange
Expand your AI adoption with AgentExchange
Fexle Services Pvt. Ltd.
 
Adobe Marketo Engage Champion Deep Dive - SFDC CRM Synch V2 & Usage Dashboards
Adobe Marketo Engage Champion Deep Dive - SFDC CRM Synch V2 & Usage DashboardsAdobe Marketo Engage Champion Deep Dive - SFDC CRM Synch V2 & Usage Dashboards
Adobe Marketo Engage Champion Deep Dive - SFDC CRM Synch V2 & Usage Dashboards
BradBedford3
 
Implementing promises with typescripts, step by step
Implementing promises with typescripts, step by stepImplementing promises with typescripts, step by step
Implementing promises with typescripts, step by step
Ran Wahle
 
Get & Download Wondershare Filmora Crack Latest [2025]
Get & Download Wondershare Filmora Crack Latest [2025]Get & Download Wondershare Filmora Crack Latest [2025]
Get & Download Wondershare Filmora Crack Latest [2025]
saniaaftab72555
 
Tools of the Trade: Linux and SQL - Google Certificate
Tools of the Trade: Linux and SQL - Google CertificateTools of the Trade: Linux and SQL - Google Certificate
Tools of the Trade: Linux and SQL - Google Certificate
VICTOR MAESTRE RAMIREZ
 
Microsoft AI Nonprofit Use Cases and Live Demo_2025.04.30.pdf
Microsoft AI Nonprofit Use Cases and Live Demo_2025.04.30.pdfMicrosoft AI Nonprofit Use Cases and Live Demo_2025.04.30.pdf
Microsoft AI Nonprofit Use Cases and Live Demo_2025.04.30.pdf
TechSoup
 
Exploring Wayland: A Modern Display Server for the Future
Exploring Wayland: A Modern Display Server for the FutureExploring Wayland: A Modern Display Server for the Future
Exploring Wayland: A Modern Display Server for the Future
ICS
 
🌱 Green Grafana 🌱 Essentials_ Data, Visualizations and Plugins.pdf
🌱 Green Grafana 🌱 Essentials_ Data, Visualizations and Plugins.pdf🌱 Green Grafana 🌱 Essentials_ Data, Visualizations and Plugins.pdf
🌱 Green Grafana 🌱 Essentials_ Data, Visualizations and Plugins.pdf
Imma Valls Bernaus
 
How to Optimize Your AWS Environment for Improved Cloud Performance
How to Optimize Your AWS Environment for Improved Cloud PerformanceHow to Optimize Your AWS Environment for Improved Cloud Performance
How to Optimize Your AWS Environment for Improved Cloud Performance
ThousandEyes
 
Foundation Models for Time Series : A Survey
Foundation Models for Time Series : A SurveyFoundation Models for Time Series : A Survey
Foundation Models for Time Series : A Survey
jayanthkalyanam1
 
PDF Reader Pro Crack Latest Version FREE Download 2025
PDF Reader Pro Crack Latest Version FREE Download 2025PDF Reader Pro Crack Latest Version FREE Download 2025
PDF Reader Pro Crack Latest Version FREE Download 2025
mu394968
 
Creating Automated Tests with AI - Cory House - Applitools.pdf
Creating Automated Tests with AI - Cory House - Applitools.pdfCreating Automated Tests with AI - Cory House - Applitools.pdf
Creating Automated Tests with AI - Cory House - Applitools.pdf
Applitools
 
DVDFab Crack FREE Download Latest Version 2025
DVDFab Crack FREE Download Latest Version 2025DVDFab Crack FREE Download Latest Version 2025
DVDFab Crack FREE Download Latest Version 2025
younisnoman75
 
Automation Techniques in RPA - UiPath Certificate
Automation Techniques in RPA - UiPath CertificateAutomation Techniques in RPA - UiPath Certificate
Automation Techniques in RPA - UiPath Certificate
VICTOR MAESTRE RAMIREZ
 
LEARN SEO AND INCREASE YOUR KNOWLDGE IN SOFTWARE INDUSTRY
LEARN SEO AND INCREASE YOUR KNOWLDGE IN SOFTWARE INDUSTRYLEARN SEO AND INCREASE YOUR KNOWLDGE IN SOFTWARE INDUSTRY
LEARN SEO AND INCREASE YOUR KNOWLDGE IN SOFTWARE INDUSTRY
NidaFarooq10
 
Kubernetes_101_Zero_to_Platform_Engineer.pptx
Kubernetes_101_Zero_to_Platform_Engineer.pptxKubernetes_101_Zero_to_Platform_Engineer.pptx
Kubernetes_101_Zero_to_Platform_Engineer.pptx
CloudScouts
 
Microsoft Excel Core Points Training.pptx
Microsoft Excel Core Points Training.pptxMicrosoft Excel Core Points Training.pptx
Microsoft Excel Core Points Training.pptx
Mekonnen
 
Societal challenges of AI: biases, multilinguism and sustainability
Societal challenges of AI: biases, multilinguism and sustainabilitySocietal challenges of AI: biases, multilinguism and sustainability
Societal challenges of AI: biases, multilinguism and sustainability
Jordi Cabot
 
Not So Common Memory Leaks in Java Webinar
Not So Common Memory Leaks in Java WebinarNot So Common Memory Leaks in Java Webinar
Not So Common Memory Leaks in Java Webinar
Tier1 app
 
Odoo ERP for Education Management to Streamline Your Education Process
Odoo ERP for Education Management to Streamline Your Education ProcessOdoo ERP for Education Management to Streamline Your Education Process
Odoo ERP for Education Management to Streamline Your Education Process
iVenture Team LLP
 
Expand your AI adoption with AgentExchange
Expand your AI adoption with AgentExchangeExpand your AI adoption with AgentExchange
Expand your AI adoption with AgentExchange
Fexle Services Pvt. Ltd.
 
Adobe Marketo Engage Champion Deep Dive - SFDC CRM Synch V2 & Usage Dashboards
Adobe Marketo Engage Champion Deep Dive - SFDC CRM Synch V2 & Usage DashboardsAdobe Marketo Engage Champion Deep Dive - SFDC CRM Synch V2 & Usage Dashboards
Adobe Marketo Engage Champion Deep Dive - SFDC CRM Synch V2 & Usage Dashboards
BradBedford3
 
Implementing promises with typescripts, step by step
Implementing promises with typescripts, step by stepImplementing promises with typescripts, step by step
Implementing promises with typescripts, step by step
Ran Wahle
 
Get & Download Wondershare Filmora Crack Latest [2025]
Get & Download Wondershare Filmora Crack Latest [2025]Get & Download Wondershare Filmora Crack Latest [2025]
Get & Download Wondershare Filmora Crack Latest [2025]
saniaaftab72555
 
Tools of the Trade: Linux and SQL - Google Certificate
Tools of the Trade: Linux and SQL - Google CertificateTools of the Trade: Linux and SQL - Google Certificate
Tools of the Trade: Linux and SQL - Google Certificate
VICTOR MAESTRE RAMIREZ
 
Microsoft AI Nonprofit Use Cases and Live Demo_2025.04.30.pdf
Microsoft AI Nonprofit Use Cases and Live Demo_2025.04.30.pdfMicrosoft AI Nonprofit Use Cases and Live Demo_2025.04.30.pdf
Microsoft AI Nonprofit Use Cases and Live Demo_2025.04.30.pdf
TechSoup
 
Exploring Wayland: A Modern Display Server for the Future
Exploring Wayland: A Modern Display Server for the FutureExploring Wayland: A Modern Display Server for the Future
Exploring Wayland: A Modern Display Server for the Future
ICS
 
🌱 Green Grafana 🌱 Essentials_ Data, Visualizations and Plugins.pdf
🌱 Green Grafana 🌱 Essentials_ Data, Visualizations and Plugins.pdf🌱 Green Grafana 🌱 Essentials_ Data, Visualizations and Plugins.pdf
🌱 Green Grafana 🌱 Essentials_ Data, Visualizations and Plugins.pdf
Imma Valls Bernaus
 
How to Optimize Your AWS Environment for Improved Cloud Performance
How to Optimize Your AWS Environment for Improved Cloud PerformanceHow to Optimize Your AWS Environment for Improved Cloud Performance
How to Optimize Your AWS Environment for Improved Cloud Performance
ThousandEyes
 

Effective codereview | Dave Liddament | CODEiD