SlideShare a Scribd company logo
How to deal with legacy code
And not die trying
MAD · NOV 23-24 · 2018
José San Román A. de Lara
VP of Engineering ING Bank Spain
@jsral
What is
legacy code?
Just old code?
Old code that
works
Profitable
old code
Profitable code
that we are
afraid to change
~77% #bugs
found in production
can be detected using
unit tests
(*) Simple Testing Can Prevent Most Critical Failures: https://www.usenix.org/system/files/conference/osdi14/osdi14-paper-yuan.pdf
Legacy code is
profitable code
without the proper
unit tests
What can we do
with legacy code?
Do nothing
Rewrite
Incrementally
invest
On having a
better code
That should be easy to
change
Testable code
Testable and
well-tested code is
faster to change
than none
There’s no magic
There’s no magic
Just do good unit testing
Speed
Speed

Business value
Speed

Business value

ROI(*) ROI: Return On Investment
ROI
Legacy
code
(*) ROI: Return On Investment
Loosing speed
V 1.0 V 1.1 V 2.0 V 2.3 V 3.0
Time
Time
Cost of software
is the
Cost of evolving software
Why unit
testing?
Flaky tests
By
Google
(*) Source: Google’s testing blog https://testing.googleblog.com/2017/04/where-do-our-flaky-tests-come-from.html
~77% #bugs
found in production
can be detected using
unit tests
(*) Simple Testing Can Prevent Most Critical Failures: https://www.usenix.org/system/files/conference/osdi14/osdi14-paper-yuan.pdf
Behavior
vs
Collaboration
(*) Integrated tests are a scam: https://blog.thecodewhisperer.com/permalink/integrated-tests-are-a-scam
Use stubs to simulate units
behaviors
(*) Mocks aren't stubs: https://martinfowler.com/articles/mocksArentStubs.html
Use mocks to simulate units
collaboration
(*) Mocks aren't stubs: https://martinfowler.com/articles/mocksArentStubs.html
Same confidence
Lower maintenance
costs
How to improve
old code?
If you choose
to rewrite
This is not your talk
Just kiddING ;-)
@ least, I’ll give you a recipe
Branch by abstraction
(*) Branch by abstraction: https://martinfowler.com/bliki/BranchByAbstraction.html
Technique for making
large-scale change
to software systems in
a gradual way
Client code
Client code
Client code
Supplier code
Client code
Client code
Client code
Supplier code
Abstraction
layer
Client code
Client code
Client code
Supplier code
Abstraction
layer
New Supplier
code
Client code
Client code
Client code
Supplier code
Abstraction
layer
New Supplier
code
Client code
Client code
Client code
Supplier code
Abstraction
layer
New Supplier
code
Client code
Client code
Client code
Supplier code
Abstraction
layer
New Supplier
code
Client code
Client code
Client code
Abstraction
layer
New Supplier
code
If you choose to
incrementally invest
Every time we make a
change,
code must get better
For new code 
Sprouts
Wraps
For new code 
Sprouts
Wraps
For old code 
Surgical &
incremental
refactor
For new code 
Sprouts
Wraps
For old code 
Surgical &
incremental
refactor
New code will be
formulated as new
methods or classes
Sprouts
(*) Working Effectively with Legacy Code by Michael C. Feathers
public class RiskEngine {
public static int ONE_MONTH = 30;
public static int ONE_WEEK = 7;
public TransactionRiskLevel validate(Transaction t) {
TransactionRiskLevel level = TransactionRiskLevel.LOW;
DBConnection connection = DBConnection.getConnection();
PhoneRepository phoneRepository = new PhoneRepository(connection);
PhoneNumber phone = phoneRepository.findPhoneNumberByCustomerId(t.getCustomerId());
if( phone == null ) {
return TransactionRiskLevel.NEEDACALL;
}
else if( phone.hasBeenModified(ONE_WEEK) ) {
level = TransactionRiskLevel.HIGH;
}
else if( phone.hasBeenModified(ONE_MONTH) ) {
level = TransactionRiskLevel.MEDIUM;
}
return level;
}
}
public class RiskEngine {
[...]
public TransactionRiskLevel validate(Transaction t) {
[...]
TransactionRiskLevel riskLevelByAmount = getRiskLevelByAmmount(t);
if( riskLevelByAmount.compareTo(level) > 0) { level = riskLevelByAmount; }
return level;
}
public TransactionRiskLevel getRiskLevelByAmmount(Transaction t) {
TransactionRiskLevel level = TransactionRiskLevel.LOW;
int amount = t.getAmount();
if(amount >= MAX_AMOUNT) {
level = TransactionRiskLevel.HIGH;
} else if (amount >= MIN_AMOUNT) {
level = TransactionRiskLevel.MEDIUM;
}
return level;
}
}
public class RiskEngineTests {
@Test
public void transactionRiskLevelIsMediumForTransactionsWithMinAmount()
{
RiskEngine riskEngine = new RiskEngine();
Transaction t = new TransactionBuilder().withAmount(RiskEngine.MIN_AMOUNT).build();
TransactionRiskLevel level = riskEngine. getRiskLevelByAmmount(Transaction (t);
assertEquals(level, TransactionRiskLevel.MEDIUM);
}
}
Wraps
(*) Working Effectively with Legacy Code by Michael C. Feathers
Decorator pattern
(*) Decorator pattern: https://en.wikipedia.org/wiki/Decorator_pattern
RiskEngine
+ validate()
BasicRiskEngine
+ validate()
RiskEngineDecorator
+ validate()
AmountRiskEngine
+ validate()
+ riskLevelByAmmount
public abstract class RiskEngineDecorator implements RiskEngine
{
private RiskEngine engine;
public RiskEngineDecorator(RiskEngine engine)
{
this.engine = engine;
}
public TransactionRiskLevel validate(Transaction t)
{
TransactionRiskLevel level = TransactionRiskLevel.LOW;
if( engine != null ) {
level = engine.validate(t);
}
return level;
}
}
public class AmountRiskEngine extends RiskEngineDecorator {
[...]
@Override
public TransactionRiskLevel validate(Transaction t) {
TransactionRiskLevel previousRiskLevel = super.validate(t);
TransactionRiskLevel riskLevelByAmount = getRiskLevelByAmmount(t);
if( previousRiskLevel.compareTo(riskLevelByAmount) > 0) {
return previousRiskLevel;
}
else {
return riskLevelByAmount;
}
}
private TransactionRiskLevel getRiskLevelByAmmount(Transaction t) {
TransactionRiskLevel level = TransactionRiskLevel.LOW;
int amount = t.getAmount();
if(amount >= MAX_AMOUNT) { level = TransactionRiskLevel.HIGH; }
else if (amount >= MIN_AMOUNT) { level = TransactionRiskLevel.MEDIUM; }
return level;
}
}
public class RiskEngineTests {
@Test
public void transactionRiskLevelIsMediumForTransactionsWithMinAmount()
{
AmountRiskEngine riskEngine = new AmountRiskEngine();
Transaction t = new TransactionBuilder().withAmount(AmountRiskEngine.MIN_AMOUNT).build();
TransactionRiskLevel level = riskEngine.validate(t);
assertEquals(level, TransactionRiskLevel.MEDIUM);
}
}
For new code 
Sprouts
Wraps
For old code 
Surgical &
incremental
refactor
Surgical & incremental
refactor
Preserving signatures
To minimize
any chances of
errors
Understanding
the code
The better way to
understand code is
running it
Characterization test
(*) Characterization tests: https://en.wikipedia.org/wiki/Characterization_test
Describe the actual
behaviour of an existing
piece of software
Dependencies
Hidden
dependencies
A piece of code is tightly
coupled to their
collaborators
Seams
(*) Working Effectively with Legacy Code by Michael C. Feathers
Place in your program
where you can
alter behaviour without
editing that place
Extract & Override
Identify
hidden dependency
Hard-coded
initialization
Extract dependency
creation in a
factory method
Create a testing subclass
and override
the factory method
public class RiskEngine {
[...]
public TransactionRiskLevel validate(Transaction t) {
TransactionRiskLevel level = TransactionRiskLevel.LOW;
DBConnection connection = DBConnection.getConnection();
PhoneRepository phoneRepository = new PhoneRepository(connection);
PhoneNumber phone = phoneRepository.findPhoneNumberByCustomerId(t.getCustomerId());
[...]
return level;
}
}
public class RiskEngine {
[...]
protected PhoneRepository getPhoneRepository()
{
DBConnection connection = DBConnection.getConnection();
PhoneRepository phoneRepository = new PhoneRepository(connection);
return phoneRepository;
}
public TransactionRiskLevel validate(Transaction t) {
TransactionRiskLevel level = TransactionRiskLevel.LOW;
PhoneRepository phoneRepository = getPhoneRepository();
PhoneNumber phone = phoneRepository.findPhoneNumberByCustomerId(t.getCustomerId());
[...]
return level;
}
}
public class RiskEngineForTesting extends RiskEngine {
protected PhoneRepository phoneRepository;
private RiskEngineForTesting()
{
phoneRepository = mock(PhoneRepository.class);
}
@Override
protected PhoneRepository getPhoneRepository() {
return phoneRepository;
}
public static RiskEngine forCustomerThatHasModifiedPhoneNumber(int days) {
PhoneNumber phoneNumber = new PhoneNumberBuilder().withLastModified(days).build();
RiskEngineForTesting engine = new RiskEngineForTesting();
when(engine.phoneRepository.findPhoneNumberByCustomerId(anyLong())).thenReturn(phoneNumber);
return engine;
}
}
public class RiskEngineTests {
@Test
public void transactionRiskLevelIsMediumForCustomerThatHasModifiedPhoneNumberLastMonth()
{
RiskEngine riskEngine =
RiskEngineForTesting.forCustomerThatHasModifiedPhoneNumber(RiskEngine.ONE_MONTH);
Transaction t = new TransactionBuilder().build();
TransactionRiskLevel level = riskEngine.validate(t);
assertEquals(level.ordinal(), TransactionRiskLevel.MEDIUM);
}
}
Combine this
approach
all over your
codebase
You must
enjoy refactoring
your code
Takeaways
Invest in your
legacy code
To speedup
To increase or
maintain ROI
(*) ROI: Return On Investment
Every time we make a
change,
code must get better
Surgical
refactor
Characterization
tests
Incremental
refactor
Unit
tests
Test first
Sprouts or
Wraps
Incremental
refactor
Unit
tests
There’s no magic
Good unit tests
Good code
Thx
;-)

More Related Content

Similar to How deal with legacy code and not die trying v1.7

How to write clean & testable code without losing your mind
How to write clean & testable code without losing your mindHow to write clean & testable code without losing your mind
How to write clean & testable code without losing your mind
Andreas Czakaj
 
Test-Driven Development in React with Cypress
Test-Driven Development in React with CypressTest-Driven Development in React with Cypress
Test-Driven Development in React with Cypress
Josh Justice
 
Presentation slides: "How to get 100% code coverage"
Presentation slides: "How to get 100% code coverage" Presentation slides: "How to get 100% code coverage"
Presentation slides: "How to get 100% code coverage"
Rapita Systems Ltd
 
Low latency microservices in java QCon New York 2016
Low latency microservices in java   QCon New York 2016Low latency microservices in java   QCon New York 2016
Low latency microservices in java QCon New York 2016
Peter Lawrey
 
Refactoring to Testable Code
Refactoring to Testable CodeRefactoring to Testable Code
Refactoring to Testable Code
Richard Taylor
 
AAA Automated Testing
AAA Automated TestingAAA Automated Testing
AAA Automated Testing
Francesco Carucci
 
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
 
Test Driven iOS Development (TDD)
Test Driven iOS Development (TDD)Test Driven iOS Development (TDD)
Test Driven iOS Development (TDD)
Babul Mirdha
 
Apex Unit Testing in the Real World
Apex Unit Testing in the Real WorldApex Unit Testing in the Real World
Apex Unit Testing in the Real World
Salesforce Developers
 
Application Security
Application SecurityApplication Security
Application Security
florinc
 
Clean code
Clean codeClean code
Clean code
Tony Vu
 
Code Generation for Azure with .net
Code Generation for Azure with .netCode Generation for Azure with .net
Code Generation for Azure with .net
Marco Parenzan
 
Good code
Good codeGood code
Good code
Jane Prusakova
 
SAD10 - Refactoring
SAD10 - RefactoringSAD10 - Refactoring
SAD10 - Refactoring
Michael Heron
 
Parasoft .TEST, Write better C# Code Using Data Flow Analysis
Parasoft .TEST, Write better C# Code Using  Data Flow Analysis Parasoft .TEST, Write better C# Code Using  Data Flow Analysis
Parasoft .TEST, Write better C# Code Using Data Flow Analysis
Engineering Software Lab
 
C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2
Hammad Rajjoub
 
C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2
Hammad Rajjoub
 
Code Quality Practice and Tools
Code Quality Practice and ToolsCode Quality Practice and Tools
Code Quality Practice and Tools
Bob Paulin
 
Automotive Cybersecurity: Test Like a Hacker
Automotive Cybersecurity: Test Like a HackerAutomotive Cybersecurity: Test Like a Hacker
Automotive Cybersecurity: Test Like a Hacker
ForAllSecure
 
Flink Forward San Francisco 2018: David Reniz & Dahyr Vergara - "Real-time m...
Flink Forward San Francisco 2018:  David Reniz & Dahyr Vergara - "Real-time m...Flink Forward San Francisco 2018:  David Reniz & Dahyr Vergara - "Real-time m...
Flink Forward San Francisco 2018: David Reniz & Dahyr Vergara - "Real-time m...
Flink Forward
 

Similar to How deal with legacy code and not die trying v1.7 (20)

How to write clean & testable code without losing your mind
How to write clean & testable code without losing your mindHow to write clean & testable code without losing your mind
How to write clean & testable code without losing your mind
 
Test-Driven Development in React with Cypress
Test-Driven Development in React with CypressTest-Driven Development in React with Cypress
Test-Driven Development in React with Cypress
 
Presentation slides: "How to get 100% code coverage"
Presentation slides: "How to get 100% code coverage" Presentation slides: "How to get 100% code coverage"
Presentation slides: "How to get 100% code coverage"
 
Low latency microservices in java QCon New York 2016
Low latency microservices in java   QCon New York 2016Low latency microservices in java   QCon New York 2016
Low latency microservices in java QCon New York 2016
 
Refactoring to Testable Code
Refactoring to Testable CodeRefactoring to Testable Code
Refactoring to Testable Code
 
AAA Automated Testing
AAA Automated TestingAAA Automated Testing
AAA Automated Testing
 
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
 
Test Driven iOS Development (TDD)
Test Driven iOS Development (TDD)Test Driven iOS Development (TDD)
Test Driven iOS Development (TDD)
 
Apex Unit Testing in the Real World
Apex Unit Testing in the Real WorldApex Unit Testing in the Real World
Apex Unit Testing in the Real World
 
Application Security
Application SecurityApplication Security
Application Security
 
Clean code
Clean codeClean code
Clean code
 
Code Generation for Azure with .net
Code Generation for Azure with .netCode Generation for Azure with .net
Code Generation for Azure with .net
 
Good code
Good codeGood code
Good code
 
SAD10 - Refactoring
SAD10 - RefactoringSAD10 - Refactoring
SAD10 - Refactoring
 
Parasoft .TEST, Write better C# Code Using Data Flow Analysis
Parasoft .TEST, Write better C# Code Using  Data Flow Analysis Parasoft .TEST, Write better C# Code Using  Data Flow Analysis
Parasoft .TEST, Write better C# Code Using Data Flow Analysis
 
C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2
 
C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2C:\Fakepath\Combating Software Entropy 2
C:\Fakepath\Combating Software Entropy 2
 
Code Quality Practice and Tools
Code Quality Practice and ToolsCode Quality Practice and Tools
Code Quality Practice and Tools
 
Automotive Cybersecurity: Test Like a Hacker
Automotive Cybersecurity: Test Like a HackerAutomotive Cybersecurity: Test Like a Hacker
Automotive Cybersecurity: Test Like a Hacker
 
Flink Forward San Francisco 2018: David Reniz & Dahyr Vergara - "Real-time m...
Flink Forward San Francisco 2018:  David Reniz & Dahyr Vergara - "Real-time m...Flink Forward San Francisco 2018:  David Reniz & Dahyr Vergara - "Real-time m...
Flink Forward San Francisco 2018: David Reniz & Dahyr Vergara - "Real-time m...
 

Recently uploaded

Comparative analysis between traditional aquaponics and reconstructed aquapon...
Comparative analysis between traditional aquaponics and reconstructed aquapon...Comparative analysis between traditional aquaponics and reconstructed aquapon...
Comparative analysis between traditional aquaponics and reconstructed aquapon...
bijceesjournal
 
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
171ticu
 
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODELDEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
gerogepatton
 
gray level transformation unit 3(image processing))
gray level transformation unit 3(image processing))gray level transformation unit 3(image processing))
gray level transformation unit 3(image processing))
shivani5543
 
Hematology Analyzer Machine - Complete Blood Count
Hematology Analyzer Machine - Complete Blood CountHematology Analyzer Machine - Complete Blood Count
Hematology Analyzer Machine - Complete Blood Count
shahdabdulbaset
 
Computational Engineering IITH Presentation
Computational Engineering IITH PresentationComputational Engineering IITH Presentation
Computational Engineering IITH Presentation
co23btech11018
 
Use PyCharm for remote debugging of WSL on a Windo cf5c162d672e4e58b4dde5d797...
Use PyCharm for remote debugging of WSL on a Windo cf5c162d672e4e58b4dde5d797...Use PyCharm for remote debugging of WSL on a Windo cf5c162d672e4e58b4dde5d797...
Use PyCharm for remote debugging of WSL on a Windo cf5c162d672e4e58b4dde5d797...
shadow0702a
 
Transformers design and coooling methods
Transformers design and coooling methodsTransformers design and coooling methods
Transformers design and coooling methods
Roger Rozario
 
Harnessing WebAssembly for Real-time Stateless Streaming Pipelines
Harnessing WebAssembly for Real-time Stateless Streaming PipelinesHarnessing WebAssembly for Real-time Stateless Streaming Pipelines
Harnessing WebAssembly for Real-time Stateless Streaming Pipelines
Christina Lin
 
Textile Chemical Processing and Dyeing.pdf
Textile Chemical Processing and Dyeing.pdfTextile Chemical Processing and Dyeing.pdf
Textile Chemical Processing and Dyeing.pdf
NazakatAliKhoso2
 
Material for memory and display system h
Material for memory and display system hMaterial for memory and display system h
Material for memory and display system h
gowrishankartb2005
 
BPV-GUI-01-Guide-for-ASME-Review-Teams-(General)-10-10-2023.pdf
BPV-GUI-01-Guide-for-ASME-Review-Teams-(General)-10-10-2023.pdfBPV-GUI-01-Guide-for-ASME-Review-Teams-(General)-10-10-2023.pdf
BPV-GUI-01-Guide-for-ASME-Review-Teams-(General)-10-10-2023.pdf
MIGUELANGEL966976
 
ML Based Model for NIDS MSc Updated Presentation.v2.pptx
ML Based Model for NIDS MSc Updated Presentation.v2.pptxML Based Model for NIDS MSc Updated Presentation.v2.pptx
ML Based Model for NIDS MSc Updated Presentation.v2.pptx
JamalHussainArman
 
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.pptUnit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
KrishnaveniKrishnara1
 
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
Yasser Mahgoub
 
LLM Fine Tuning with QLoRA Cassandra Lunch 4, presented by Anant
LLM Fine Tuning with QLoRA Cassandra Lunch 4, presented by AnantLLM Fine Tuning with QLoRA Cassandra Lunch 4, presented by Anant
LLM Fine Tuning with QLoRA Cassandra Lunch 4, presented by Anant
Anant Corporation
 
NATURAL DEEP EUTECTIC SOLVENTS AS ANTI-FREEZING AGENT
NATURAL DEEP EUTECTIC SOLVENTS AS ANTI-FREEZING AGENTNATURAL DEEP EUTECTIC SOLVENTS AS ANTI-FREEZING AGENT
NATURAL DEEP EUTECTIC SOLVENTS AS ANTI-FREEZING AGENT
Addu25809
 
Casting-Defect-inSlab continuous casting.pdf
Casting-Defect-inSlab continuous casting.pdfCasting-Defect-inSlab continuous casting.pdf
Casting-Defect-inSlab continuous casting.pdf
zubairahmad848137
 
Certificates - Mahmoud Mohamed Moursi Ahmed
Certificates - Mahmoud Mohamed Moursi AhmedCertificates - Mahmoud Mohamed Moursi Ahmed
Certificates - Mahmoud Mohamed Moursi Ahmed
Mahmoud Morsy
 
IEEE Aerospace and Electronic Systems Society as a Graduate Student Member
IEEE Aerospace and Electronic Systems Society as a Graduate Student MemberIEEE Aerospace and Electronic Systems Society as a Graduate Student Member
IEEE Aerospace and Electronic Systems Society as a Graduate Student Member
VICTOR MAESTRE RAMIREZ
 

Recently uploaded (20)

Comparative analysis between traditional aquaponics and reconstructed aquapon...
Comparative analysis between traditional aquaponics and reconstructed aquapon...Comparative analysis between traditional aquaponics and reconstructed aquapon...
Comparative analysis between traditional aquaponics and reconstructed aquapon...
 
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
 
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODELDEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
 
gray level transformation unit 3(image processing))
gray level transformation unit 3(image processing))gray level transformation unit 3(image processing))
gray level transformation unit 3(image processing))
 
Hematology Analyzer Machine - Complete Blood Count
Hematology Analyzer Machine - Complete Blood CountHematology Analyzer Machine - Complete Blood Count
Hematology Analyzer Machine - Complete Blood Count
 
Computational Engineering IITH Presentation
Computational Engineering IITH PresentationComputational Engineering IITH Presentation
Computational Engineering IITH Presentation
 
Use PyCharm for remote debugging of WSL on a Windo cf5c162d672e4e58b4dde5d797...
Use PyCharm for remote debugging of WSL on a Windo cf5c162d672e4e58b4dde5d797...Use PyCharm for remote debugging of WSL on a Windo cf5c162d672e4e58b4dde5d797...
Use PyCharm for remote debugging of WSL on a Windo cf5c162d672e4e58b4dde5d797...
 
Transformers design and coooling methods
Transformers design and coooling methodsTransformers design and coooling methods
Transformers design and coooling methods
 
Harnessing WebAssembly for Real-time Stateless Streaming Pipelines
Harnessing WebAssembly for Real-time Stateless Streaming PipelinesHarnessing WebAssembly for Real-time Stateless Streaming Pipelines
Harnessing WebAssembly for Real-time Stateless Streaming Pipelines
 
Textile Chemical Processing and Dyeing.pdf
Textile Chemical Processing and Dyeing.pdfTextile Chemical Processing and Dyeing.pdf
Textile Chemical Processing and Dyeing.pdf
 
Material for memory and display system h
Material for memory and display system hMaterial for memory and display system h
Material for memory and display system h
 
BPV-GUI-01-Guide-for-ASME-Review-Teams-(General)-10-10-2023.pdf
BPV-GUI-01-Guide-for-ASME-Review-Teams-(General)-10-10-2023.pdfBPV-GUI-01-Guide-for-ASME-Review-Teams-(General)-10-10-2023.pdf
BPV-GUI-01-Guide-for-ASME-Review-Teams-(General)-10-10-2023.pdf
 
ML Based Model for NIDS MSc Updated Presentation.v2.pptx
ML Based Model for NIDS MSc Updated Presentation.v2.pptxML Based Model for NIDS MSc Updated Presentation.v2.pptx
ML Based Model for NIDS MSc Updated Presentation.v2.pptx
 
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.pptUnit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
 
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
 
LLM Fine Tuning with QLoRA Cassandra Lunch 4, presented by Anant
LLM Fine Tuning with QLoRA Cassandra Lunch 4, presented by AnantLLM Fine Tuning with QLoRA Cassandra Lunch 4, presented by Anant
LLM Fine Tuning with QLoRA Cassandra Lunch 4, presented by Anant
 
NATURAL DEEP EUTECTIC SOLVENTS AS ANTI-FREEZING AGENT
NATURAL DEEP EUTECTIC SOLVENTS AS ANTI-FREEZING AGENTNATURAL DEEP EUTECTIC SOLVENTS AS ANTI-FREEZING AGENT
NATURAL DEEP EUTECTIC SOLVENTS AS ANTI-FREEZING AGENT
 
Casting-Defect-inSlab continuous casting.pdf
Casting-Defect-inSlab continuous casting.pdfCasting-Defect-inSlab continuous casting.pdf
Casting-Defect-inSlab continuous casting.pdf
 
Certificates - Mahmoud Mohamed Moursi Ahmed
Certificates - Mahmoud Mohamed Moursi AhmedCertificates - Mahmoud Mohamed Moursi Ahmed
Certificates - Mahmoud Mohamed Moursi Ahmed
 
IEEE Aerospace and Electronic Systems Society as a Graduate Student Member
IEEE Aerospace and Electronic Systems Society as a Graduate Student MemberIEEE Aerospace and Electronic Systems Society as a Graduate Student Member
IEEE Aerospace and Electronic Systems Society as a Graduate Student Member
 

How deal with legacy code and not die trying v1.7