SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
SoftwareEngineeringPrinciples
Softwareengineeringiswhathappenstoprogrammingwhenyouaddtimeand
otherprogrammers.
JaapGroeneveld-jGroeneveld.de
SoftwareEngineeringdealswiththe
challengesof
Communicationbetweenpeople
Communicationovertime
Changingrequirements
Tamingcomplexity
Cleancodeismoreabouthumansthanits
abouttech.
2
Whyinvestincleancode?
Minimizestimespendonreadingandunderstanding
Easiertogrowinthefuture
Lesshuntingforbugs
Easieronboarding.
=>MessycodeisTechnicaldebt.Youwillpayforitdowntheroad.
Messycodehastheuncannyabilitytoslowdownanydeveloperandmakehiswork
muchharder
3
4
BadCodesmells
Rigidity.Thesoftwareisdifficulttochange.Asmallchangecausesacascadeof
subsequentchanges.
Fragility.Thesoftwarebreaksinmanyplacesduetoasinglechange.
Immobility.Youcannotreusepartsofthecodeinotherprojectsbecauseofinvolved
risksandhigheffort.
Opacity.Thecodeishardtounderstand.
NeedlessComplexity.
NeedlessRepetition.
5
6
Principles
Keepitsimple,stupid(KISS)
Youarenʼtgonnaneedit(YAGNI)&PrematureOptimization
Don'trepeatyourself(DRY),singlesourceoftruth.
Don'tconfusesyntacticandsemanticdry-ness
Clearisbetterthanclever.
"Short"doesnotmeaneasytoreadandunderstand.
Avoid"magic"(unobviousbehavior).
Practiceconsistency.
Keepthetestsclean.
Ifyouletthetestsrot,thenyourcodewillrottoo.
Prepareforchange
AlwaysaskhowwillthiscodebehaveifXchanges(butkeepYAGNIinmind) 7
CleanCode-Namingguidelines
Namesareforhumans
Choosedescriptiveandunambiguousnames.
Makemeaningfuldistinction.
Usepronounceablenames.
Usesearchablenames.
Replacemagicnumberswithnamedconstants.
Avoidencodings.Don'tappendprefixesortypeinformation.
8
CleanCode-Namingguidelines
Example
d := 12 // elapsed time in days
// vs
elapsedTimeInDays := 12
9
CleanCode-Explanatoryvariables
func doSomething() {
defer StartTimer()()
// ...
}
// vs
func doSomething() {
stopTimer := StartTimer()
defer stopTimer()
// ...
}
Yesitsonelinemore...
10
CleanCode-Onewordperconcept
Havingaclearterminologyiskeytonotgetconfused.
Itsmoreimportanttobeconsistentthentobeperfect.
Examples?
11
CleanCode-Functionguidelines
Small.
Doone"thing".(SRP-SingleResponsibilityPrinciple)
Usedescriptivenames.
Havenosideeffectsifpossible.
Preferfewerarguments.
Don'tuseflagarguments.Splitmethodintoseveralindependentmethodsthatcanbe
calledfromtheclientwithouttheflag.
12
CleanCode-Commentingguidelines
Onlycommentthewhyandonlyifnotobvious
Alwaystrytoexplainyourselfincode.
Useasexplanationofintent.
Useasclarificationofcode.
Useaswarningofconsequences.
Don'tcommentoutcode.Justremove.
13
StepdownRule
Codeshouldbereadfromtoptobottomlikeanarticle.
Wewanttoreaditasasetof"paragraphs"eachdescribingthecurrentlevelofabstraction
andreferencingdown.
Placefunctionsinthedownwarddirection.
Declarevariablesclosetotheirusage.
Keeplinesshort.
Usewhitespacetoassociaterelatedthingsanddisassociateweaklyrelated.
SeealsoCohesion...
14
Stepdown-Example
package api
func CreatePost(w http.ResponseWriter, r *http.Request) {
post, err := getPostFromRequest(r)
if err != nil {...}
err = validatePost(post)
if err != nil { ... }
err = savePost(post)
if err != nil { ... }
http.WriteHeader(201)
}
func getPostFromRequest(r *http.Request) (Post, error) { ... }
func validatePost(post Post) error { ... }
func savePost(post Post) error { ... }
15
Lineofsight
Alignthehappypathtotheleft;youshould
quicklybeabletoscandownonecolumntosee
theexpectedexecutionflow
see src/lineofsight.go
https://medium.com/@matryer/line-of-sight-in-code-186dd7cdea88 16
Lineofsight
Donʼthidehappypathlogicinsideanestofindentedbraces
Exitearlyfromyourfunction
Avoidelsereturns;considerflippingtheifstatement
Putthehappyreturnstatementastheverylastline
Extractfunctionsandmethodstokeepbodiessmallandreadable
Ifyouneedbigindentedbodies,considergivingthemtheirownfunction
https://medium.com/@matryer/line-of-sight-in-code-186dd7cdea88 17
CleanCode-Dedicatedvaluetypesoverprimitivetype.
func getUserData(userID string) {}
// vs
type UserID string
func getUserData(userID UserID) {}
Impossibleto"accidentally"assignsomethingelse
EasytofindwhereUserIDsareused(searchabilitythroughstaticanalysis)
Preventspositionalproblemsinfunctions
Allowsaddingfunctionstothetype
see typed_primitives.go
18
CleanCode-Avoidimplicitdependency
type Processor struct {
SomeData []string
}
func (p *Processor) Init() {
p.SomeData = []string{"foo", "bar"}
}
func (p *Processor) Step() {
element := p.SomeData[0]
// do something with element
}
Youhavetoknowthatyouhavetocall Init beforecalling Step ,otherwisetheprogram
willcrash.
19
CleanCode-Avoidimplicitdependency
func NewProcessor(someData []string) *Processor {
return &Processor{
SomeData: someData,
}
}
type Processor struct {
SomeData []string
}
func (p *Processor) Step() {
element := p.SomeData[0]
// do something with element
}
See http.Request vs http.NewRequest
20
CleanCode-Avoidimplicitdependency
Anotherexample
func GetFoo(w http.ResponseWriter, r *http.Request) {
dataStore := r.Context().Value("FooDataStore").(FooDataStore)
all := dataStore.All()
_ = json.NewEncoder(w).Encode(all)
}
func main() {
err := http.ListenAndServe(":8080", http.HandlerFunc(GetFoo))
if err != nil {
log.Fatal(err)
}
}
panic:interfaceisnil
21
CleanCode-Avoidimplicitdependency
Basicallyifyouhaveto"know"somethingthatmightbeanimplicitdependency
func GetFoo(dataStore FooDataStore) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
all := dataStore.All()
_ = json.NewEncoder(w).Encode(all)
})
}
func main() {
dataStore = NewFooDataStore()
err := http.ListenAndServe(":8080", GetFoo(dataStore))
if err != nil {
log.Fatal(err)
}
}
Weenforcecorrectusage 22
SOLIDPrinciples
RobertC.Martin
SingleResponsibilityPrinciple
Open-ClosedPrinciple
LiskovSubstitutionPrinciple
InterfaceSegregationPrinciple
DependencyInversionPrinciple
23
SRP/Separationofconcerns
Abstraction,increasemodularity
Lessneedtoknow/workonmultiplepartsofthecode(cognitiveload)
Easiertochangeimplementations
Easiertoisolatebugs
Seealsolayerarchitecture,coupling
24
CouplingvsCohesion
25
CouplingvsCohesion
Couplingreferstotheinterdependenciesbetweenmodules,whilecohesiondescribes
howrelatedthefunctionswithinasinglemoduleare
Highcoupling,lowcohesion=>
Lowcoupling,highcohesion=>
26
27
Highcohesion
SeeStepdownRule
Declarevariablesclosetotheirusage.
Dependentfunctionsshouldbeclose.
Similarfunctionsshouldbeclose(samefileorsamepackage).
SRPishelpful
28
Lowcoupling
DependencyinversionPrinciple
High-levelmodulesshouldnotdependonlow-levelmodules.Bothshoulddepend
onabstractions(e.g.interfaces).
InterfaceSegregationPrinciple
Thebiggertheinterface,theweakertheabstraction
29
DependencyinjectioninGo
Implicitinterfaces
DuckTyping
Avoidcyclicdependencies
30
DependencyinjectioninGo
package cli
type DataStore interface {
GetData() model.Data
}
func Run(dataStore DataStore) {}
package persistence
type FileDataStore struct {}
func (s *FileDataStore) GetData() model.Data
package main
func main() {
dataStore := &persistence.FileDataStore{}
cli.Run(dataStore)
}
31
Literature
Lessonslearntfrom“TheCleanCode”
RottingdesignBINGO!
SixShadesofCoupling
TheforgottenrealmofCohesion
32

Contenu connexe

Similaire à Jaap Groeneveld - Software Engineering Principles

Jaap Groeneveld - Software Architecture
Jaap Groeneveld - Software ArchitectureJaap Groeneveld - Software Architecture
Jaap Groeneveld - Software ArchitectureJaapGroeneveld2
 
Camunda Chapter Hamburg - Surviving the hyperautomation low code bubble
Camunda Chapter Hamburg - Surviving the hyperautomation low code bubbleCamunda Chapter Hamburg - Surviving the hyperautomation low code bubble
Camunda Chapter Hamburg - Surviving the hyperautomation low code bubbleBernd Ruecker
 
2011.02.18 marco parenzan - case study. conversione di una applicazione for...
2011.02.18   marco parenzan - case study. conversione di una applicazione for...2011.02.18   marco parenzan - case study. conversione di una applicazione for...
2011.02.18 marco parenzan - case study. conversione di una applicazione for...Marco Parenzan
 
The art of computer programming
The art of computer programmingThe art of computer programming
The art of computer programmingClaude Sajous
 
The Smells Of Bad Design
The Smells Of Bad DesignThe Smells Of Bad Design
The Smells Of Bad DesignJames Peckham
 
The Smells Of Bad Design
The Smells Of Bad DesignThe Smells Of Bad Design
The Smells Of Bad Designguest446c0
 
CraftConf: Surviving the hyperautomation low code bubbl
CraftConf: Surviving the hyperautomation low code bubblCraftConf: Surviving the hyperautomation low code bubbl
CraftConf: Surviving the hyperautomation low code bubblBernd Ruecker
 
A taxonomy of obfuscating transformations
A taxonomy of obfuscating transformationsA taxonomy of obfuscating transformations
A taxonomy of obfuscating transformationsemanuele_nl
 
Cr java concept by vikas jagtap
Cr java  concept by vikas jagtapCr java  concept by vikas jagtap
Cr java concept by vikas jagtapVikas Jagtap
 
Privacy is a UX problem (David Dahl)
Privacy is a UX problem (David Dahl)Privacy is a UX problem (David Dahl)
Privacy is a UX problem (David Dahl)Future Insights
 
What frameworks can do for you – and what not (IPC14 SE)
What frameworks can do for you – and what not (IPC14 SE)What frameworks can do for you – and what not (IPC14 SE)
What frameworks can do for you – and what not (IPC14 SE)Robert Lemke
 
Structured Software Design
Structured Software DesignStructured Software Design
Structured Software DesignGiorgio Zoppi
 
London F-Sharp User Group : Don Syme on F# - 09/09/2010
London F-Sharp User Group : Don Syme on F# - 09/09/2010London F-Sharp User Group : Don Syme on F# - 09/09/2010
London F-Sharp User Group : Don Syme on F# - 09/09/2010Skills Matter
 
Sunny Tech 2019 - Craft Forever
Sunny Tech 2019 - Craft ForeverSunny Tech 2019 - Craft Forever
Sunny Tech 2019 - Craft ForeverCyrille Martraire
 
A Gentle introduction to microservices
A Gentle introduction to microservicesA Gentle introduction to microservices
A Gentle introduction to microservicesGianluca Padovani
 
Androides y Mazmorras. Part I (dungeons & robots)
Androides y Mazmorras. Part I (dungeons & robots)Androides y Mazmorras. Part I (dungeons & robots)
Androides y Mazmorras. Part I (dungeons & robots)Jorge Barroso
 

Similaire à Jaap Groeneveld - Software Engineering Principles (20)

Jaap Groeneveld - Software Architecture
Jaap Groeneveld - Software ArchitectureJaap Groeneveld - Software Architecture
Jaap Groeneveld - Software Architecture
 
Camunda Chapter Hamburg - Surviving the hyperautomation low code bubble
Camunda Chapter Hamburg - Surviving the hyperautomation low code bubbleCamunda Chapter Hamburg - Surviving the hyperautomation low code bubble
Camunda Chapter Hamburg - Surviving the hyperautomation low code bubble
 
2011.02.18 marco parenzan - case study. conversione di una applicazione for...
2011.02.18   marco parenzan - case study. conversione di una applicazione for...2011.02.18   marco parenzan - case study. conversione di una applicazione for...
2011.02.18 marco parenzan - case study. conversione di una applicazione for...
 
The art of computer programming
The art of computer programmingThe art of computer programming
The art of computer programming
 
The Smells Of Bad Design
The Smells Of Bad DesignThe Smells Of Bad Design
The Smells Of Bad Design
 
The Smells Of Bad Design
The Smells Of Bad DesignThe Smells Of Bad Design
The Smells Of Bad Design
 
Dotfuscator
DotfuscatorDotfuscator
Dotfuscator
 
CraftConf: Surviving the hyperautomation low code bubbl
CraftConf: Surviving the hyperautomation low code bubblCraftConf: Surviving the hyperautomation low code bubbl
CraftConf: Surviving the hyperautomation low code bubbl
 
A taxonomy of obfuscating transformations
A taxonomy of obfuscating transformationsA taxonomy of obfuscating transformations
A taxonomy of obfuscating transformations
 
Resume
ResumeResume
Resume
 
Cr java concept by vikas jagtap
Cr java  concept by vikas jagtapCr java  concept by vikas jagtap
Cr java concept by vikas jagtap
 
Developers survival-guide
Developers survival-guideDevelopers survival-guide
Developers survival-guide
 
Privacy is a UX problem (David Dahl)
Privacy is a UX problem (David Dahl)Privacy is a UX problem (David Dahl)
Privacy is a UX problem (David Dahl)
 
What frameworks can do for you – and what not (IPC14 SE)
What frameworks can do for you – and what not (IPC14 SE)What frameworks can do for you – and what not (IPC14 SE)
What frameworks can do for you – and what not (IPC14 SE)
 
linkedin brainies
linkedin brainieslinkedin brainies
linkedin brainies
 
Structured Software Design
Structured Software DesignStructured Software Design
Structured Software Design
 
London F-Sharp User Group : Don Syme on F# - 09/09/2010
London F-Sharp User Group : Don Syme on F# - 09/09/2010London F-Sharp User Group : Don Syme on F# - 09/09/2010
London F-Sharp User Group : Don Syme on F# - 09/09/2010
 
Sunny Tech 2019 - Craft Forever
Sunny Tech 2019 - Craft ForeverSunny Tech 2019 - Craft Forever
Sunny Tech 2019 - Craft Forever
 
A Gentle introduction to microservices
A Gentle introduction to microservicesA Gentle introduction to microservices
A Gentle introduction to microservices
 
Androides y Mazmorras. Part I (dungeons & robots)
Androides y Mazmorras. Part I (dungeons & robots)Androides y Mazmorras. Part I (dungeons & robots)
Androides y Mazmorras. Part I (dungeons & robots)
 

Dernier

[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
A Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxA Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxAna-Maria Mihalceanu
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
Kuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorialKuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorialJoão Esperancinha
 
All These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFAll These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFMichael Gough
 
Landscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfLandscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfAarwolf Industries LLC
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Mark Simos
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Nikki Chapple
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
Accelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessAccelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessWSO2
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkPixlogix Infotech
 

Dernier (20)

[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
A Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxA Glance At The Java Performance Toolbox
A Glance At The Java Performance Toolbox
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
Kuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorialKuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorial
 
All These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFAll These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDF
 
Landscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdfLandscape Catalogue 2024 Australia-1.pdf
Landscape Catalogue 2024 Australia-1.pdf
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
Tampa BSides - The No BS SOC (slides from April 6, 2024 talk)
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
Accelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with PlatformlessAccelerating Enterprise Software Engineering with Platformless
Accelerating Enterprise Software Engineering with Platformless
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
React Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App FrameworkReact Native vs Ionic - The Best Mobile App Framework
React Native vs Ionic - The Best Mobile App Framework
 

Jaap Groeneveld - Software Engineering Principles