We use static code analysis tools more often these days that create great reports and funky graphs. But do we understand what it all means?
Software metrics tends to be magic numbers for a lot of people, but they don’t really have to be. Seb will introduce you to a few basic, the most popular software metrics and tools. He will explain to you what they mean and how you can use them to produce better software.
Magic behind the numbers - software metrics in practiceSebastian Marek
We use static code analysis tools more often these days that create great reports and funky graphs. But do we understand what it all mean?
Software metrics tends to be magic numbers for a lot of people, but they don't really have to be. Let me introduce you to a few basic and
most popular software metric and tools and explain you what they mean and how you can use them to produce better software.
Sentence-to-Code Traceability Recovery with Domain OntologiesShinpei Hayashi
The document describes a technique for recovering traceability between natural language sentences and source code using domain ontologies. An automated tool was implemented and evaluated on a case study using the JDraw software. Results showed the technique worked well, recovering traceability between 7 sentences and code with higher accuracy than without using the ontology. The ontology helped improve recall and detect traceability in cases where word similarity alone did not work well. Future work is needed to evaluate on larger cases and domains.
The document discusses aspect mining, which aims to identify cross-cutting concerns in legacy code. It presents the History-based Aspect Mining (HAM) approach, which analyzes code change history transactions to identify cross-cutting patterns. HAM was applied to the Eclipse project, identifying over 1,000 aspect candidates by finding methods called from multiple locations. Future work is discussed around refactoring concerns over time and understanding relationships between cross-cutting concerns.
The document discusses techniques for locating concerns in source code. It introduces the concept of a concern as anything that affects program implementation, like features or requirements. Locating concerns is difficult because the relationship between concerns and code elements is usually undocumented. The document proposes an approach called Cerberus that combines three concern location techniques - information retrieval, execution tracing, and prune dependency analysis - to more effectively determine this relationship. Future work is discussed to improve the techniques, especially prune dependency analysis and Cerberus' accuracy.
This document provides an introduction to VHDL, including:
- VHDL allows modeling and developing digital systems through modules that can be reused, with in/out ports and behavioral or structural specification.
- Models can be tested through simulation and used for synthesis.
- There are three ways to specify models: dataflow, behavioral, and structural. Behavioral models describe algorithms, structural models compose subsystems.
- A test bench applies inputs to verify a model's outputs through simulation.
The document discusses type-driven development in Scala. It covers various techniques for preventing bugs using static types, including value classes, Option types, dependent types, the IO monad, and validation. Advanced concepts from libraries like Scalaz and Shapeless are also mentioned, such as path dependent types, sized types, and using numbers as types. While static types add complexity, the document argues they can help catch bugs earlier by allowing compilers to validate code correctness.
This document discusses Java concurrency. It begins with an agenda and then covers key topics like shared state, thread safety, concurrency problems and symptoms, and Java concurrency methods. Facts about processors, caches and memory interactions that can impact concurrency are presented. Examples are provided to illustrate concurrency issues like visibility and atomicity. Common concurrency problems like invalid states and their symptoms are outlined. Finally, Java concurrency methods like thread confinement, immutability, volatile variables, and synchronized are defined and code examples are shown.
Paper: SCOTCH: Improving Test-to-Code Traceability using Slicing and Conceptual Coupling
Authors: Abdallah Qusef, Gabriele Bavota, Rocco Oliveto, Andrea De Lucia, David Binkley
Session: Research Track Session 3: Dynamic Analysis
Magic behind the numbers - software metrics in practiceSebastian Marek
We use static code analysis tools more often these days that create great reports and funky graphs. But do we understand what it all mean?
Software metrics tends to be magic numbers for a lot of people, but they don't really have to be. Let me introduce you to a few basic and
most popular software metric and tools and explain you what they mean and how you can use them to produce better software.
Sentence-to-Code Traceability Recovery with Domain OntologiesShinpei Hayashi
The document describes a technique for recovering traceability between natural language sentences and source code using domain ontologies. An automated tool was implemented and evaluated on a case study using the JDraw software. Results showed the technique worked well, recovering traceability between 7 sentences and code with higher accuracy than without using the ontology. The ontology helped improve recall and detect traceability in cases where word similarity alone did not work well. Future work is needed to evaluate on larger cases and domains.
The document discusses aspect mining, which aims to identify cross-cutting concerns in legacy code. It presents the History-based Aspect Mining (HAM) approach, which analyzes code change history transactions to identify cross-cutting patterns. HAM was applied to the Eclipse project, identifying over 1,000 aspect candidates by finding methods called from multiple locations. Future work is discussed around refactoring concerns over time and understanding relationships between cross-cutting concerns.
The document discusses techniques for locating concerns in source code. It introduces the concept of a concern as anything that affects program implementation, like features or requirements. Locating concerns is difficult because the relationship between concerns and code elements is usually undocumented. The document proposes an approach called Cerberus that combines three concern location techniques - information retrieval, execution tracing, and prune dependency analysis - to more effectively determine this relationship. Future work is discussed to improve the techniques, especially prune dependency analysis and Cerberus' accuracy.
This document provides an introduction to VHDL, including:
- VHDL allows modeling and developing digital systems through modules that can be reused, with in/out ports and behavioral or structural specification.
- Models can be tested through simulation and used for synthesis.
- There are three ways to specify models: dataflow, behavioral, and structural. Behavioral models describe algorithms, structural models compose subsystems.
- A test bench applies inputs to verify a model's outputs through simulation.
The document discusses type-driven development in Scala. It covers various techniques for preventing bugs using static types, including value classes, Option types, dependent types, the IO monad, and validation. Advanced concepts from libraries like Scalaz and Shapeless are also mentioned, such as path dependent types, sized types, and using numbers as types. While static types add complexity, the document argues they can help catch bugs earlier by allowing compilers to validate code correctness.
This document discusses Java concurrency. It begins with an agenda and then covers key topics like shared state, thread safety, concurrency problems and symptoms, and Java concurrency methods. Facts about processors, caches and memory interactions that can impact concurrency are presented. Examples are provided to illustrate concurrency issues like visibility and atomicity. Common concurrency problems like invalid states and their symptoms are outlined. Finally, Java concurrency methods like thread confinement, immutability, volatile variables, and synchronized are defined and code examples are shown.
Paper: SCOTCH: Improving Test-to-Code Traceability using Slicing and Conceptual Coupling
Authors: Abdallah Qusef, Gabriele Bavota, Rocco Oliveto, Andrea De Lucia, David Binkley
Session: Research Track Session 3: Dynamic Analysis
Detecting Occurrences of Refactoring with Heuristic SearchShinpei Hayashi
This document describes a technique for detecting refactorings between two versions of a program using heuristic search. Refactorings are detected by generating intermediate program states through applying refactorings, and finding a path from the original to modified program that minimizes differences. Structural differences are used to identify likely refactorings. Candidate refactorings are evaluated and applied to generate new states, with the search terminating when the state matches the modified program. A supporting tool was developed and a case study found the technique could correctly detect an actual series of refactorings between program versions.
The document discusses Remote Method Invocation (RMI) in Java, including its architectural components like remote interfaces, stubs, and skeletons; how objects are serialized and classes dynamically loaded during remote calls; and how to configure the RMI codebase property to specify locations for downloading classes.
PVS-Studio is there to help CERN: analysis of Geant4 projectPVS-Studio
Geant4 project continues developing, so it's really interesting to recheck it with PVS-Studio static code analyzer. This time we'll do a check of version 10.2 (previously, we checked 10.0 beta-version)
JavaFest. Виктор Полищук. Legacy: как победить в гонкеFestGroup
У вас древний проект? Все зовут его «Legacy», а вас «неудачник»? Возможно они даже смеются над вами.
Давайте взглянем на ситуацию с другого ракурса. Все (все, Карл!) успешные проекты рано или поздно превращаются в Legacy-проекты.
Я затрону тему Legacy не просто как явление, а как возможность быть постоянно в тренде, прослыть супер-спецом (даже если ты знаешь всего два фреймворка), сделать карьеру, как делать, то что ты хочешь, а не то что тебя просят. Ладно, ладно, я наврал про два фреймворка, но все остальное чистая правда. Я покажу, что вы можете творить, имея правильный подход к Legacy коду.
Суть в том, что Legacy — это не грустно/уныло/немодно, это просто/клево/весело, если с умом подойти к задаче!
This document discusses behavioral modeling in VHDL. It covers different VHDL design styles including behavioral, dataflow, and structural. Behavioral modeling uses sequential statements inside processes to model functionality. Key concepts covered include processes with and without sensitivity lists, concurrent vs sequential execution, if/case statements, loops, and wait statements. An example of a behavioral model for a full adder is presented using two processes.
The document discusses Clang, a C language family front-end toolkit written in C++. Clang was created at LLVM.org in 2006 and can parse C, C++, and Objective-C code. It consists of several core components like the lexer, parser, semantic analyzer, and AST (abstract syntax tree) that allow it to read code and produce LLVM IR that can be optimized and run on different systems. Clang aims to provide a better alternative to existing compilers like GCC with features like improved diagnostics, code analysis, and language support.
Bridging Proprietary Modelling and Open-Source Model Management Tools: The Ca...Thanos Zolotas
This document discusses bridging the proprietary modeling tool PTC Integrity Modeller with the open-source model management tool Epsilon. It presents the architecture of a driver that allows Epsilon to access and manipulate models in PTC IM. An evaluation compares the performance of executing constraints written in Epsilon and PTC IM's native scripting language. While caching improves performance, Epsilon is still slower. Future work includes improving incremental execution of constraints and transformations to enhance performance.
This document summarizes the history of C# and .NET Framework versions from Visual Studio .NET Rainer in 2002 to Visual Studio 2010 Dev10. It covers features introduced in each new version of C# and .NET Framework including generics, LINQ, lambda expressions, extension methods, and more. It also briefly discusses the Reactive Extensions for .NET Framework 3.5 which added asynchronous programming capabilities using an observer pattern.
Improving Android Performance at Droidcon UK 2014Raimon Ràfols
The document discusses ways to improve Android application performance by optimizing Java bytecode. It covers topics like:
- How the Java compiler does not optimize code like C/C++ compilers do
- Examples of optimizations like avoiding autoboxing, using primitives over objects when possible, and using StringBuilder for string concatenation
- Tips for loops like caching array lengths and using backwards loops when applicable
- Tools for disassembling and analyzing bytecode like dexdump, smali, and oatdump
- The impact of obfuscation on optimizing bytecode
- Best practices for benchmarking like running tests separately to avoid JIT compiler effects
VHDL (VHSIC Hardware Description Language) is becoming increasingly popular as a way to capture complex digital electronic circuits for both simulation and synthesis. Digital circuits captured using VHDL can be easily simulated, are more likely to be synthesizable into multiple target technologies, and can be archived for later modification and reuse.
The document discusses C++ exception handling, including:
1. The C++ exception handling ABI consists of a base ABI for stack unwinding common to all languages, and a C++ ABI for interoperability.
2. The base ABI includes .eh_frame for unwind information and libgcc_eh for implementation. The C++ ABI includes __cxa_* functions, personality routines, and .gcc_except_table.
3. When an exception is thrown, the base ABI performs stack unwinding in two phases to find a handler, then the C++ personality routine interprets .gcc_except_table to perform the handler actions.
Ridge-based Profiled Differential Power AnalysisPriyanka Aash
Ridge-based differential power analysis techniques and side-channel attacks on intermediate states with no partial key guessing are discussed. Topic 1: Ridge-Based Profiled Differential Power Analysis Authors: Weijia Wang, Yu Yu, François-Xavier Standaert, Dawu Gu, Sen Xu and Chi Zhang Topic 2: My Traces Learn What You Did in the Dark: Recovering Secret Signals without Key Guesses Authors: Si Gao, Hua Chen, Wenling Wu, Limin Fan, Weiqiong Cao and Xiangliang Ma.
(Source : RSA Conference USA 2017)
The document describes the implementation of various digital logic circuits like D latch, D flip flop, JK flip flop, multiplexers, decoders, counters etc. using VHDL. It includes the VHDL code, test benches and synthesis reports for each circuit. The aim is to design the circuits in behavioral and structural modeling and verify their functionality.
The document discusses extending the PHP Development Toolkit (PDT) in Eclipse. It provides examples of how to extend PDT by registering build participants and AST visitors to integrate validation rules. Quick fixes can also be added to automatically fix problems. The document recommends using Eclipse's JavaScript support to dynamically extend PDT through scripting instead of Java for PHP developers. This allows customizing PDT distributions and potentially writing PHP plugins in PHP.
This document describes digital systems and processes in VHDL. It includes sections on implicit and explicit processes, comparison and selection in explicit processes, and a case study on using an explicit process to implement an asynchronous reset register with a clock and enable signal. Examples are provided of implicit process assignments, explicit processes using if/else statements and case statements, and shift registers with asynchronous reset. Templates for common constructs like registers and counters using explicit processes are also shown from Quartus II.
The document discusses refactoring code by replacing methods with method objects. Specifically, it talks about extracting the body of a long or complex method into a new class, making the method body smaller and easier to understand. Instance variables can be used to share state between the original method and new method object. The goal is to break apart methods to make the code more readable and maintainable through refactoring.
The document describes data flow modeling in VHDL. It discusses how data flow style architecture models hardware in terms of the movement of data over continuous time between combinational logic components. It also describes how concurrent signal assignment statements can be used to model simple combinational logic. Examples provided include half adder, full adder, comparator, multiplexer, decoder, and arithmetic logic unit designs modeled using data flow style and concurrent signal assignments.
L Fu - Dao: a novel programming language for bioinformaticsJan Aerts
The document introduces Dao, a new programming language for bioinformatics. It discusses Dao's key features like optional typing, native support for concurrent programming, an LLVM-based JIT compiler, simple C interfaces, and the ClangDao tool for wrapping C/C++ libraries. An example demonstrates using thread tasks and futures for concurrent programming. The document outlines future plans to develop BioDao, an open source project providing bioinformatics modules to the Dao language.
This document discusses various software metrics that can be used to analyze Ruby on Rails code quality, including lines of code, test coverage, code complexity, and cyclomatic complexity. It provides examples of metrics for two sample Rails applications called Mephisto and Typo and notes that tracking metrics over time is more useful than a single snapshot for understanding code quality issues.
Measuring maintainability; software metrics explainedDennis de Greef
In a world of ever-changing business requirements, how can you keep your software moving at the same pace?
If you keep adding lines of code around the previous iteration to add new functionality, things can become complex quite fast.
By measuring complexity, you can resolve and prevent bugs, while measuring class responsibility can make refactoring easier, for example.
In this talk Dennis will go through certain concepts of analysing software with automated tools to spit out numbers which tell a story about your code.
Detecting Occurrences of Refactoring with Heuristic SearchShinpei Hayashi
This document describes a technique for detecting refactorings between two versions of a program using heuristic search. Refactorings are detected by generating intermediate program states through applying refactorings, and finding a path from the original to modified program that minimizes differences. Structural differences are used to identify likely refactorings. Candidate refactorings are evaluated and applied to generate new states, with the search terminating when the state matches the modified program. A supporting tool was developed and a case study found the technique could correctly detect an actual series of refactorings between program versions.
The document discusses Remote Method Invocation (RMI) in Java, including its architectural components like remote interfaces, stubs, and skeletons; how objects are serialized and classes dynamically loaded during remote calls; and how to configure the RMI codebase property to specify locations for downloading classes.
PVS-Studio is there to help CERN: analysis of Geant4 projectPVS-Studio
Geant4 project continues developing, so it's really interesting to recheck it with PVS-Studio static code analyzer. This time we'll do a check of version 10.2 (previously, we checked 10.0 beta-version)
JavaFest. Виктор Полищук. Legacy: как победить в гонкеFestGroup
У вас древний проект? Все зовут его «Legacy», а вас «неудачник»? Возможно они даже смеются над вами.
Давайте взглянем на ситуацию с другого ракурса. Все (все, Карл!) успешные проекты рано или поздно превращаются в Legacy-проекты.
Я затрону тему Legacy не просто как явление, а как возможность быть постоянно в тренде, прослыть супер-спецом (даже если ты знаешь всего два фреймворка), сделать карьеру, как делать, то что ты хочешь, а не то что тебя просят. Ладно, ладно, я наврал про два фреймворка, но все остальное чистая правда. Я покажу, что вы можете творить, имея правильный подход к Legacy коду.
Суть в том, что Legacy — это не грустно/уныло/немодно, это просто/клево/весело, если с умом подойти к задаче!
This document discusses behavioral modeling in VHDL. It covers different VHDL design styles including behavioral, dataflow, and structural. Behavioral modeling uses sequential statements inside processes to model functionality. Key concepts covered include processes with and without sensitivity lists, concurrent vs sequential execution, if/case statements, loops, and wait statements. An example of a behavioral model for a full adder is presented using two processes.
The document discusses Clang, a C language family front-end toolkit written in C++. Clang was created at LLVM.org in 2006 and can parse C, C++, and Objective-C code. It consists of several core components like the lexer, parser, semantic analyzer, and AST (abstract syntax tree) that allow it to read code and produce LLVM IR that can be optimized and run on different systems. Clang aims to provide a better alternative to existing compilers like GCC with features like improved diagnostics, code analysis, and language support.
Bridging Proprietary Modelling and Open-Source Model Management Tools: The Ca...Thanos Zolotas
This document discusses bridging the proprietary modeling tool PTC Integrity Modeller with the open-source model management tool Epsilon. It presents the architecture of a driver that allows Epsilon to access and manipulate models in PTC IM. An evaluation compares the performance of executing constraints written in Epsilon and PTC IM's native scripting language. While caching improves performance, Epsilon is still slower. Future work includes improving incremental execution of constraints and transformations to enhance performance.
This document summarizes the history of C# and .NET Framework versions from Visual Studio .NET Rainer in 2002 to Visual Studio 2010 Dev10. It covers features introduced in each new version of C# and .NET Framework including generics, LINQ, lambda expressions, extension methods, and more. It also briefly discusses the Reactive Extensions for .NET Framework 3.5 which added asynchronous programming capabilities using an observer pattern.
Improving Android Performance at Droidcon UK 2014Raimon Ràfols
The document discusses ways to improve Android application performance by optimizing Java bytecode. It covers topics like:
- How the Java compiler does not optimize code like C/C++ compilers do
- Examples of optimizations like avoiding autoboxing, using primitives over objects when possible, and using StringBuilder for string concatenation
- Tips for loops like caching array lengths and using backwards loops when applicable
- Tools for disassembling and analyzing bytecode like dexdump, smali, and oatdump
- The impact of obfuscation on optimizing bytecode
- Best practices for benchmarking like running tests separately to avoid JIT compiler effects
VHDL (VHSIC Hardware Description Language) is becoming increasingly popular as a way to capture complex digital electronic circuits for both simulation and synthesis. Digital circuits captured using VHDL can be easily simulated, are more likely to be synthesizable into multiple target technologies, and can be archived for later modification and reuse.
The document discusses C++ exception handling, including:
1. The C++ exception handling ABI consists of a base ABI for stack unwinding common to all languages, and a C++ ABI for interoperability.
2. The base ABI includes .eh_frame for unwind information and libgcc_eh for implementation. The C++ ABI includes __cxa_* functions, personality routines, and .gcc_except_table.
3. When an exception is thrown, the base ABI performs stack unwinding in two phases to find a handler, then the C++ personality routine interprets .gcc_except_table to perform the handler actions.
Ridge-based Profiled Differential Power AnalysisPriyanka Aash
Ridge-based differential power analysis techniques and side-channel attacks on intermediate states with no partial key guessing are discussed. Topic 1: Ridge-Based Profiled Differential Power Analysis Authors: Weijia Wang, Yu Yu, François-Xavier Standaert, Dawu Gu, Sen Xu and Chi Zhang Topic 2: My Traces Learn What You Did in the Dark: Recovering Secret Signals without Key Guesses Authors: Si Gao, Hua Chen, Wenling Wu, Limin Fan, Weiqiong Cao and Xiangliang Ma.
(Source : RSA Conference USA 2017)
The document describes the implementation of various digital logic circuits like D latch, D flip flop, JK flip flop, multiplexers, decoders, counters etc. using VHDL. It includes the VHDL code, test benches and synthesis reports for each circuit. The aim is to design the circuits in behavioral and structural modeling and verify their functionality.
The document discusses extending the PHP Development Toolkit (PDT) in Eclipse. It provides examples of how to extend PDT by registering build participants and AST visitors to integrate validation rules. Quick fixes can also be added to automatically fix problems. The document recommends using Eclipse's JavaScript support to dynamically extend PDT through scripting instead of Java for PHP developers. This allows customizing PDT distributions and potentially writing PHP plugins in PHP.
This document describes digital systems and processes in VHDL. It includes sections on implicit and explicit processes, comparison and selection in explicit processes, and a case study on using an explicit process to implement an asynchronous reset register with a clock and enable signal. Examples are provided of implicit process assignments, explicit processes using if/else statements and case statements, and shift registers with asynchronous reset. Templates for common constructs like registers and counters using explicit processes are also shown from Quartus II.
The document discusses refactoring code by replacing methods with method objects. Specifically, it talks about extracting the body of a long or complex method into a new class, making the method body smaller and easier to understand. Instance variables can be used to share state between the original method and new method object. The goal is to break apart methods to make the code more readable and maintainable through refactoring.
The document describes data flow modeling in VHDL. It discusses how data flow style architecture models hardware in terms of the movement of data over continuous time between combinational logic components. It also describes how concurrent signal assignment statements can be used to model simple combinational logic. Examples provided include half adder, full adder, comparator, multiplexer, decoder, and arithmetic logic unit designs modeled using data flow style and concurrent signal assignments.
L Fu - Dao: a novel programming language for bioinformaticsJan Aerts
The document introduces Dao, a new programming language for bioinformatics. It discusses Dao's key features like optional typing, native support for concurrent programming, an LLVM-based JIT compiler, simple C interfaces, and the ClangDao tool for wrapping C/C++ libraries. An example demonstrates using thread tasks and futures for concurrent programming. The document outlines future plans to develop BioDao, an open source project providing bioinformatics modules to the Dao language.
This document discusses various software metrics that can be used to analyze Ruby on Rails code quality, including lines of code, test coverage, code complexity, and cyclomatic complexity. It provides examples of metrics for two sample Rails applications called Mephisto and Typo and notes that tracking metrics over time is more useful than a single snapshot for understanding code quality issues.
Measuring maintainability; software metrics explainedDennis de Greef
In a world of ever-changing business requirements, how can you keep your software moving at the same pace?
If you keep adding lines of code around the previous iteration to add new functionality, things can become complex quite fast.
By measuring complexity, you can resolve and prevent bugs, while measuring class responsibility can make refactoring easier, for example.
In this talk Dennis will go through certain concepts of analysing software with automated tools to spit out numbers which tell a story about your code.
Code lifecycle in the jvm - TopConf LinzIvan Krylov
This document summarizes the lifecycle of JIT compiled code in the JVM. It discusses how bytecode is initially interpreted and then compiled by the JIT compiler into machine code. It describes the different compilation tiers (interpreter, C1, C2) and how profiling guides which tier is used. The document outlines what profiles are and how they are used to optimize compilation. It also discusses deoptimization that can occur if optimizations assumptions are invalidated at runtime. Finally it reviews several ways to control the JIT compiler behavior like compiler commands, CompilerControl API, and ReadyNow ahead-of-time compilation.
Lifecycle of a JIT compiled code by Ivan Krylov
The just-in-time compilers in the Java Virtual Machines make sure that the Java code you wrote runs as fast as possible and that the implicit and explicit checks do not compromise the performance. What are the mechanics of decision making within JITs and what happens when those turn to be wrong? The talk will cover the profile collection path, code transformations and the various interfaces to influence the JIT including the ReadyNow technology from Azul Systems.
Triton and Symbolic execution on GDB@DEF CON ChinaWei-Bo Chen
Triton and Symbolic execution on GDB is a talk about symbolic execution. It introduces Triton, a symbolic execution framework, and SymGDB, which combines Triton with GDB to enable symbolic execution directly within the GDB debugger. Key points include how Triton works, its components like the symbolic execution engine and AST representations, and how SymGDB utilizes the GDB Python API to synchronize Triton's state with the debugged program and allow symbolic analysis of programs within GDB. Examples demonstrating SymGDB on crackme programs that take symbolic user input are also presented.
Continuous Inspection - Uma abordagem efetiva para melhoria contínua da quali...Roberto Pepato
This document discusses approaches for continuous improvement of software quality, including metrics, inspections, static code analysis, and refactoring. It provides examples of specific metrics like cyclomatic complexity, duplicated code, long methods, and excessive dependencies that can be measured and improved through refactoring. Continuous inspection is suggested through integrating static code analysis into continuous integration to continuously measure and improve code quality.
The document discusses testing asynchronous Node.js code. It describes the current approach of using callbacks in tests but notes issues with this approach. It then discusses using stubs and mocks to make asynchronous code synchronous so it can be tested more easily. Finally, it discusses the benefits of writing many small "microtests" that isolate and test individual functions and paths through the code rather than large integration tests.
Using static code analysis tools and detecting and fixing identified issues is very important in order to improve the quality and security of the code baseline.
CodeChecker (https://github.com/Ericsson/codechecker ) is an open source analyzer tooling, defect database and viewer extension for the Clang Static Analyzer and Clang Tidy.
It provides a number of additional features:
- Good visualization of problems in the code
- Overview of results for the whole product
- Filtering
- Cross translational unit analysis and statistical checkers support
- Suppression handling
- And many others...
These features simplify the follow up of results and make it more efficient.
In the video, an overview of features and capabilities of CodeChecker is demonstrated as well as a description and recommendation of how to introduce new tools.
Recording of the demo: https://youtu.be/sQ2Qj0kHoRY published in C++ Dublin User group https://www.youtube.com/channel/UCZ4UNE_1IMUFfAhcdq7CMOg/
Useful links:
open source project: https://github.com/Ericsson/codechecker
http://codechecker-demo.eastus.cloudapp.azure.com/login.html#
demo/demo
https://codechecker.readthedocs.io/en/latest/
http://clang-analyzer.llvm.org/available_checks.html
http://clang.llvm.org/extra/clang-tidy/checks/list.html
Other related videos about Clang Static Analyzer and CodeChecker that goes a bit more deeply into how Clang Static Analyzer works:
Clang Static Analysis - Meeting C++ 2016 Gabor Horvath
https://www.youtube.com/watch?v=UcxF6CVueDM
CppCon 2016: Gabor Horvath “Make Friends with the Clang Static Analysis Tools"
https://www.youtube.com/watch?v=AQF6hjLKsnM
Object detection is a central problem in computer vision and underpins many applications from medical image analysis to autonomous driving. In this talk, we will review the basics of object detection from fundamental concepts to practical techniques. Then, we will dive into cutting-edge methods that use transformers to drastically simplify the object detection pipeline while maintaining predictive performance. Finally, we will show how to train these models at scale using Determined’s integrated deep learning platform and then serve the models using MLflow.
What you will learn:
Basics of object detection including main concepts and techniques
Main ideas from the DETR and Deformable DETR approaches to object detection
Overview of the core capabilities of Determined’s deep learning platform, with a focus on its support for effortless distributed training
How to serve models trained in Determined using MLflow
This document discusses code metrics and refactoring. It begins with an introduction to metrics and how they can be used to evaluate code quality by measuring attributes like complexity, coupling, and cohesion. Several specific metrics are discussed like CBO, CC, and LCOM. The document then discusses refactoring and how metrics can help identify areas of code that need improvement. Refactoring is presented as an important process to prevent software decay and allow code to be improved over time through iterative testing and modification.
This document discusses symbolic execution and the Triton framework. It begins with an introduction to symbolic execution and why it is useful for tasks like static and dynamic analysis. Triton is then introduced as a dynamic binary analysis framework that uses symbolic execution. Key components of Triton like the symbolic execution engine and AST representations are described. Finally, SymGDB is presented as a way to combine Triton with GDB to simplify symbolic execution debugging workflows. Examples analyzing crackme programs are provided to demonstrate SymGDB.
The document discusses tools to improve a LAMP web development stack. It recommends source control, development platforms, task tracking, automated testing, static analysis, automated deployment, and continuous integration. These tools enable collaboration, testing, deployment automation, and integration of code changes. Specific open source tools are recommended for each category like Git, PHPUnit, PHP Code Sniffer, and Jenkins. The document argues these tools improve workflow, quality, and speed of development.
The document discusses new features in Groovy and Grails support, including DSL support in Groovy-Eclipse. It describes how DSL descriptors allow Groovy-Eclipse to understand domain-specific languages through scripting. Pointcuts and contribution blocks allow adding properties and methods during type inference. Examples demonstrate DSL descriptors for basic scripts, meta-DSLs, AST transforms, SwingBuilder, and Grails constraints.
C++ in kernel mode, Roman Beleshev
Вы когда-нибудь писали драйвера для Windows? А на С++? Пора развенчать миф о том, что драйверописательство - это только С и только хардкор. О различиях между Kernel mode и User mode, о технических моментах реализации некоторых возможностей С++, и о том, что писать драйвера на С++ можно, нужно и очень приятно и увлекательно.
An Embedded Error Recovery and Debugging Mechanism for Scripting Language Ext...David Beazley (Dabeaz LLC)
The document describes an embedded error recovery and debugging mechanism for scripting language extensions. It discusses how errors can occur both in script code and extension code built as shared libraries. Debugging errors in extension code is challenging as typical debuggers and tracebacks do not work. The document then presents the Wrapped Application Debugger (WAD) which allows debugging of extension code as if it were part of the script by capturing signals and integrating with the GNU Debugger (GDB).
This document provides an overview of the capabilities of NDepend for analyzing source code dependencies, quality metrics, code coverage, state and mutability, potential dead code, naming conventions, object models, and build process health. It describes how to use Code Query Language (CQL) to write queries and constraints to examine the code base and identify issues.
The document discusses code metrics that can be used to evaluate code quality in PHP projects. It introduces various metrics like lines of code, test coverage, cyclomatic complexity, coupling metrics, lack of cohesion in methods, Halstead complexity measures, and maintainability index. It recommends always using tools like PHP Code Sniffer and PHPUnit for testing and recommends adopting tools like PHPSpec, Behat, PHP Copy/Paste Detector and PHPMetrics. It also suggests giving tools like Humbug for mutant testing a try and considering SaaS options with customization efforts.
Testing multithreaded java applications for synchronization problemsVassil Popovski
This document discusses techniques for testing multithreaded Java applications for synchronization problems. It begins by explaining why multithreading is used and the new types of defects that can arise, such as deadlocks, livelocks, and race conditions. It then covers various testing techniques like load/stress testing, testing specific thread interleavings, testing all possible interleavings, and using instrumentation. It provides examples of tools that can be used for each technique and recommends books on the topic.
Similar to PHP Forum Paris 2012: Magic behind the numbers. Software metrics in practice (20)
The document discusses the journey of implementing continuous integration (CI) practices. It describes initial frustrations with ad hoc builds and lack of standards. A council was formed including managers and developers to address threats, opportunities and plan implementation. Automation tools were adopted, including Cruisecontrol, PHPUnit, phpDocumentor, PHP_Codesniffer, and others to enable automated builds, testing, documentation and metrics. Jenkins was later adopted for its improved installation, configuration and support for multiple languages. SonarQube was also used for continuous analysis and quality management. Implementing a CI culture involved adopting development models, scaling the build process, code reviews and improving communication.
CodeClub - Teaching the young generation programmingSebastian Marek
Code Club is all about connecting talented computer programmers with their local schools and providing them with the materials they need to help kids learn to code. It is a nationwide network of free volunteer-led after-school coding clubs for children aged 9-11. In this talk I will tell you what this is all about and how you can get involved and support this great initiative.
Wbrew powszechnym opiniom, nie tak prosto jest zrobić dobre Code Review. Robione w pośpiechu, tylko po to by je "odbębnić", często stwarza więcej szkody niż pożytku. Opowiem wam dlaczego code review jest ważne i jak wykorzystać ten proces aby upewnić się, że napisany kod jest najwyższej jakości. Będę nie tylko mówił o tym kto powinien robić code reviews, i dla kogo, jakie informacje są potrzebne do przeprowadzenia skutecznego code review, ale także jak zrobić dobre code review w najkrótszym możliwym czasie.
Managing and Monitoring Application PerformanceSebastian Marek
Writing your application is one thing. Making the application to perform well is another. We usually forget there is somebody else on the other side of the screen, that becomes very frustrated and upset when he needs to wait until this one page finally loads. It requires a lot of experience to predict specific behaviour and to know what kind of things to avoid. And even with that there is so many different factors that can affect the end user experience. During this talk I will talk about tools and techniques you can use to measure and monitor your application performance.
Software engineering is not an easy profession. You have to constantly learn new things to improve your coding skills and make sure you produce better and cleaner code over time. It’s not difficult, but you have to be aware of a few basic principles. With them in mind you will feel a better engineer and will gain respect from your fellow engineers. And the Lord said: “Thou shall always remember to write unit tests - no matter the deadline. Remember to keep the build green. Thou shall commit often and with meaningful messages (...)”
Continuous Inspection: Fight back the 7 deadly sins of a developer!Sebastian Marek
This document discusses continuous inspection as a way for developers to fight against the seven deadly sins of development. It introduces each of the seven deadly sins - lust, gluttony, greed, sloth, wrath, envy, and pride - and provides examples of how they may manifest in code. It then discusses how tools like Sonar can help with continuous inspection by analyzing code for potential issues and tracking metrics over time to control technical debt.
Test your code like a pro - PHPUnit in practiceSebastian Marek
The day you realised that you can’t really tell what your code does is the day you stop being an amateur programmer and you turn into a professional developer. During this workshop you will learn about the most famous unit testing framework – PHPUnit, how it can help you gain confidence in your code and what to do (and what to avoid) to make your code testable. We will discuss unit testing best practices and talk about tools that can help you automate the whole process, so it becomes more of a habit then a necessity.
It’s not easy to perform a good code review. Often done in a hurry just to get it done, it only makes things worse. People treat it as an obstacle, not a helpful thing. I am gonna tell you why code reviews are important and how they can help you maintain good quality code. I will not only tell who are the code reviews for, how to raise a useful code review, but also how to perform a good code review in the quickest time possible.
Code reviews are a powerful tool in ensuring and maintaining quality in your application, but they can be very difficult to get right. When they're misunderstood or poorly executed, they can even make a bad situation worse.
In this session I'll use my professional experience to give you some tactics for getting great benefit from code reviews. We'll talk about tools, about process and most importantly about attitude! Whether you're a developer or a technical lead, come along and find out how to perform a genuinely useful code review and provide constructive feedback in the quickest time possible.
Software engineering is not an easy profession. You have to constantly learn new things to improve your coding skills and make sure you produce better and cleaner code over time. It's not difficult, but you have to be aware of a few basic principles. With them in mind you will feel a better engineer and will gain respect from your fellow engineers. And the Lord said: "Thou shall always remember to write unit tests - no matter the deadline. Remember to keep the build green. Thou shall commit often and with meaningful messages (...)"
PHP Benelux 2012: Magic behind the numbers. Software metrics in practice Sebastian Marek
Software metrics can provide useful insights into code quality and complexity. Code metrics like lines of code, cyclomatic complexity, and weighted method count measure characteristics like code size, logic complexity, and class complexity. Design metrics evaluate qualities like coupling and cohesion. Metrics are most effective when used to identify improvement opportunities rather than to judge the overall quality of code or designs. Calculating and tracking metrics over time can help optimize code and catch regressions during development.
Unit testing involves testing individual units of code to ensure they function as intended. Unit tests isolate and test each part of a program to show they are correct. Benefits of unit testing include finding problems early, facilitating change, simplifying integration, and serving as living documentation. PHPUnit is a popular unit testing framework for PHP, which can be installed via PEAR. Tests are written to make assertions and test exceptions, data, and dependencies. Results can be logged in verbose mode or testdox format.
There are several tools out there that help to develop and maintain high quality PHP code. They allow you to identify the most fragile and messy parts of your codebase. PHP_CodeSniffer tokenises PHP, JavaScript and CSS files and detects violations of a defined set of coding standards. Learn how it works, how you can use it and how can you bend it to meet your requirements!
Sonar is a platform for continuously inspecting code quality to detect issues, ensure technical debt is under control, and monitor code complexity, duplications, and potential bugs. It provides visual reporting across projects and allows tracking metrics over time. Sonar supports PHP projects using tools like PHP_Codesniffer, PHPUnit, PHP Depend, and PHP Mess Detector. It can be set up with Maven and integrated with Hudson via a plugin or phpUnderControl via Ant tasks to run analysis as part of the continuous integration build process.
The document discusses using vfsStream to mock the filesystem in unit tests. vfsStream provides a virtual filesystem that uses PHP streams, allowing tests to manipulate files and directories without interacting with the real filesystem. It describes how to set up vfsStream, create and interact with virtual files and directories, and a vfsStream PHPUnit helper that simplifies its integration with PHPUnit tests.
Best 20 SEO Techniques To Improve Website Visibility In SERPPixlogix Infotech
Boost your website's visibility with proven SEO techniques! Our latest blog dives into essential strategies to enhance your online presence, increase traffic, and rank higher on search engines. From keyword optimization to quality content creation, learn how to make your site stand out in the crowded digital landscape. Discover actionable tips and expert insights to elevate your SEO game.
Ocean lotus Threat actors project by John Sitima 2024 (1).pptxSitimaJohn
Ocean Lotus cyber threat actors represent a sophisticated, persistent, and politically motivated group that poses a significant risk to organizations and individuals in the Southeast Asian region. Their continuous evolution and adaptability underscore the need for robust cybersecurity measures and international cooperation to identify and mitigate the threats posed by such advanced persistent threat groups.
Generating privacy-protected synthetic data using Secludy and MilvusZilliz
During this demo, the founders of Secludy will demonstrate how their system utilizes Milvus to store and manipulate embeddings for generating privacy-protected synthetic data. Their approach not only maintains the confidentiality of the original data but also enhances the utility and scalability of LLMs under privacy constraints. Attendees, including machine learning engineers, data scientists, and data managers, will witness first-hand how Secludy's integration with Milvus empowers organizations to harness the power of LLMs securely and efficiently.
HCL Notes and Domino License Cost Reduction in the World of DLAUpanagenda
Webinar Recording: https://www.panagenda.com/webinars/hcl-notes-and-domino-license-cost-reduction-in-the-world-of-dlau/
The introduction of DLAU and the CCB & CCX licensing model caused quite a stir in the HCL community. As a Notes and Domino customer, you may have faced challenges with unexpected user counts and license costs. You probably have questions on how this new licensing approach works and how to benefit from it. Most importantly, you likely have budget constraints and want to save money where possible. Don’t worry, we can help with all of this!
We’ll show you how to fix common misconfigurations that cause higher-than-expected user counts, and how to identify accounts which you can deactivate to save money. There are also frequent patterns that can cause unnecessary cost, like using a person document instead of a mail-in for shared mailboxes. We’ll provide examples and solutions for those as well. And naturally we’ll explain the new licensing model.
Join HCL Ambassador Marc Thomas in this webinar with a special guest appearance from Franz Walder. It will give you the tools and know-how to stay on top of what is going on with Domino licensing. You will be able lower your cost through an optimized configuration and keep it low going forward.
These topics will be covered
- Reducing license cost by finding and fixing misconfigurations and superfluous accounts
- How do CCB and CCX licenses really work?
- Understanding the DLAU tool and how to best utilize it
- Tips for common problem areas, like team mailboxes, functional/test users, etc
- Practical examples and best practices to implement right away
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...alexjohnson7307
Predictive maintenance is a proactive approach that anticipates equipment failures before they happen. At the forefront of this innovative strategy is Artificial Intelligence (AI), which brings unprecedented precision and efficiency. AI in predictive maintenance is transforming industries by reducing downtime, minimizing costs, and enhancing productivity.
Main news related to the CCS TSI 2023 (2023/1695)Jakub Marek
An English 🇬🇧 translation of a presentation to the speech I gave about the main changes brought by CCS TSI 2023 at the biggest Czech conference on Communications and signalling systems on Railways, which was held in Clarion Hotel Olomouc from 7th to 9th November 2023 (konferenceszt.cz). Attended by around 500 participants and 200 on-line followers.
The original Czech 🇨🇿 version of the presentation can be found here: https://www.slideshare.net/slideshow/hlavni-novinky-souvisejici-s-ccs-tsi-2023-2023-1695/269688092 .
The videorecording (in Czech) from the presentation is available here: https://youtu.be/WzjJWm4IyPk?si=SImb06tuXGb30BEH .
This presentation provides valuable insights into effective cost-saving techniques on AWS. Learn how to optimize your AWS resources by rightsizing, increasing elasticity, picking the right storage class, and choosing the best pricing model. Additionally, discover essential governance mechanisms to ensure continuous cost efficiency. Whether you are new to AWS or an experienced user, this presentation provides clear and practical tips to help you reduce your cloud costs and get the most out of your budget.
Taking AI to the Next Level in Manufacturing.pdfssuserfac0301
Read Taking AI to the Next Level in Manufacturing to gain insights on AI adoption in the manufacturing industry, such as:
1. How quickly AI is being implemented in manufacturing.
2. Which barriers stand in the way of AI adoption.
3. How data quality and governance form the backbone of AI.
4. Organizational processes and structures that may inhibit effective AI adoption.
6. Ideas and approaches to help build your organization's AI strategy.
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAUpanagenda
Webinar Recording: https://www.panagenda.com/webinars/hcl-notes-und-domino-lizenzkostenreduzierung-in-der-welt-von-dlau/
DLAU und die Lizenzen nach dem CCB- und CCX-Modell sind für viele in der HCL-Community seit letztem Jahr ein heißes Thema. Als Notes- oder Domino-Kunde haben Sie vielleicht mit unerwartet hohen Benutzerzahlen und Lizenzgebühren zu kämpfen. Sie fragen sich vielleicht, wie diese neue Art der Lizenzierung funktioniert und welchen Nutzen sie Ihnen bringt. Vor allem wollen Sie sicherlich Ihr Budget einhalten und Kosten sparen, wo immer möglich. Das verstehen wir und wir möchten Ihnen dabei helfen!
Wir erklären Ihnen, wie Sie häufige Konfigurationsprobleme lösen können, die dazu führen können, dass mehr Benutzer gezählt werden als nötig, und wie Sie überflüssige oder ungenutzte Konten identifizieren und entfernen können, um Geld zu sparen. Es gibt auch einige Ansätze, die zu unnötigen Ausgaben führen können, z. B. wenn ein Personendokument anstelle eines Mail-Ins für geteilte Mailboxen verwendet wird. Wir zeigen Ihnen solche Fälle und deren Lösungen. Und natürlich erklären wir Ihnen das neue Lizenzmodell.
Nehmen Sie an diesem Webinar teil, bei dem HCL-Ambassador Marc Thomas und Gastredner Franz Walder Ihnen diese neue Welt näherbringen. Es vermittelt Ihnen die Tools und das Know-how, um den Überblick zu bewahren. Sie werden in der Lage sein, Ihre Kosten durch eine optimierte Domino-Konfiguration zu reduzieren und auch in Zukunft gering zu halten.
Diese Themen werden behandelt
- Reduzierung der Lizenzkosten durch Auffinden und Beheben von Fehlkonfigurationen und überflüssigen Konten
- Wie funktionieren CCB- und CCX-Lizenzen wirklich?
- Verstehen des DLAU-Tools und wie man es am besten nutzt
- Tipps für häufige Problembereiche, wie z. B. Team-Postfächer, Funktions-/Testbenutzer usw.
- Praxisbeispiele und Best Practices zum sofortigen Umsetzen
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfChart Kalyan
A Mix Chart displays historical data of numbers in a graphical or tabular form. The Kalyan Rajdhani Mix Chart specifically shows the results of a sequence of numbers over different periods.
Trusted Execution Environment for Decentralized Process MiningLucaBarbaro3
Presentation of the paper "Trusted Execution Environment for Decentralized Process Mining" given during the CAiSE 2024 Conference in Cyprus on June 7, 2024.
Driving Business Innovation: Latest Generative AI Advancements & Success StorySafe Software
Are you ready to revolutionize how you handle data? Join us for a webinar where we’ll bring you up to speed with the latest advancements in Generative AI technology and discover how leveraging FME with tools from giants like Google Gemini, Amazon, and Microsoft OpenAI can supercharge your workflow efficiency.
During the hour, we’ll take you through:
Guest Speaker Segment with Hannah Barrington: Dive into the world of dynamic real estate marketing with Hannah, the Marketing Manager at Workspace Group. Hear firsthand how their team generates engaging descriptions for thousands of office units by integrating diverse data sources—from PDF floorplans to web pages—using FME transformers, like OpenAIVisionConnector and AnthropicVisionConnector. This use case will show you how GenAI can streamline content creation for marketing across the board.
Ollama Use Case: Learn how Scenario Specialist Dmitri Bagh has utilized Ollama within FME to input data, create custom models, and enhance security protocols. This segment will include demos to illustrate the full capabilities of FME in AI-driven processes.
Custom AI Models: Discover how to leverage FME to build personalized AI models using your data. Whether it’s populating a model with local data for added security or integrating public AI tools, find out how FME facilitates a versatile and secure approach to AI.
We’ll wrap up with a live Q&A session where you can engage with our experts on your specific use cases, and learn more about optimizing your data workflows with AI.
This webinar is ideal for professionals seeking to harness the power of AI within their data management systems while ensuring high levels of customization and security. Whether you're a novice or an expert, gain actionable insights and strategies to elevate your data processes. Join us to see how FME and AI can revolutionize how you work with data!
Building Production Ready Search Pipelines with Spark and MilvusZilliz
Spark is the widely used ETL tool for processing, indexing and ingesting data to serving stack for search. Milvus is the production-ready open-source vector database. In this talk we will show how to use Spark to process unstructured data to extract vector representations, and push the vectors to Milvus vector database for search serving.
Digital Marketing Trends in 2024 | Guide for Staying AheadWask
https://www.wask.co/ebooks/digital-marketing-trends-in-2024
Feeling lost in the digital marketing whirlwind of 2024? Technology is changing, consumer habits are evolving, and staying ahead of the curve feels like a never-ending pursuit. This e-book is your compass. Dive into actionable insights to handle the complexities of modern marketing. From hyper-personalization to the power of user-generated content, learn how to build long-term relationships with your audience and unlock the secrets to success in the ever-shifting digital landscape.
Digital Marketing Trends in 2024 | Guide for Staying Ahead
PHP Forum Paris 2012: Magic behind the numbers. Software metrics in practice
1. Magic
behind
the
numbers
So.ware
metrics
in
prac&ce
Sebas&an
Marek,
So.ware
Architect
2. • a
Pole
living
in
Sheffield
• over
12
years
in
development
• Pascal,
C++,
PHP,
perl,
python,
Java
• co-‐author
of
2
PHP
books
• big
fan
of
process
automa&on
• TDD
and
CI
• occasionally
contributes
to
open
source
projects
• wants
to
be
a
knight
@proofek
3. • What
I
will
be
talking
about
• Code
metrics
• Design
metrics
• What
I
will
not
be
talking
about
• Project
metrics
Agenda
6. “It is the mapping of
a particular
characteristic
of a measured entity
to a numerical value”
Source: Object-Oriented Metrics
in Practice
What
is
a
metric?
7. “Good design quality metrics are not
necessarily indicative of good designs.
Likewise, bad design quality metrics are
not necessarily indicative of bad
designs”
Source: Jdepend Docs
So.ware
design
8. • Obsolete
documenta&on
• Convoluted
design
• Intensive
patch
mechanism
(hacking)
• Large
size
• Severe
duplica&on
• Obsolete
parts
(dead
code)
• Long
build
&mes
• Loss
of
original
developers
System
maintenance
9. • CLOC
–
comment
lines
of
code
• ELOC
–
executable
lines
of
code
• LOC
–
lines
of
code
• NCLOC
–
non
comment
lines
of
code
• NOP
–
number
of
packages
• NOC
–
number
of
classes
• NOM
–
number
of
methods
Simple
metrics
29. “NPATH is an objective measure of
software complexity related to
the ease with which software
can be comprehensively tested”
Edgar H. Sibley
NPATH
–
acyclic
execu&on
path
complexity
30. expressions Number of && and || operators in expression
if NP(<if-range>)+NP(<expr>)+1
if-else NP(<if-range>)+NP(<else-range>)+NP(<expr>)
while NP(<while-range>)+NP(<expr>)+1
for NP(<for-range>)+NP(<expr1>)+NP(<expr2>)+
NP(<expr3>)+1
break 1
continue 1
return 1
sequential 1
function call 1
NPATH
–
acyclic
execu&on
path
complexity
31. class Foo {
public function example() {
if ($a == $b) {
if ($a1 == $b1) {
fiddle();
} else {
fiddle();
}
}
if ($e == $f && $g == $z) {
for ($n = 0; $n < $h; $n++) {
fiddle();
}
}
return true;
}
}
NPATH
–
example
32. class Foo {
public function example() {
if ($a == $b) {
if ($a1 == $b1) {
fiddle();
} else { 3
fiddle();
}
}
if ($e == $f && $g == $z) {
for ($n = 0; $n < $h; $n++) {
fiddle(); 4
}
}
return true; 1
}
}
NPATH
–
example
48. “We
believe
that
soIware
metrics,
in
general,
are
just
tools.
No
single
metric
can
tell
the
whole
story;
it’s
just
one
more
data
point.
“
“Metrics
are
meant
to
be
used
by
developers,
not
the
other
way
around
–
the
metric
should
work
for
you,
you
should
not
have
to
work
for
the
metric.
“
“Metrics
should
never
be
an
end
unto
themselves.
Metrics
are
meant
to
help
you
think,
not
to
do
the
thinking
for
you.”
• Alberto
Savoia
Summary