SlideShare a Scribd company logo
Code metrics in PHP
From lines to code semantic
● Julio Martinez
● Developing PHP since 2001
● 1.5 years working at Ulabox
● Find me: @liopic
Code metrics in PHP: 0. Introduction
Who am I?
● El antisúper!
● 6-years-old startup
● 11 developers
● monolith & new services
● #rigor
● We are hiring!
Code metrics in PHP: 0. Introduction
What is Ulabox?
● Evaluate quality!
● We need objective, reproducible and quantifiable metrics
Could you tell me some examples of metrics?
Code metrics in PHP: 1. Looking for quality
Why do we need software metrics?
● number of bugfixes per month
● lines of code
● test coverage
● number of user stories covered
● follows clean code’s rules
● documentation lines / total of code lines
● etc
Code metrics in PHP: 1. Looking for quality
Some examples?
● Testing first!
● Code “surface”
● Lines grouping
● Code semantic
Disclaimer: I’ll discuss locally-executable tools (non SaaS)
● SaaS: Insight, Code climate, Scrutinizer, SonarQube...
Code metrics in PHP: 1. Looking for quality
Let’s start our knowledge journey...
● User stories: behat
● General testing: phpunit
○ Code coverage
○ Mutant testing (=test your tests): humbug
● Unit/spec testing: phpspec
Code metrics in PHP. Testing
Testing First!
● Code sniffer (code style, PSR2): phpcs
● Copy+paste detector (DRY): phpcpd
● Clean code & common smells:
○ phpmd (“mess detector”, a bit old)
○ Exakat (it’s SaaS but has trial download)
Code metrics in PHP: 3. Code surface
Code “surface”
● Counting lines: phploc
● Getting ratios: pdepend
Code metrics in PHP: 4. Lines grouping
Lines grouping
1. Cyclomatic complexity (paths of execution)
2. Coupling metrics (relations between “modules”)
3. Lack of cohesion, LCOM (relations between methods)
4. Halstead’s metrics (operands and operators)
5. Maintainability Index
Code metrics in PHP: 5. Code semantic
Code semantic analysis
Code metrics in PHP: 5. Code semantic
Cyclomatic complexity
abstract class BaseBird
{
private $eggs = 0;
public function makeEgg()
{
$this->eggs++;
}
public function crackEgg()
{
if ($this->eggs <=0) {
throw new NoEggsException();
}
$this->eggs--;
}
public function fly()
{
return 'flap-flap';
}
abstract public function sound();
}
class Duck extends BaseBird
{
public function sound()
{
return 'quack';
}
public function swim()
{
return 'splash';
}
}
class Parrot extends BaseBird
{
public function sound()
{
$friend = new Duck();
if($friend->sound()){
return 'Err '.$friend->sound();
}
return '';
}
}
Code metrics in PHP: 5. Code semantic
Cyclomatic complexity
abstract class BaseBird
{
private $eggs = 0;
public function makeEgg()
{
$this->eggs++;
}
public function crackEgg()
{
if ($this->eggs <=0) {
throw new NoEggsException();
}
$this->eggs--;
}
public function fly()
{
return 'flap-flap';
}
abstract public function sound();
}
class Duck extends BaseBird
{
public function sound()
{
return 'quack';
}
public function swim()
{
return 'splash';
}
}
class Parrot extends BaseBird
{
public function sound()
{
$friend = new Duck();
if($friend->sound()){
return 'Err '.$friend->sound();
}
return '';
}
}
2
2
1
● Afferent couplings (Ca) - “they use you”
● Efferent couplings (Ce) - “you use them”
● Instability, resilience to change (I): I = Ce / (Ce + Ca)
○ I=0 is a completely stable package
○ I=1 is a completely unstable package
Code metrics in PHP: 5. Code semantic
Coupling metrics
● Abstractness (A): ratio of abstract classes
○ A=0 is a completely concrete package
○ A=1 is a completely abstract package
● Examples:
○ BaseBird: Ce=1 (uses NoEggsException), Ca=0; A=1, I=1
○ Parrot, Ce=1 (uses Duck), Ca=0; A=0, I=1
○ Duck, Ce=0, Ca=0; A=0, I=0
Code metrics in PHP: 5. Code semantic
Coupling metrics
● Distance from the main sequence (D): D = |A+I-1|
○ Balance between abstractness and stability
○ Ideal packages: (I=1, A=0), (I=0, A=1)
Code metrics in PHP: 5. Code semantic
Coupling metrics: main sequence
● Groups of methods
● LCOM = 1 is ideal
Code metrics in PHP: 5. Code semantic
Lack of cohesion of methods (LCOM)
abstract class BaseBird
{
private $eggs = 0;
public function makeEgg()
{
$this->eggs++;
}
public function crackEgg()
{
if ($this->eggs <=0) {
throw new NoEggsException();
}
$this->eggs--;
}
public function fly()
{
return 'flap-flap';
}
abstract public function sound();
}
● Groups of methods
● LCOM = 1 is ideal
● BaseBird LCOM = 3
Code metrics in PHP: 5. Code semantic
Lack of cohesion of methods (LCOM)
abstract class BaseBird
{
private $eggs = 0;
public function makeEgg()
{
$this->eggs++;
}
public function crackEgg()
{
if ($this->eggs <=0) {
throw new NoEggsException();
}
$this->eggs--;
}
public function fly()
{
return 'flap-flap';
}
abstract public function sound();
}
● η1
= number of distinct operators
● η2
= number of distinct operands
● N1
= the total number of operators
● N2
= the total number of operands
● Program vocabulary: η = η1
+ η2
● Program length: N = N1
+ N2
Code metrics in PHP: 5. Code semantic
Halstead complexity measures (1977)
● Volume: V = N × log2
η (linearly with length, log with vocabulary)
● Difficulty : D = η1
/2 × N2
/η2
(half distinct operators, scarcity of operands)
● Effort: E = D × V
● Time required to program: T = E/18 seconds
● Delivered bugs:
Code metrics in PHP: 5. Code semantic
Halstead complexity measures
● University of Idaho, Oman and Hagemeister
● Volume (V), Cyclomatic Complexity (G), Lines of Code (LOC)
● Original MI = 171 - 5.2*ln(V) - 0.23*G - 16.2*ln(LOC)
Code metrics in PHP: 5. Code semantic
Maintainability Index (1991)
● phpmetrics
○ Let’s see all those indexes!
Code metrics in PHP: 5. Code semantic
Coupling + LCOM + Halstead + MI
Maintainability.................... 65.83 / 100
Accessibility for new developers... 41.03 / 100
Simplicity of algorithms........... 42.57 / 100
Volume............................. 64.90 / 100
Reducing bug's probability......... 65.57 / 100
Code metrics in PHP
Code metrics in PHP
Code metrics in PHP
● MUST!
○ phpcs - code sniffer - No extra effort need; always
○ phpunit - integration & unit tests - Write tests; always
● Adopt
○ phpspec - unit/specs - Write tests; always
○ behat - user stories (functional tests) - Write user stories; always
○ phpcpd - copy & paste - No effort; always
○ phpmetrics - No effort; main indexes weekly, others when refactor
● Give a try
○ humbug - test your tests - No effort; often
○ SaaS options - Customization effort; always
Code metrics in PHP: 6. Summing up!
RADAR of tools (how? when?)
Code metrics in PHP: 6. Summing up!
Questions?
Code metrics in PHP: 6. Summing up!
Thank you!
Ad

More Related Content

Similar to Code metrics in PHP (20)

Measuring maintainability; software metrics explained
Measuring maintainability; software metrics explainedMeasuring maintainability; software metrics explained
Measuring maintainability; software metrics explained
Dennis de Greef
 
More about PHP
More about PHPMore about PHP
More about PHP
Jonathan Francis Roscoe
 
Semantic-Aware Code Model: Elevating the Future of Software Development
Semantic-Aware Code Model: Elevating the Future of Software DevelopmentSemantic-Aware Code Model: Elevating the Future of Software Development
Semantic-Aware Code Model: Elevating the Future of Software Development
Baishakhi Ray
 
Improving Code Quality Through Effective Review Process
Improving Code Quality Through Effective  Review ProcessImproving Code Quality Through Effective  Review Process
Improving Code Quality Through Effective Review Process
Dr. Syed Hassan Amin
 
Dutch PHP Conference 2013: Distilled
Dutch PHP Conference 2013: DistilledDutch PHP Conference 2013: Distilled
Dutch PHP Conference 2013: Distilled
Zumba Fitness - Technology Team
 
Joomla Code Quality Control and Automation Testing
Joomla Code Quality Control and Automation TestingJoomla Code Quality Control and Automation Testing
Joomla Code Quality Control and Automation Testing
Shyam Sunder Verma
 
Code Analysis-run time error prediction
Code Analysis-run time error predictionCode Analysis-run time error prediction
Code Analysis-run time error prediction
NIKHIL NAWATHE
 
The why and how of moving to php 8
The why and how of moving to php 8The why and how of moving to php 8
The why and how of moving to php 8
Wim Godden
 
Machine Learning on Code - SF meetup
Machine Learning on Code - SF meetupMachine Learning on Code - SF meetup
Machine Learning on Code - SF meetup
source{d}
 
Google Interview Questions By Scholarhat
Google Interview Questions By ScholarhatGoogle Interview Questions By Scholarhat
Google Interview Questions By Scholarhat
Scholarhat
 
The why and how of moving to php 7
The why and how of moving to php 7The why and how of moving to php 7
The why and how of moving to php 7
Wim Godden
 
Go. why it goes v2
Go. why it goes v2Go. why it goes v2
Go. why it goes v2
Sergey Pichkurov
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6
Wim Godden
 
The operation principles of PVS-Studio static code analyzer
The operation principles of PVS-Studio static code analyzerThe operation principles of PVS-Studio static code analyzer
The operation principles of PVS-Studio static code analyzer
Andrey Karpov
 
PHP 8: Process & Fixing Insanity
PHP 8: Process & Fixing InsanityPHP 8: Process & Fixing Insanity
PHP 8: Process & Fixing Insanity
GeorgePeterBanyard
 
Enforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code GenerationEnforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code Generation
Tim Burks
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
Rowan Merewood
 
LINQ Inside
LINQ InsideLINQ Inside
LINQ Inside
jeffz
 
Data Structure and Algorithms (DSA) with Python
Data Structure and Algorithms (DSA) with PythonData Structure and Algorithms (DSA) with Python
Data Structure and Algorithms (DSA) with Python
epsilonice
 
Standardizing on a single N-dimensional array API for Python
Standardizing on a single N-dimensional array API for PythonStandardizing on a single N-dimensional array API for Python
Standardizing on a single N-dimensional array API for Python
Ralf Gommers
 
Measuring maintainability; software metrics explained
Measuring maintainability; software metrics explainedMeasuring maintainability; software metrics explained
Measuring maintainability; software metrics explained
Dennis de Greef
 
Semantic-Aware Code Model: Elevating the Future of Software Development
Semantic-Aware Code Model: Elevating the Future of Software DevelopmentSemantic-Aware Code Model: Elevating the Future of Software Development
Semantic-Aware Code Model: Elevating the Future of Software Development
Baishakhi Ray
 
Improving Code Quality Through Effective Review Process
Improving Code Quality Through Effective  Review ProcessImproving Code Quality Through Effective  Review Process
Improving Code Quality Through Effective Review Process
Dr. Syed Hassan Amin
 
Joomla Code Quality Control and Automation Testing
Joomla Code Quality Control and Automation TestingJoomla Code Quality Control and Automation Testing
Joomla Code Quality Control and Automation Testing
Shyam Sunder Verma
 
Code Analysis-run time error prediction
Code Analysis-run time error predictionCode Analysis-run time error prediction
Code Analysis-run time error prediction
NIKHIL NAWATHE
 
The why and how of moving to php 8
The why and how of moving to php 8The why and how of moving to php 8
The why and how of moving to php 8
Wim Godden
 
Machine Learning on Code - SF meetup
Machine Learning on Code - SF meetupMachine Learning on Code - SF meetup
Machine Learning on Code - SF meetup
source{d}
 
Google Interview Questions By Scholarhat
Google Interview Questions By ScholarhatGoogle Interview Questions By Scholarhat
Google Interview Questions By Scholarhat
Scholarhat
 
The why and how of moving to php 7
The why and how of moving to php 7The why and how of moving to php 7
The why and how of moving to php 7
Wim Godden
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6
Wim Godden
 
The operation principles of PVS-Studio static code analyzer
The operation principles of PVS-Studio static code analyzerThe operation principles of PVS-Studio static code analyzer
The operation principles of PVS-Studio static code analyzer
Andrey Karpov
 
PHP 8: Process & Fixing Insanity
PHP 8: Process & Fixing InsanityPHP 8: Process & Fixing Insanity
PHP 8: Process & Fixing Insanity
GeorgePeterBanyard
 
Enforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code GenerationEnforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code Generation
Tim Burks
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
Rowan Merewood
 
LINQ Inside
LINQ InsideLINQ Inside
LINQ Inside
jeffz
 
Data Structure and Algorithms (DSA) with Python
Data Structure and Algorithms (DSA) with PythonData Structure and Algorithms (DSA) with Python
Data Structure and Algorithms (DSA) with Python
epsilonice
 
Standardizing on a single N-dimensional array API for Python
Standardizing on a single N-dimensional array API for PythonStandardizing on a single N-dimensional array API for Python
Standardizing on a single N-dimensional array API for Python
Ralf Gommers
 

More from Julio Martinez (7)

Customer segmentation scbcn17
Customer segmentation scbcn17Customer segmentation scbcn17
Customer segmentation scbcn17
Julio Martinez
 
Remote working effectively
Remote working effectivelyRemote working effectively
Remote working effectively
Julio Martinez
 
Conclusion of the Seminary UPC 2017
Conclusion of the Seminary UPC 2017Conclusion of the Seminary UPC 2017
Conclusion of the Seminary UPC 2017
Julio Martinez
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to Docker
Julio Martinez
 
Some OOP paradigms & SOLID
Some OOP paradigms & SOLIDSome OOP paradigms & SOLID
Some OOP paradigms & SOLID
Julio Martinez
 
Introduction to Clean Code
Introduction to Clean CodeIntroduction to Clean Code
Introduction to Clean Code
Julio Martinez
 
Professional development
Professional developmentProfessional development
Professional development
Julio Martinez
 
Customer segmentation scbcn17
Customer segmentation scbcn17Customer segmentation scbcn17
Customer segmentation scbcn17
Julio Martinez
 
Remote working effectively
Remote working effectivelyRemote working effectively
Remote working effectively
Julio Martinez
 
Conclusion of the Seminary UPC 2017
Conclusion of the Seminary UPC 2017Conclusion of the Seminary UPC 2017
Conclusion of the Seminary UPC 2017
Julio Martinez
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to Docker
Julio Martinez
 
Some OOP paradigms & SOLID
Some OOP paradigms & SOLIDSome OOP paradigms & SOLID
Some OOP paradigms & SOLID
Julio Martinez
 
Introduction to Clean Code
Introduction to Clean CodeIntroduction to Clean Code
Introduction to Clean Code
Julio Martinez
 
Professional development
Professional developmentProfessional development
Professional development
Julio Martinez
 
Ad

Recently uploaded (20)

AI x Accessibility UXPA by Stew Smith and Olivier Vroom
AI x Accessibility UXPA by Stew Smith and Olivier VroomAI x Accessibility UXPA by Stew Smith and Olivier Vroom
AI x Accessibility UXPA by Stew Smith and Olivier Vroom
UXPA Boston
 
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
Ivano Malavolta
 
Build With AI - In Person Session Slides.pdf
Build With AI - In Person Session Slides.pdfBuild With AI - In Person Session Slides.pdf
Build With AI - In Person Session Slides.pdf
Google Developer Group - Harare
 
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptxTop 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
mkubeusa
 
UiPath Automation Suite – Cas d'usage d'une NGO internationale basée à Genève
UiPath Automation Suite – Cas d'usage d'une NGO internationale basée à GenèveUiPath Automation Suite – Cas d'usage d'une NGO internationale basée à Genève
UiPath Automation Suite – Cas d'usage d'une NGO internationale basée à Genève
UiPathCommunity
 
Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?
Eric Torreborre
 
Mastering Testing in the Modern F&B Landscape
Mastering Testing in the Modern F&B LandscapeMastering Testing in the Modern F&B Landscape
Mastering Testing in the Modern F&B Landscape
marketing943205
 
Top-AI-Based-Tools-for-Game-Developers (1).pptx
Top-AI-Based-Tools-for-Game-Developers (1).pptxTop-AI-Based-Tools-for-Game-Developers (1).pptx
Top-AI-Based-Tools-for-Game-Developers (1).pptx
BR Softech
 
Crazy Incentives and How They Kill Security. How Do You Turn the Wheel?
Crazy Incentives and How They Kill Security. How Do You Turn the Wheel?Crazy Incentives and How They Kill Security. How Do You Turn the Wheel?
Crazy Incentives and How They Kill Security. How Do You Turn the Wheel?
Christian Folini
 
IT484 Cyber Forensics_Information Technology
IT484 Cyber Forensics_Information TechnologyIT484 Cyber Forensics_Information Technology
IT484 Cyber Forensics_Information Technology
SHEHABALYAMANI
 
Could Virtual Threads cast away the usage of Kotlin Coroutines - DevoxxUK2025
Could Virtual Threads cast away the usage of Kotlin Coroutines - DevoxxUK2025Could Virtual Threads cast away the usage of Kotlin Coroutines - DevoxxUK2025
Could Virtual Threads cast away the usage of Kotlin Coroutines - DevoxxUK2025
João Esperancinha
 
Cybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and MitigationCybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and Mitigation
VICTOR MAESTRE RAMIREZ
 
DevOpsDays SLC - Platform Engineers are Product Managers.pptx
DevOpsDays SLC - Platform Engineers are Product Managers.pptxDevOpsDays SLC - Platform Engineers are Product Managers.pptx
DevOpsDays SLC - Platform Engineers are Product Managers.pptx
Justin Reock
 
IT488 Wireless Sensor Networks_Information Technology
IT488 Wireless Sensor Networks_Information TechnologyIT488 Wireless Sensor Networks_Information Technology
IT488 Wireless Sensor Networks_Information Technology
SHEHABALYAMANI
 
An Overview of Salesforce Health Cloud & How is it Transforming Patient Care
An Overview of Salesforce Health Cloud & How is it Transforming Patient CareAn Overview of Salesforce Health Cloud & How is it Transforming Patient Care
An Overview of Salesforce Health Cloud & How is it Transforming Patient Care
Cyntexa
 
Config 2025 presentation recap covering both days
Config 2025 presentation recap covering both daysConfig 2025 presentation recap covering both days
Config 2025 presentation recap covering both days
TrishAntoni1
 
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Raffi Khatchadourian
 
Design pattern talk by Kaya Weers - 2025 (v2)
Design pattern talk by Kaya Weers - 2025 (v2)Design pattern talk by Kaya Weers - 2025 (v2)
Design pattern talk by Kaya Weers - 2025 (v2)
Kaya Weers
 
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Markus Eisele
 
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptxReimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
John Moore
 
AI x Accessibility UXPA by Stew Smith and Olivier Vroom
AI x Accessibility UXPA by Stew Smith and Olivier VroomAI x Accessibility UXPA by Stew Smith and Olivier Vroom
AI x Accessibility UXPA by Stew Smith and Olivier Vroom
UXPA Boston
 
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
Ivano Malavolta
 
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptxTop 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
mkubeusa
 
UiPath Automation Suite – Cas d'usage d'une NGO internationale basée à Genève
UiPath Automation Suite – Cas d'usage d'une NGO internationale basée à GenèveUiPath Automation Suite – Cas d'usage d'une NGO internationale basée à Genève
UiPath Automation Suite – Cas d'usage d'une NGO internationale basée à Genève
UiPathCommunity
 
Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?
Eric Torreborre
 
Mastering Testing in the Modern F&B Landscape
Mastering Testing in the Modern F&B LandscapeMastering Testing in the Modern F&B Landscape
Mastering Testing in the Modern F&B Landscape
marketing943205
 
Top-AI-Based-Tools-for-Game-Developers (1).pptx
Top-AI-Based-Tools-for-Game-Developers (1).pptxTop-AI-Based-Tools-for-Game-Developers (1).pptx
Top-AI-Based-Tools-for-Game-Developers (1).pptx
BR Softech
 
Crazy Incentives and How They Kill Security. How Do You Turn the Wheel?
Crazy Incentives and How They Kill Security. How Do You Turn the Wheel?Crazy Incentives and How They Kill Security. How Do You Turn the Wheel?
Crazy Incentives and How They Kill Security. How Do You Turn the Wheel?
Christian Folini
 
IT484 Cyber Forensics_Information Technology
IT484 Cyber Forensics_Information TechnologyIT484 Cyber Forensics_Information Technology
IT484 Cyber Forensics_Information Technology
SHEHABALYAMANI
 
Could Virtual Threads cast away the usage of Kotlin Coroutines - DevoxxUK2025
Could Virtual Threads cast away the usage of Kotlin Coroutines - DevoxxUK2025Could Virtual Threads cast away the usage of Kotlin Coroutines - DevoxxUK2025
Could Virtual Threads cast away the usage of Kotlin Coroutines - DevoxxUK2025
João Esperancinha
 
Cybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and MitigationCybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and Mitigation
VICTOR MAESTRE RAMIREZ
 
DevOpsDays SLC - Platform Engineers are Product Managers.pptx
DevOpsDays SLC - Platform Engineers are Product Managers.pptxDevOpsDays SLC - Platform Engineers are Product Managers.pptx
DevOpsDays SLC - Platform Engineers are Product Managers.pptx
Justin Reock
 
IT488 Wireless Sensor Networks_Information Technology
IT488 Wireless Sensor Networks_Information TechnologyIT488 Wireless Sensor Networks_Information Technology
IT488 Wireless Sensor Networks_Information Technology
SHEHABALYAMANI
 
An Overview of Salesforce Health Cloud & How is it Transforming Patient Care
An Overview of Salesforce Health Cloud & How is it Transforming Patient CareAn Overview of Salesforce Health Cloud & How is it Transforming Patient Care
An Overview of Salesforce Health Cloud & How is it Transforming Patient Care
Cyntexa
 
Config 2025 presentation recap covering both days
Config 2025 presentation recap covering both daysConfig 2025 presentation recap covering both days
Config 2025 presentation recap covering both days
TrishAntoni1
 
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Raffi Khatchadourian
 
Design pattern talk by Kaya Weers - 2025 (v2)
Design pattern talk by Kaya Weers - 2025 (v2)Design pattern talk by Kaya Weers - 2025 (v2)
Design pattern talk by Kaya Weers - 2025 (v2)
Kaya Weers
 
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Markus Eisele
 
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptxReimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
John Moore
 
Ad

Code metrics in PHP

  • 1. Code metrics in PHP From lines to code semantic
  • 2. ● Julio Martinez ● Developing PHP since 2001 ● 1.5 years working at Ulabox ● Find me: @liopic Code metrics in PHP: 0. Introduction Who am I?
  • 3. ● El antisúper! ● 6-years-old startup ● 11 developers ● monolith & new services ● #rigor ● We are hiring! Code metrics in PHP: 0. Introduction What is Ulabox?
  • 4. ● Evaluate quality! ● We need objective, reproducible and quantifiable metrics Could you tell me some examples of metrics? Code metrics in PHP: 1. Looking for quality Why do we need software metrics?
  • 5. ● number of bugfixes per month ● lines of code ● test coverage ● number of user stories covered ● follows clean code’s rules ● documentation lines / total of code lines ● etc Code metrics in PHP: 1. Looking for quality Some examples?
  • 6. ● Testing first! ● Code “surface” ● Lines grouping ● Code semantic Disclaimer: I’ll discuss locally-executable tools (non SaaS) ● SaaS: Insight, Code climate, Scrutinizer, SonarQube... Code metrics in PHP: 1. Looking for quality Let’s start our knowledge journey...
  • 7. ● User stories: behat ● General testing: phpunit ○ Code coverage ○ Mutant testing (=test your tests): humbug ● Unit/spec testing: phpspec Code metrics in PHP. Testing Testing First!
  • 8. ● Code sniffer (code style, PSR2): phpcs ● Copy+paste detector (DRY): phpcpd ● Clean code & common smells: ○ phpmd (“mess detector”, a bit old) ○ Exakat (it’s SaaS but has trial download) Code metrics in PHP: 3. Code surface Code “surface”
  • 9. ● Counting lines: phploc ● Getting ratios: pdepend Code metrics in PHP: 4. Lines grouping Lines grouping
  • 10. 1. Cyclomatic complexity (paths of execution) 2. Coupling metrics (relations between “modules”) 3. Lack of cohesion, LCOM (relations between methods) 4. Halstead’s metrics (operands and operators) 5. Maintainability Index Code metrics in PHP: 5. Code semantic Code semantic analysis
  • 11. Code metrics in PHP: 5. Code semantic Cyclomatic complexity abstract class BaseBird { private $eggs = 0; public function makeEgg() { $this->eggs++; } public function crackEgg() { if ($this->eggs <=0) { throw new NoEggsException(); } $this->eggs--; } public function fly() { return 'flap-flap'; } abstract public function sound(); } class Duck extends BaseBird { public function sound() { return 'quack'; } public function swim() { return 'splash'; } } class Parrot extends BaseBird { public function sound() { $friend = new Duck(); if($friend->sound()){ return 'Err '.$friend->sound(); } return ''; } }
  • 12. Code metrics in PHP: 5. Code semantic Cyclomatic complexity abstract class BaseBird { private $eggs = 0; public function makeEgg() { $this->eggs++; } public function crackEgg() { if ($this->eggs <=0) { throw new NoEggsException(); } $this->eggs--; } public function fly() { return 'flap-flap'; } abstract public function sound(); } class Duck extends BaseBird { public function sound() { return 'quack'; } public function swim() { return 'splash'; } } class Parrot extends BaseBird { public function sound() { $friend = new Duck(); if($friend->sound()){ return 'Err '.$friend->sound(); } return ''; } } 2 2 1
  • 13. ● Afferent couplings (Ca) - “they use you” ● Efferent couplings (Ce) - “you use them” ● Instability, resilience to change (I): I = Ce / (Ce + Ca) ○ I=0 is a completely stable package ○ I=1 is a completely unstable package Code metrics in PHP: 5. Code semantic Coupling metrics
  • 14. ● Abstractness (A): ratio of abstract classes ○ A=0 is a completely concrete package ○ A=1 is a completely abstract package ● Examples: ○ BaseBird: Ce=1 (uses NoEggsException), Ca=0; A=1, I=1 ○ Parrot, Ce=1 (uses Duck), Ca=0; A=0, I=1 ○ Duck, Ce=0, Ca=0; A=0, I=0 Code metrics in PHP: 5. Code semantic Coupling metrics
  • 15. ● Distance from the main sequence (D): D = |A+I-1| ○ Balance between abstractness and stability ○ Ideal packages: (I=1, A=0), (I=0, A=1) Code metrics in PHP: 5. Code semantic Coupling metrics: main sequence
  • 16. ● Groups of methods ● LCOM = 1 is ideal Code metrics in PHP: 5. Code semantic Lack of cohesion of methods (LCOM) abstract class BaseBird { private $eggs = 0; public function makeEgg() { $this->eggs++; } public function crackEgg() { if ($this->eggs <=0) { throw new NoEggsException(); } $this->eggs--; } public function fly() { return 'flap-flap'; } abstract public function sound(); }
  • 17. ● Groups of methods ● LCOM = 1 is ideal ● BaseBird LCOM = 3 Code metrics in PHP: 5. Code semantic Lack of cohesion of methods (LCOM) abstract class BaseBird { private $eggs = 0; public function makeEgg() { $this->eggs++; } public function crackEgg() { if ($this->eggs <=0) { throw new NoEggsException(); } $this->eggs--; } public function fly() { return 'flap-flap'; } abstract public function sound(); }
  • 18. ● η1 = number of distinct operators ● η2 = number of distinct operands ● N1 = the total number of operators ● N2 = the total number of operands ● Program vocabulary: η = η1 + η2 ● Program length: N = N1 + N2 Code metrics in PHP: 5. Code semantic Halstead complexity measures (1977)
  • 19. ● Volume: V = N × log2 η (linearly with length, log with vocabulary) ● Difficulty : D = η1 /2 × N2 /η2 (half distinct operators, scarcity of operands) ● Effort: E = D × V ● Time required to program: T = E/18 seconds ● Delivered bugs: Code metrics in PHP: 5. Code semantic Halstead complexity measures
  • 20. ● University of Idaho, Oman and Hagemeister ● Volume (V), Cyclomatic Complexity (G), Lines of Code (LOC) ● Original MI = 171 - 5.2*ln(V) - 0.23*G - 16.2*ln(LOC) Code metrics in PHP: 5. Code semantic Maintainability Index (1991)
  • 21. ● phpmetrics ○ Let’s see all those indexes! Code metrics in PHP: 5. Code semantic Coupling + LCOM + Halstead + MI Maintainability.................... 65.83 / 100 Accessibility for new developers... 41.03 / 100 Simplicity of algorithms........... 42.57 / 100 Volume............................. 64.90 / 100 Reducing bug's probability......... 65.57 / 100
  • 25. ● MUST! ○ phpcs - code sniffer - No extra effort need; always ○ phpunit - integration & unit tests - Write tests; always ● Adopt ○ phpspec - unit/specs - Write tests; always ○ behat - user stories (functional tests) - Write user stories; always ○ phpcpd - copy & paste - No effort; always ○ phpmetrics - No effort; main indexes weekly, others when refactor ● Give a try ○ humbug - test your tests - No effort; often ○ SaaS options - Customization effort; always Code metrics in PHP: 6. Summing up! RADAR of tools (how? when?)
  • 26. Code metrics in PHP: 6. Summing up! Questions?
  • 27. Code metrics in PHP: 6. Summing up! Thank you!
  翻译: