SlideShare a Scribd company logo
Pipeline Oriented
Programming
(DotNext 2021)
@ScottWlaschin
fsharpforfunandprofit.com/pipeline
Code examples will be in C# and F#
What is
“Pipeline-oriented Programming"?
Part I
Object-oriented
Arrows go in all directions
Pipeline-oriented
All arrows go left to right
A pipeline-oriented web backend
One directional flow,
even with branching
What are the benefits of
a pipeline-oriented approach?
Benefits
• Pipelines encourage composability
• Pipelines follow good design principles
• Pipelines are easier to maintain
• Pipelines make testing easier
• Pipelines fit well with modern architectures
– E.g. Onion/Clean/Hexagonal, etc
Benefit 1:
Pipelines encourage composability
Composable == “Like Lego”
Connect two pieces together and
get another "piece" that can still
be connected
You don't need to create a
special adapter to make
connections.
Component Component
Component
Pipelines composition
Pipelines encourage you to design so that:
• Any pieces can be connected
• You don’t need special adapters
If you do this, you get nice composable components
Bigger Component
Sub-
Component
Sub-
Component
Sub-
Component
Sub-components composed
into a new bigger unit
Benefit 2:
Pipelines follow
good design principles
Many design patterns work naturally
with a pipeline-oriented approach
Single responsibility principle
Component
Can't get more single responsibility than this!
Open/Closed principle
You could be able to add new functionality (“open for extension”)
without changing existing code (“closed for modification”)
New
Behavior
Component Component Component
Extension
Not changed
Strategy Pattern
Parameterized
Component
Component Component Component
Decorator Pattern
Decorator
Decorator
Original Component
Decorated Component
Decorator Pattern
Decorator
Decorator
"decorated" component works just like the original one
Benefit 3:
Pipelines are easier to maintain
This is easier to maintain
This is harder to maintain
Object-oriented: Real-world dependency graph
Multiple circular dependencies 
Arrows go in all directions
Pipeline-oriented: Real-world dependency graph
All arrows go left to right 
Same functionality
as the OO example
More benefits:
• Pipelines make testing easier
• Pipelines fit well with modern architectures
Pipeline-oriented Programming
in practice
Part 2
var count = 0;
foreach (var i in list) {
var j = i + 2;
if (j > 3)
{
count++;
}
}
return count;
Here is a
traditional
for- loop in C#
return list
.Select(x => x + 2)
.Where(x => x > 3)
.Count();
Here is the same code
using LINQ in C#
return list
.Select(x => x + 2)
.Where(x => x > 3)
.Count();
Benefit: Composability
The LINQ components have been designed
to fit together in many different ways
You could write your code this way too!
return list
.Select(x => x + 2)
.Where(x => x > 3)
.Count();
Benefit: Single responsibility
Each LINQ component does one thing only.
Easier to understand and test
return list
.Select(x => x + 2)
.Where(x => x > 3)
.Where(x => x < 10)
.Count();
Benefit: open for extension
It is easy to add new steps
in the pipeline without
touching anything else
list
|> List.map (fun x -> x + 2)
|> List.filter (fun x -> x > 3)
|> List.length
Here is the same code
using F#
list
|> List.map (fun x -> x + 2)
|> List.filter (fun x -> x > 3)
|> List.length
Here is the same code
using F#
Immutability and pipelines
If you have immutable data
you will probably need a pipeline
// Person is immutable
var p = new Person("Scott","s@example.com",21);
var p2 = p.WithName("Tom");
var p3 = p2.WithEmail("tom@example.com");
var p4 = p3.WithAge(42);
When each call returns
a new object, it gets
repetitive
// Person is immutable
var p = new Person("Scott","s@example.com",21);
p
.WithName("Tom")
.WithEmail("tom@example.com")
.WithAge(42); Pipelines make it
look nicer
Pipes vs. Extension methods
Pipes are more general
int Add1(int input) { return input + 1; }
int Square(int input) { return input * input; }
int Double(int input) { return input * 2; }
int Add1(int input) { return input + 1; }
int Square(int input) { return input * input; }
int Double(int input) { return input * 2; }
int NestedCalls()
{
return Double(Square(Add1(5)));
}
How can I make
this look nicer?
How about a
pipeline?
return 5
.Add1
.Square
.Double;
But this doesn't work,
because these are not
extension methods.
public static TOut Pipe<TIn, TOut>
(this TIn input, Func<TIn, TOut> fn)
{
return fn(input);
} Introducing "Pipe"
public static TOut Pipe<TIn, TOut>
(this TIn input, Func<TIn, TOut> fn)
{
return fn(input);
}
public static TOut Pipe<TIn, TOut>
(this TIn input, Func<TIn, TOut> fn)
{
return fn(input);
}
return 5
.Pipe(Add1)
.Pipe(Square)
.Pipe(Double);
And now we can create
a pipeline out of any*
existing functions
int Add(int i, int j) { return i + j; }
int Times(int i, int j) { return i * j; }
A two parameter
function
public static TOut Pipe<TIn, TParam, TOut>
(this TIn input, Func<TIn, TParam, TOut> fn, TParam p1)
{
return fn(input, p1);
}
int Add(int i, int j) { return i + j; }
int Times(int i, int j) { return i * j; }
public int PipelineWithParams()
{
return 5
.Pipe(Add, 1)
.Pipe(Times, 2);
}
We can now create a
pipeline out of any
existing functions
with parameters
public int PipelineWithParams()
{
return 5
.Pipe(Add, 1)
.Pipe(Times, 2);
}
Why bother?
Because now we get all the
benefits of a pipeline
public int PipelineWithParams()
{
return 5
.Pipe(Add, 1)
.Pipe(Times, 2)
.Pipe(Add, 42)
.Pipe(Square);
}
Why bother?
Because now we get all the
benefits of a pipeline,
such as adding things to
the pipeline easily
(diffs look nicer too!)
let add x y = x + y
let times x y = x * y
5
|> add 1
|> times 2
And here's what the same
code looks like in F#
F# uses pipelines
everywhere!
Pipes vs. Extension methods,
Part 2
Extension methods cannot be parameters
int StrategyPattern(... list, ... injectedFn) {
return list
.Select(x => x + 2)
.injectedFn
.Where(x => x > 3)
.Count();
} We cant use a function
parameter as an extension
method

My "strategy"
int StrategyPattern(... list, ... injectedFn) {
return list
.Select(x => x + 2)
.Pipe(injectedFn)
.Where(x => x > 3)
.Count();
} But we can use a function
parameter in a pipeline!

Pipelines in practice
Part 3:
Three demonstrations
• Pipeline-oriented Roman Numerals
• Pipeline-oriented FizzBuzz
• Pipeline-oriented web API
Roman Numerals
To Roman Numerals
Task: convert an integer to roman numerals
• 5 => "V"
• 12 => "XII"
• 107 => "CVII"
To Roman Numerals
To Roman Numerals
• Use the "tally" approach
– Start with N copies of "I"
– Replace five "I"s with a "V"
– Replace two "V"s with a "X"
– Replace five "X"s with a "L"
– Replace two "L"s with a "C"
– etc
To Roman Numerals
number
etc
Replicate "I"
Replace_IIIII_V
Replace_VV_X
Replace_XXXXX_L
string ToRomanNumerals(int n)
{
return new String('I', n)
.Replace("IIIII", "V")
.Replace("VV", "X")
.Replace("XXXXX", "L")
.Replace("LL", "C");
}
C# example
string ToRomanNumerals(int n)
{
return new String('I', n)
.Replace("IIIII", "V")
.Replace("VV", "X")
.Replace("XXXXX", "L")
.Replace("LL", "C");
}
C# example
.Replace("LL", "C")
.Replace("VIIII", "IX")
.Replace("IIII", "IV")
.Replace("LXXXX", "XC")
.Replace("XXXX", "XL");
}
Extend functionality
without touching
existing code
let toRomanNumerals n =
String.replicate n "I"
|> replace "IIIII" "V"
|> replace "VV" "X"
|> replace "XXXXX" "L"
|> replace "LL" "C"
// special cases
|> replace "VIIII" "IX"
|> replace "IIII" "IV"
|> replace "LXXXX" "XC"
|> replace "XXXX" "XL"
F# example
FizzBuzz
FizzBuzz definition
• Write a program that prints the numbers
from 1 to N
• But:
– For multiples of three print "Fizz" instead
– For multiples of five print "Buzz" instead
– For multiples of both three and five print
"FizzBuzz" instead.
for (var i = 1; i <= 30; i++)
{
if (i % 15 == 0)
Console.Write("FizzBuzz,");
else if (i % 3 == 0)
Console.Write("Fizz,");
else if (i % 5 == 0)
Console.Write("Buzz,");
else
Console.Write($"{i},");
}
C# example
for (var i = 1; i <= 30; i++)
{
if (i % 15 == 0)
Console.Write("FizzBuzz,");
else if (i % 3 == 0)
Console.Write("Fizz,");
else if (i % 5 == 0)
Console.Write("Buzz,");
else
Console.Write($"{i},");
}
C# example
Pipeline implementation
number Handle 15 case
Pipeline implementation
Handle 3 case
number Handle 15 case
Pipeline implementation
Handle 3 case
Handle 5 case
number Handle 15 case
Pipeline implementation
Handle 3 case
Handle 5 case
number
Answer
Handle 15 case
Final step
number Handle case
Processed
(e.g. "Fizz", "Buzz")
Unprocessed
(e.g. 2, 7, 13)
record FizzBuzzData(string Output, int Number);
record FizzBuzzData(string Output, int Number);
static FizzBuzzData Handle(
this FizzBuzzData data,
int divisor, // e.g. 3, 5, etc
string output) // e.g. "Fizz", "Buzz", etc
{
if (data.Output != "")
return data; // already processed
if (data.Number % divisor != 0)
return data; // not applicable
return new FizzBuzzData(output, data.Number);
}
record FizzBuzzData(string Output, int Number);
static FizzBuzzData Handle(
this FizzBuzzData data,
int divisor, // e.g. 3, 5, etc
string output) // e.g. "Fizz", "Buzz", etc
{
if (data.Output != "")
return data; // already processed
if (data.Number % divisor != 0)
return data; // not applicable
return new FizzBuzzData(output, data.Number);
}
Extension method
static string FizzBuzzPipeline(int i)
{
return
new FizzBuzzData("", i)
.Handle(15, "FizzBuzz")
.Handle(3, "Fizz")
.Handle(5, "Buzz")
.FinalStep();
}
static void FizzBuzz()
{
var words = Enumerable.Range(1, 30)
.Select(FizzBuzzPipeline);
Console.WriteLine(string.Join(",", words));
}
Demo:
FizzBuzz in F#
Extensions, Decorations and
Parallelization
A pipeline-oriented web API
HttpContext Web Component
Not Handled
Handled
(async) HttpContext
null
HttpContext
GET
Define a component
matches verb
doesn't match verb
HttpContext
route "/hello"
Define a component
matches route
doesn't match route
HttpContext
setStatusCode 200
Define a component
Always succeeds
HttpContext
GET route "/hello"
>=>
A special pipe for web
components
setStatusCode 200
>=>
Are you wondering how do we compose these?
Easy!
choose [
]
Picks first component
that succeeds
Define a new component
choose [
GET >=> route "/hello" >=> OK "Hello"
GET >=> route "/goodbye" >=> OK "Goodbye"
]
Pick first path
that succeeds
choose [
GET >=> route "/hello" >=> OK "Hello"
GET >=> route "/goodbye" >=> OK "Goodbye"
POST >=> route "/bad" >=> BAD_REQUEST
]
All the benefits of pipeline-oriented programming
choose [
GET >=> route "/hello" >=> OK "Hello"
GET >=> route "/goodbye" >=> OK "Goodbye"
POST
>=> route "/user"
>=> mustBeLoggedIn UNAUTHORIZED
>=> requiresRole "Admin"
// etc
]
All the benefits of pipeline-oriented programming
choose [
GET >=> route "/hello" >=> OK "Hello"
GET >=> route "/goodbye" >=> OK "Goodbye"
POST
>=> route "/user"
>=> mustBeLoggedIn UNAUTHORIZED
>=> requiresRole "Admin"
// etc
]
All the benefits of pipeline-oriented programming
Demo:
A pipeline oriented web app
For more on the web framework I'm using,
search the internet for "F# Giraffe"
Testing and architecture
Part 4
Benefit 4:
Pipelines encourage
good architecture
The "onion" architecture
Core domain is pure, and all I/O is at the edges
Core
domain
Domain Logic
I/O I/O
The "onion" architecture

Core domain is pure, and all I/O is at the edges
In a well-designed pipeline,
all I/O is at the edges.
Easy to enforce this with a pipeline-oriented approach
Database Database
Load data
Process it
Save it
I/O in the middle of a pipeline
Keep them separate
Benefit 5:
Easier to test
Deterministic
Non-deterministic Non-deterministic
This makes testing easy!
In Conclusion
Why bother?
• Reusable components
• Understandable – data flows in one direction
• Extendable – add new parts without touching old
code
• Testable – parts can be tested in isolation
• A different way of thinking –
it's good for your brain to learn new things!
Databases
Object-oriented
programmng
Pipeline-oriented
programming
Domain-driven
design
Does pipeline-oriented programming
work for every situation? No!
But it should be part of your toolkit
Pipeline Oriented Programming
– Slides and video will be posted at
• fsharpforfunandprofit.com/pipeline
Related talks
– "The Power of Composition"
• fsharpforfunandprofit.com/composition
– “Railway Oriented Programming"
• fsharpforfunandprofit.com/rop
Thanks!
Twitter: @ScottWlaschin

More Related Content

What's hot (20)

PDF
The Power of Composition
Scott Wlaschin
 
PDF
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Scott Wlaschin
 
PDF
Domain Driven Design with the F# type System -- NDC London 2013
Scott Wlaschin
 
PDF
The Power of Composition (NDC Oslo 2020)
Scott Wlaschin
 
PDF
Deep dive into Coroutines on JVM @ KotlinConf 2017
Roman Elizarov
 
PDF
Python recursion
Prof. Dr. K. Adisesha
 
PDF
Domain Modeling in a Functional World
Debasish Ghosh
 
PDF
Functional Programming Patterns (BuildStuff '14)
Scott Wlaschin
 
PDF
The Functional Programming Toolkit (NDC Oslo 2019)
Scott Wlaschin
 
PDF
Unit Test and TDD
Viet Tran
 
PDF
The lazy programmer's guide to writing thousands of tests
Scott Wlaschin
 
PPTX
TypeScript Overview
Aniruddha Chakrabarti
 
PPTX
Why TypeScript?
FITC
 
PPTX
Typescript ppt
akhilsreyas
 
PPTX
Clean code slide
Anh Huan Miu
 
PDF
TypeScript: coding JavaScript without the pain
Sander Mak (@Sander_Mak)
 
PPTX
Control structures in java
VINOTH R
 
PDF
The Power Of Composition (DotNext 2019)
Scott Wlaschin
 
PPTX
Functional Programming in JavaScript by Luis Atencio
Luis Atencio
 
PDF
Domain Modeling Made Functional (KanDDDinsky 2019)
Scott Wlaschin
 
The Power of Composition
Scott Wlaschin
 
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Scott Wlaschin
 
Domain Driven Design with the F# type System -- NDC London 2013
Scott Wlaschin
 
The Power of Composition (NDC Oslo 2020)
Scott Wlaschin
 
Deep dive into Coroutines on JVM @ KotlinConf 2017
Roman Elizarov
 
Python recursion
Prof. Dr. K. Adisesha
 
Domain Modeling in a Functional World
Debasish Ghosh
 
Functional Programming Patterns (BuildStuff '14)
Scott Wlaschin
 
The Functional Programming Toolkit (NDC Oslo 2019)
Scott Wlaschin
 
Unit Test and TDD
Viet Tran
 
The lazy programmer's guide to writing thousands of tests
Scott Wlaschin
 
TypeScript Overview
Aniruddha Chakrabarti
 
Why TypeScript?
FITC
 
Typescript ppt
akhilsreyas
 
Clean code slide
Anh Huan Miu
 
TypeScript: coding JavaScript without the pain
Sander Mak (@Sander_Mak)
 
Control structures in java
VINOTH R
 
The Power Of Composition (DotNext 2019)
Scott Wlaschin
 
Functional Programming in JavaScript by Luis Atencio
Luis Atencio
 
Domain Modeling Made Functional (KanDDDinsky 2019)
Scott Wlaschin
 

Similar to Pipeline oriented programming (20)

PPTX
Tech Days Paris Intoduction F# and Collective Intelligence
Robert Pickering
 
PDF
Functional Programming in F#
Dmitri Nesteruk
 
PPTX
Getting+started+with+f#+web+development
dmohl
 
PPTX
TechDaysNL 2015 - F# for C# Developers
Ronald Harmsen
 
PPTX
FP Day 2011 - Turning to the Functional Side (using C# & F#)
Phillip Trelford
 
PPTX
Evolution of Patterns
Chris Eargle
 
PPTX
Mixing functional programming approaches in an object oriented language
Mark Needham
 
PPTX
Functional programming
PiumiPerera7
 
PPTX
Framework Design Guidelines For Brussels Users Group
brada
 
PPTX
Domain Modeling & Full-Stack Web Development F#
Kevin Avignon
 
PPTX
Functional Programming
Ryan Riley
 
PPTX
.Net Framework 2 fundamentals
Harshana Weerasinghe
 
PPT
For Beginners - C#
Snehal Harawande
 
PPTX
F# Tutorial @ QCon
Tomas Petricek
 
PPT
DotNet Introduction
Wei Sun
 
PPTX
London F-Sharp User Group : Don Syme on F# - 09/09/2010
Skills Matter
 
PPTX
How Functional Programming Made Me A Better Developer
Cameron Presley
 
PPT
Framework Design Guidelines
Mohamed Meligy
 
ODP
F# 101
Chris Alcock
 
Tech Days Paris Intoduction F# and Collective Intelligence
Robert Pickering
 
Functional Programming in F#
Dmitri Nesteruk
 
Getting+started+with+f#+web+development
dmohl
 
TechDaysNL 2015 - F# for C# Developers
Ronald Harmsen
 
FP Day 2011 - Turning to the Functional Side (using C# & F#)
Phillip Trelford
 
Evolution of Patterns
Chris Eargle
 
Mixing functional programming approaches in an object oriented language
Mark Needham
 
Functional programming
PiumiPerera7
 
Framework Design Guidelines For Brussels Users Group
brada
 
Domain Modeling & Full-Stack Web Development F#
Kevin Avignon
 
Functional Programming
Ryan Riley
 
.Net Framework 2 fundamentals
Harshana Weerasinghe
 
For Beginners - C#
Snehal Harawande
 
F# Tutorial @ QCon
Tomas Petricek
 
DotNet Introduction
Wei Sun
 
London F-Sharp User Group : Don Syme on F# - 09/09/2010
Skills Matter
 
How Functional Programming Made Me A Better Developer
Cameron Presley
 
Framework Design Guidelines
Mohamed Meligy
 
F# 101
Chris Alcock
 
Ad

More from Scott Wlaschin (16)

PDF
Domain Modeling Made Functional (DevTernity 2022)
Scott Wlaschin
 
PDF
Building confidence in concurrent code with a model checker: TLA+ for program...
Scott Wlaschin
 
PDF
Reinventing the Transaction Script (NDC London 2020)
Scott Wlaschin
 
PDF
The Functional Programmer's Toolkit (NDC London 2019)
Scott Wlaschin
 
PDF
Four Languages From Forty Years Ago (NewCrafts 2019)
Scott Wlaschin
 
PDF
Four Languages From Forty Years Ago
Scott Wlaschin
 
PDF
F# for C# Programmers
Scott Wlaschin
 
PDF
Designing with capabilities (DDD-EU 2017)
Scott Wlaschin
 
PDF
Thirteen ways of looking at a turtle
Scott Wlaschin
 
PDF
Designing with Capabilities
Scott Wlaschin
 
PDF
Dr Frankenfunctor and the Monadster
Scott Wlaschin
 
PDF
Enterprise Tic-Tac-Toe
Scott Wlaschin
 
PDF
An introduction to property based testing
Scott Wlaschin
 
PDF
Swift vs. Language X
Scott Wlaschin
 
PDF
Doge-driven design
Scott Wlaschin
 
PDF
The Theory of Chains
Scott Wlaschin
 
Domain Modeling Made Functional (DevTernity 2022)
Scott Wlaschin
 
Building confidence in concurrent code with a model checker: TLA+ for program...
Scott Wlaschin
 
Reinventing the Transaction Script (NDC London 2020)
Scott Wlaschin
 
The Functional Programmer's Toolkit (NDC London 2019)
Scott Wlaschin
 
Four Languages From Forty Years Ago (NewCrafts 2019)
Scott Wlaschin
 
Four Languages From Forty Years Ago
Scott Wlaschin
 
F# for C# Programmers
Scott Wlaschin
 
Designing with capabilities (DDD-EU 2017)
Scott Wlaschin
 
Thirteen ways of looking at a turtle
Scott Wlaschin
 
Designing with Capabilities
Scott Wlaschin
 
Dr Frankenfunctor and the Monadster
Scott Wlaschin
 
Enterprise Tic-Tac-Toe
Scott Wlaschin
 
An introduction to property based testing
Scott Wlaschin
 
Swift vs. Language X
Scott Wlaschin
 
Doge-driven design
Scott Wlaschin
 
The Theory of Chains
Scott Wlaschin
 
Ad

Recently uploaded (20)

PPTX
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 
PDF
Thread In Android-Mastering Concurrency for Responsive Apps.pdf
Nabin Dhakal
 
PDF
vMix Pro 28.0.0.42 Download vMix Registration key Bundle
kulindacore
 
PPTX
Agentic Automation Journey Series Day 2 – Prompt Engineering for UiPath Agents
klpathrudu
 
PPTX
Tally software_Introduction_Presentation
AditiBansal54083
 
PPTX
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 
PDF
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
PDF
Powering GIS with FME and VertiGIS - Peak of Data & AI 2025
Safe Software
 
PPTX
Hardware(Central Processing Unit ) CU and ALU
RizwanaKalsoom2
 
PDF
SAP Firmaya İade ABAB Kodları - ABAB ile yazılmıl hazır kod örneği
Salih Küçük
 
PDF
HiHelloHR – Simplify HR Operations for Modern Workplaces
HiHelloHR
 
PDF
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pdf
Varsha Nayak
 
PPTX
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
PDF
Mobile CMMS Solutions Empowering the Frontline Workforce
CryotosCMMSSoftware
 
PDF
The 5 Reasons for IT Maintenance - Arna Softech
Arna Softech
 
PDF
Alarm in Android-Scheduling Timed Tasks Using AlarmManager in Android.pdf
Nabin Dhakal
 
PDF
Online Queue Management System for Public Service Offices in Nepal [Focused i...
Rishab Acharya
 
PDF
Alexander Marshalov - How to use AI Assistants with your Monitoring system Q2...
VictoriaMetrics
 
PPTX
ChiSquare Procedure in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
Beyond Binaries: Understanding Diversity and Allyship in a Global Workplace -...
Imma Valls Bernaus
 
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 
Thread In Android-Mastering Concurrency for Responsive Apps.pdf
Nabin Dhakal
 
vMix Pro 28.0.0.42 Download vMix Registration key Bundle
kulindacore
 
Agentic Automation Journey Series Day 2 – Prompt Engineering for UiPath Agents
klpathrudu
 
Tally software_Introduction_Presentation
AditiBansal54083
 
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pptx
Varsha Nayak
 
Digger Solo: Semantic search and maps for your local files
seanpedersen96
 
Powering GIS with FME and VertiGIS - Peak of Data & AI 2025
Safe Software
 
Hardware(Central Processing Unit ) CU and ALU
RizwanaKalsoom2
 
SAP Firmaya İade ABAB Kodları - ABAB ile yazılmıl hazır kod örneği
Salih Küçük
 
HiHelloHR – Simplify HR Operations for Modern Workplaces
HiHelloHR
 
Why Businesses Are Switching to Open Source Alternatives to Crystal Reports.pdf
Varsha Nayak
 
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
Mobile CMMS Solutions Empowering the Frontline Workforce
CryotosCMMSSoftware
 
The 5 Reasons for IT Maintenance - Arna Softech
Arna Softech
 
Alarm in Android-Scheduling Timed Tasks Using AlarmManager in Android.pdf
Nabin Dhakal
 
Online Queue Management System for Public Service Offices in Nepal [Focused i...
Rishab Acharya
 
Alexander Marshalov - How to use AI Assistants with your Monitoring system Q2...
VictoriaMetrics
 
ChiSquare Procedure in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Beyond Binaries: Understanding Diversity and Allyship in a Global Workplace -...
Imma Valls Bernaus
 

Pipeline oriented programming