7 ineffective coding habits many F# programmers don't have

Yan Cui
Yan CuiSpeaker um Self
7 ineffective
coding
habits
MANY
F#
programmers
DON’T
have
BuildStuff ‘14
7 ineffective coding habits many F# programmers don't have
habit
ˈhabɪt/
A settled or regular tendency
or practice, especially one
that is hard to give up.
“I’m not a great programmer;
I’m just a good programmer
with great habits.”
- Kent Beck
Noisy Code
Visual Dishonesty
Lego Naming
Underabstraction
Unencapsulated State
Getters and Setters
Uncohesive Tests
@theburningmonk
does the language I use
make a difference?
“Programming languages
have a devious influence:
they shape our thinking
habits.”
- Edsger W. Dijkstra
Noisy Code
@theburningmonk
7 ineffective coding habits many F# programmers don't have
@theburningmonk
@theburningmonk
every LOC is a cost
@theburningmonk
more code
more chance for bugs
@theburningmonk
more code
more engineers
@theburningmonk
@theburningmonk
You should do whatever possible to increase the
productivity of individual programmers in terms of
the expressive power of the code they write. Less
code to do the same thing (and possibly better).
Less programmers to hire. Less organizational
communication costs.
@theburningmonk
You should do whatever possible to increase the
productivity of individual programmers in terms of
the expressive power of the code they write. Less
code to do the same thing (and possibly better).
Less programmers to hire. Less organizational
communication costs.
does the language I use
make a difference?
@theburningmonk
@theburningmonk
source http://bit.ly/1oBHHh1
@theburningmonk
source http://bit.ly/1oBHHh1
@theburningmonk
source http://bit.ly/1oBHHh1
@theburningmonk
source http://bit.ly/1oBHHh1
@theburningmonk
source http://bit.ly/1oBHHh1
@theburningmonk
source http://bit.ly/1oBHHh1
@theburningmonk
source http://bit.ly/1oBHHh1
@theburningmonk
Recap
@theburningmonk
no { }
no nulls
fewer syntactic noise
@theburningmonk
fewer code
fewer noise
@theburningmonk
fewer noise
higher SNR
@theburningmonk
fewer code
more productivity
- Dan North
“Lead time to someone saying
thank you is the only reputation
metric that matters.”
Visual
Dishonesty
“…a clean design is one that
supports visual thinking so
people can meet their
informational needs with a
minimum of conscious effort.”
- Daniel Higginbotham (www.visualmess.com)
@theburningmonk
public void MyCleverMethod(
int firstArg,
string secondArg)
signifies hierarchy
“You convey information by the way you
arrange a design’s elements in relation to
each other. This information is understood
immediately, if not consciously, by the
people viewing your designs.”
- Daniel Higginbotham (www.visualmess.com)
“This is great if the visual relationships are
obvious and accurate, but if they’re not,
your audience is going to get confused.
They’ll have to examine your work carefully,
going back and forth between the different
parts to make sure they understand.”
- Daniel Higginbotham (www.visualmess.com)
@theburningmonk
Whilst talking with an ex-colleague, a question came up on how to implement the Stable Marriage
problem using a message passing approach. Naturally, I wanted to answer that question with Erlang!
Let’s first dissect the problem and decide what processes we need and how they need to interact with
one another.
The stable marriage problem is commonly stated as:
Given n men and n women, where each person has ranked all members of the opposite sex with a
unique number between 1 and n in order of preference, marry the men and women together such that
there are no two people of opposite sex who would both rather have each other than their current
partners. If there are no such people, all the marriages are “stable”. (It is assumed that the participants
are binary gendered and that marriages are not same-sex).
From the problem description, we can see that we need:
* a module for man
* a module for woman
* a module for orchestrating the experiment
In terms of interaction between the different modules, I imagined something along the lines of…
how we read ENGLISH
see also http://bit.ly/1KN8cd0
@theburningmonk
Whilst talking with an ex-colleague, a question came up on how to implement the Stable Marriage
problem using a message passing approach. Naturally, I wanted to answer that question with Erlang!
Let’s first dissect the problem and decide what processes we need and how they need to interact with
one another.
The stable marriage problem is commonly stated as:
Given n men and n women, where each person has ranked all members of the opposite sex with a
unique number between 1 and n in order of preference, marry the men and women together such that
there are no two people of opposite sex who would both rather have each other than their current
partners. If there are no such people, all the marriages are “stable”. (It is assumed that the participants
are binary gendered and that marriages are not same-sex).
From the problem description, we can see that we need:
* a module for man
* a module for woman
* a module for orchestrating the experiment
In terms of interaction between the different modules, I imagined something along the lines of…
2.top-to-bottom
1.left-to-right
how we read ENGLISH
see also http://bit.ly/1KN8cd0
@theburningmonk
how we read CODE
public void DoSomething(int x, int y)
{
Foo(y,
Bar(x,
Zoo(Monkey())));
}
see also http://bit.ly/1KN8cd0
@theburningmonk
how we read CODE
public void DoSomething(int x, int y)
{
Foo(y,
Bar(x,
Zoo(Monkey())));
}
2.bottom-to-top
1.right-to-left
see also http://bit.ly/1KN8cd0
@theburningmonk
Whilst talking with an ex-colleague, a question came up on
how to implement the Stable Marriage problem using a
message passing approach. Naturally, I wanted to answer
that question with Erlang!
Let’s first dissect the problem and decide what processes we
need and how they need to interact with one another.
The stable marriage problem is commonly stated as:
Given n men and n women, where each person has ranked
all members of the opposite sex with a unique number
between 1 and n in order of preference, marry the men and
women together such that there are no two people of
opposite sex who would both rather have each other than
their current partners. If there are no such people, all the
marriages are “stable”. (It is assumed that the participants
are binary gendered and that marriages are not same-sex).
From the problem description, we can see that we need:
* a module for man
* a module for woman
* a module for orchestrating the experiment
In terms of interaction between the different modules, I
imagined something along the lines of…
2.top-to-bottom
1.left-to-right
how we read ENGLISH
public void DoSomething(int x, int y)
{
Foo(y,
Bar(x,
Zoo(Monkey())));
}
2.top-to-bottom
1.right-to-left
how we read CODE
see also http://bit.ly/1KN8cd0
@theburningmonk
|>
see also http://bit.ly/1KN8cd0
@theburningmonk
how we read CODE
let drawCircle x y radius =
circle radius
|> filled (rgb 150 170 150)
|> alpha 0.5
|> move (x, y)
see also http://bit.ly/1KN8cd0
@theburningmonk
how we read CODE
let drawCircle x y radius =
circle radius
|> filled (rgb 150 170 150)
|> alpha 0.5
|> move (x, y)
2.top-to-bottom
1.left-to-right
see also http://bit.ly/1KN8cd0
@theburningmonk
{}
@theburningmonk
public ResultType MyCleverMethod(
int firstArg,
string secondArg,
string thirdArg) {
var localVar =
AnotherCleverMethod(firstArg, secondArg);
if (localVar.IsSomething(
thirdArg, MY_CONSTANT)) {
DoSomething(localVar);
}
return localVar.GetSomething();
}
@theburningmonk
XXXXXX XXXXXXXXXX XXXXXXXXXXXXXX
XXX XXXXXXXX
XXXXXX XXXXXXXXX
XXXXXX XXXXXXXX
XXX XXXXXXXX
XXXXXXXXXXXXXXXXXXX XXXXXXXX XXXXXXXXX
XX XXXXXXXX XXXXXXXXXXX
XXXXXXXX XXXXXXXXXX
XXXXXXXXXXX XXXXXXXX
XXXXXX XXXXXXXX XXXXXXXXXXXX
@theburningmonk
public ResultType MyCleverMethod(
int firstArg,
string secondArg,
string thirdArg) {
var localVar =
AnotherCleverMethod(firstArg, secondArg);
if (localVar.IsSomething(
thirdArg, MY_CONSTANT)) {
DoSomething(localVar);
}
return localVar.GetSomething();
}
“This is great if the visual relationships are
obvious and accurate, but if they’re not,
your audience is going to get confused.
They’ll have to examine your work carefully,
going back and forth between the different
parts to make sure they understand.”
@theburningmonk
public ResultType MyCleverMethod(
int firstArg,
string secondArg,
string thirdArg)
{
var localVar =
AnotherCleverMethod(firstArg, secondArg);
if (localVar.IsSomething(
thirdArg, MY_CONSTANT))
{
DoSomething(localVar);
}
return localVar.GetSomething();
}
@theburningmonk
XXXXXX XXXXXXXXXX XXXXXXXXXXXXXX
XXX XXXXXXXX
XXXXXX XXXXXXXXX
XXXXXX XXXXXXXX
XXX XXXXXXXX
XXXXXXXXXXXXXXXXXXX XXXXXXXX XXXXXXXXX
XX XXXXXXXX XXXXXXXXXXX
XXXXXXXX XXXXXXXXXX
XXXXXXXXXXX XXXXXXXX
XXXXXX XXXXXXXX XXXXXXXXXXXX
- Douglas Crockford
“It turns out that style
matters in programming for
the same reason that it
matters in writing.
It makes for better reading.”
@theburningmonk
two competing rules for
structuring code in
C-style languages
@theburningmonk
Compiler
{ }
Human
{ } + whitespace
@theburningmonk
what if…?
@theburningmonk
Compiler
whitespace
Human
whitespace
@theburningmonk
xxx
{
}
xxx {
}
no
braces no
problem
@theburningmonk
There should be one - and preferably only
one - obvious way to do it.
- the Zen of Python
@theburningmonk
let myCleverFunction x y z =
let localVar = anotherCleverFunction x y
if localVar.IsSomething(z, MY_CONSTANT) then
doSomething localVar
localVar.GetSomething()
@theburningmonk
XXX XXXXXXXXXXXXXXXX X X X
XXX XXXXXXXX XXXXXXXXXXXXXXXXXXXX X X
XX XXXXXXXX XXXXXXXXXXX X XXXXXXXXXX XXXX
XXXXXXXXXXX XXXXXXXX
XXXXXXXX XXXXXXXXXXXX
@theburningmonk
You should do whatever possible to increase the
productivity of individual programmers in terms of
the expressive power of the code they write. Less
code to do the same thing (and possibly better).
Less programmers to hire. Less organizational
communication costs.
@theburningmonk
Recap
@theburningmonk
|>
@theburningmonk
one way to describe
hierarchy
Lego Naming
@theburningmonk
naming is HARD
- Phil Karlton
“There are only two hard things
in Computer Science: cache
invalidation and naming things.”
- Mike Mahemoff
“Names are the one and only
tool you have to explain what a
variable does in every place it
appears, without having to
scatter comments everywhere.”
@theburningmonk
Lego Naming
Gluing common words together in an
attempt to create meaning.
@theburningmonk
Strategy
Process
Create
Add
Controller
Factory
Proxy
Object
Exception
Enable
Do
Disable
Service
Remove
Check
Get
Set
Update
Validate
@theburningmonk
see http://methodnamer.com
@theburningmonk
this is not naming
@theburningmonk
this is not naming
this is labelling
@theburningmonk
@theburningmonk
7 ineffective coding habits many F# programmers don't have
@theburningmonk
naming is HARD
@theburningmonk
anonymous functions
aka lambdas
@theburningmonk
fewer things to name
@theburningmonk
words
|> Array.map (fun x -> x.Count)
|> Array.reduce (+)
@theburningmonk
smaller scope
shorter names
@theburningmonk
@theburningmonk
http://bit.ly/1ZpAByu
When x, y, and z are
great variable names
@theburningmonk
"The length of a name should be related to the
length of the scope. You can use very short
variable names for tiny scopes, but for big
scopes you should use longer names.
Variable names like i and j are just fine if their
scope is five lines long."
- Robert C. Martin
@theburningmonk
object expressions
@theburningmonk
enterpriseCrew.OrderBy(
(fun c -> c.Current),
{ new IComparer<Occupation> with
member this.Compare(x, y) =
x.Position.CompareTo(y.Position) })
@theburningmonk
enterpriseCrew.OrderBy(
(fun c -> c.Current),
{ new IComparer<Occupation> with
member this.Compare(x, y) =
x.Position.CompareTo(y.Position) })
@theburningmonk
fewer things to name
@theburningmonk
tuples + pattern matching
@theburningmonk
tuples + pattern matching
fewer abstractions
@theburningmonk
tuples + pattern matching
fewer abstractions
fewer things to name
@theburningmonk
words
|> Seq.groupBy id
|> Seq.map (fun (word, gr) ->
word, Seq.length gr)
|> Seq.iter (fun (word, len) ->
printfn “%s - %s” word len)
@theburningmonk
words
|> Seq.groupBy id
|> Seq.map (fun (word, gr) ->
word, Seq.length gr)
|> Seq.iter (fun (word, len) ->
printfn “%s - %s” word len)
@theburningmonk
words
|> Seq.groupBy id
|> Seq.map (fun (word, gr) ->
word, Seq.length gr)
|> Seq.iter (fun (word, len) ->
printfn “%s - %s” word len)
@theburningmonk
words
|> Seq.groupBy id
|> Seq.map (fun (word, gr) ->
word, Seq.length gr)
|> Seq.iter (fun (word, len) ->
printfn “%s - %s” word len)
@theburningmonk
Lego Naming can also be
the symptom of a failure to
identify the right level of
abstractions.
@theburningmonk
the RIGHT level of
abstraction might be
smaller than “object”
@theburningmonk
public interface ConditionChecker
{
bool CheckCondition();
}
@theburningmonk
public interface Condition
{
bool IsTrue();
}
@theburningmonk
@theburningmonk
type Condition = unit -> bool
source https://vimeo.com/113588389
@theburningmonk
ClassNotFoundException
IllegalArgumentException
IndexOutOfBoundsException
NoSuchMethodException
UnsupportedOperationException
@theburningmonk
ClassNotFound
IllegalArgument
IndexOutOfBounds
NoSuchMethod
UnsupportedOperation
@theburningmonk
ArithmeticException
ArrayStoreException
ClassCastException
InstantiationException
NullPointerException
SecurityException
@theburningmonk
IntegerDivisionByZero
IllegalArrayElementType
CastToNonSubclass
ClassCannotBeInstantiated
NullDereferenced
SecurityViolation
@theburningmonk
lightweight exception syntax
@theburningmonk
open System
open System.IO
exception InsufficientBytes
@theburningmonk
open System
open System.IO
exception InsufficientBytes
what could this type represent?
@theburningmonk
Recap
@theburningmonk
F# < > silver bullet
@theburningmonk
anonymous functions
fewer things to name
@theburningmonk
short names
@theburningmonk
tuple + pattern matching
fewer things to name
@theburningmonk
no abstraction is too small
@theburningmonk
lightweight exception syntax
Underabstraction
@theburningmonk
@theburningmonk
public Result DoSomething(
int a,
string b,
string c,
string d,
DateTime e,
DateTime f,
string g,
MyEnum h)
“If you have a procedure
with ten parameters, you
probably missed some.”
- Alan Perlis
source https://vimeo.com/97507575
@theburningmonk
lightweight syntax for
types and hierarchies
@theburningmonk
record
@theburningmonk
type Employee =
{
FirstName : string
Surname : string
Salary : int<Pound>
}
@theburningmonk
type Employee =
{
FirstName : string
Surname : string
Salary : int<Pound>
}
immutable by default
@theburningmonk
let promote emp raise =
{
emp with Salary <- emp.Salary + raise
}
@theburningmonk
mutable state
complects
value and time
@theburningmonk
type Employee =
{
FirstName : string
Surname : string
Salary : int<Pound>
}
unit-of-measure
@theburningmonk
[<Measure>]
type Pound
e.g. 42<Pound>
153<Pound>
10<Meter> / 2<Second> = 5<Meter/Second>
10<Meter> * 2<Second> = 20<Meter Second>
10<Meter> + 10<Meter> = 20<Meter>
10<Meter> * 10 = 100<Meter>
10<Meter> * 10<Meter> = 100<Meter2>
10<Meter> + 2<Second> // error
10<Meter> + 2 // error
10<Meter> / 2<Second> = 5<Meter/Second>
10<Meter> * 2<Second> = 20<Meter Second>
10<Meter> + 10<Meter> = 20<Meter>
10<Meter> * 10 = 100<Meter>
10<Meter> * 10<Meter> = 100<Meter2>
10<Meter> + 2<Second> // error
10<Meter> + 2 // error
@theburningmonk
discriminated
unions
@theburningmonk
type PaymentMethod =
| Cash
| Cheque of ChequeNumber
| Card of CardType * CardNumber
Unencapsulated
State
@theburningmonk
@theburningmonk
public class RecentlyUsedList
{
private List<string> items = new List<string>();
public List<string> Items
{
get { return items; }
}
…
}
@theburningmonk
immutability
@theburningmonk
type RecentlyUsedList (?items) =
let items = defaultArg items [ ]
member this.Items = Array.ofList items
member this.Count = List.length items
member this.Add newItem =
newItem::(items |> List.filter ((<>) newItem))
|> RecentlyUsedList
@theburningmonk
Affordance
an affordance is a quality of an object, or
an environment, which allows an individual
to perform an action. For example, a knob
affords twisting, and perhaps pushing,
whilst a cord affords pulling.
source https://www.youtube.com/watch?v=aAb7hSCtvGw
@theburningmonk
your abstractions should
afford right behaviour,
whilst make it impossible
to do the wrong thing
@theburningmonk
“Make illegal states unrepresentable”
- Yaron Minsky
@theburningmonk
discriminated
unions
@theburningmonk
type PaymentMethod =
| Cash
| Cheque of ChequeNumber
| Card of CardType * CardNumber
finite, closed set of valid states ONLY
closed hierarchy
no Nulls
@theburningmonk
match paymentMethod with
| Cash -> …
| Cheque chequeNum -> …
| Card (cardType, cardNum) -> …
@theburningmonk
Recap
@theburningmonk
immutability
@theburningmonk
make illegal state
unrepresentable
Getters and
Setters
“When it’s not necessary to change,
it’s necessary to not change.”
- Lucius Cary
“Now we have shortcuts to do the
wrong thing.
We used to have type lots to do the
wrong thing, not anymore.”
- Kevlin Henney
@theburningmonk
immutability by default
@theburningmonk
type Person =
{
Name : string
Age : int
}
@theburningmonk
type Person =
{
mutable Name : string
mutable Age : int
}
@theburningmonk
immutability
Uncohesive
Tests
@theburningmonk
MethodA
MethodB
When_…Then_… ()
When_…Then_… ()
When_…Then_… ()
When_…Then_… ()
When_…Then_… ()
When_…Then_… ()
@theburningmonk
MethodA
MethodB
MethodC
FeatureA
FeatureB
@theburningmonk
complexities & potential
bugs in the way methods
work together
@theburningmonk
…especially when states
are concerned
@theburningmonk
Test Driven Development
“For tests to drive development they
must do more than just test that code
performs its required functionality: they
must clearly express that required
functionality to the reader. That is, they
must be clear specification of the
required functionality.”
- Nat Pryce & Steve Freeman
@theburningmonk
@theburningmonk
how many tests?
@theburningmonk
every test has a cost
@theburningmonk
did we cover all the
edge cases?
@theburningmonk
Property-Based Testing
(with FsCheck)
@theburningmonk
List.rev
reverse + reverse = original
length of list is invariant
append + reverse = reverse + prepend
@theburningmonk
List.rev
property : reverse + reverse = original
let ``reverse + reverse = original`` rev aList =
aList |> rev |> rev = aList
Check.Quick (``reverse + reverse = original`` List.rev)
// Ok, passed 100 tests.
@theburningmonk
List.rev
property : length of list is invariant
let ``length of list is invariant`` rev aList =
List.length (rev aList) = List.length aList
Check.Quick (``length of list is invariant`` List.rev)
// Ok, passed 100 tests.
@theburningmonk
List.rev
property : append + reverse = reverse + prepend
let ``append + reverse = reverse + prepend`` rev x aList =
(aList @ [x]) |> rev = x::(aList |> rev)
Check.Quick (``append + reverse = reverse + prepend``
List.rev)
// Ok, passed 100 tests.
@theburningmonk
Check.Verbose (``append + reverse = reverse + prepend``
List.rev)
//
0: ‘005' []
1: false ["N "]
2: “" [false; '{']
3: ‘017' [true; true; 'W']
4: “" [""; false]
5: “yg]" [“HnOq6"; null; false; false; '#']
6: true [“"]
…
11: <null> ['014'; '0'; “nRH”; "<#oe"; true; false; ‘O']
…
@theburningmonk
shrinking
@theburningmonk
Check.Quick (``append + reverse = reverse + prepend`` id)
// Falsifiable, after 2 tests (4 shrinks) (StdGen
(1855582125,296080469)):
Original:
‘013' ["}k"; ""; “"]
Shrunk:
true [false]
@theburningmonk
let computers do the
grunt work
source : http://bit.ly/1kEpEso
@theburningmonk
Types vs Tests
@theburningmonk
all bugs
@theburningmonk
unknown
known
@theburningmonk
tests
types
@theburningmonk
tests
types
@theburningmonk
unit-testing
distr. systems
system-testing
@theburningmonk
Jepsenproperty-based
unit-testing system-testing
distr. systems
@theburningmonk
Jepsenproperty-based
unit-testing
types as proof TLA+
distr. systems
system-testing
Noisy Code
Visual Dishonesty
Lego Naming
Underabstraction
Unencapsulated State
Getters and Setters
Uncohesive Tests
“Practice does not make perfect.
Only perfect practice makes perfect.”
- Vince Lombardi
“Perfection is not attainable. But if we
chase perfection, we can catch excellence.”
- Vince Lombardi
“Programming languages
have a devious influence:
they shape our thinking
habits.”
- Edsger W. Dijkstra
“One of the most disastrous
thing we can learn is the first
programming language, even
if it's a good programming
language.”
- Alan Kay
“I’m not a great programmer;
I’m just a good programmer
with great habits.”
- Kent Beck
@theburningmonk
what about ineffective
coding habits SOME F#/FP
programmers DO have?
@theburningmonk
@theburningmonk
people are too puritanical about purity
…premature optimization
is the root of all evil. Yet
we should not pass up
our opportunities in that
critical 3%
- Donald Knuth
@theburningmonk
F# Map vs .Net array vs Dictionary
@theburningmonk
@theburningmonk
Explicit is better than implicit.
- the Zen of Python
@theburningmonk
Simple is better than Complex.
Complex is better than Complicated.
- the Zen of Python
@theburningmonk
Special cases aren't special enough to
break the rules.
- the Zen of Python
@theburningmonk
Special cases aren't special enough to
break the rules.
Although practicality beats purity.
- the Zen of Python
@theburningmonk
If the implementation is hard to explain,
it's a bad idea.
- the Zen of Python
@theburningmonk
@theburningmonk
theburningmonk.com
github.com/theburningmonk
@theburningmonk
is hiring :-)
http://tech.just-eat.com/jobs
1 von 207

Recomendados

10 Practical Ways to Be More Efficient at Work von
10 Practical Ways to Be More Efficient at Work10 Practical Ways to Be More Efficient at Work
10 Practical Ways to Be More Efficient at WorkWeekdone.com
48.8K views12 Folien
Data made out of functions von
Data made out of functionsData made out of functions
Data made out of functionskenbot
29.5K views101 Folien
Productivity Facts Every Employee Should Know von
Productivity Facts Every Employee Should KnowProductivity Facts Every Employee Should Know
Productivity Facts Every Employee Should KnowRobert Half
120.7K views6 Folien
100 growth hacks 100 days | 1 to 10 von
100 growth hacks 100 days | 1 to 10100 growth hacks 100 days | 1 to 10
100 growth hacks 100 days | 1 to 10Robin Yjord
1.1M views44 Folien
책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017 von
책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017
책 읽어주는 딥러닝: 배우 유인나가 해리포터를 읽어준다면 DEVIEW 2017Taehoon Kim
275.8K views237 Folien
Creating a Magnetic Culture von
Creating a Magnetic CultureCreating a Magnetic Culture
Creating a Magnetic CultureSnag
27.5K views24 Folien

Más contenido relacionado

Was ist angesagt?

10 Ways Your Boss Kills Employee Motivation von
10 Ways Your Boss Kills Employee Motivation10 Ways Your Boss Kills Employee Motivation
10 Ways Your Boss Kills Employee MotivationOfficevibe
770.8K views16 Folien
20 Awesome Facts About Chocolate That You Need To Know For Valentine’s Day von
20 Awesome Facts About Chocolate That You Need To Know For Valentine’s Day20 Awesome Facts About Chocolate That You Need To Know For Valentine’s Day
20 Awesome Facts About Chocolate That You Need To Know For Valentine’s DayEason Chan
56.7K views26 Folien
Chat bots von
Chat botsChat bots
Chat botsChandulal Kavar
2K views24 Folien
10 Insightful Quotes On Designing A Better Customer Experience von
10 Insightful Quotes On Designing A Better Customer Experience10 Insightful Quotes On Designing A Better Customer Experience
10 Insightful Quotes On Designing A Better Customer ExperienceYuan Wang
1.3M views26 Folien
10 Steps to Becoming Self Made Millionaire by Rhett Power von
10 Steps to Becoming Self Made Millionaire by Rhett Power10 Steps to Becoming Self Made Millionaire by Rhett Power
10 Steps to Becoming Self Made Millionaire by Rhett Power24Slides
53.4K views1 Folie
SPEAK with CHATGPT 24h in US Language von
SPEAK with CHATGPT 24h in US LanguageSPEAK with CHATGPT 24h in US Language
SPEAK with CHATGPT 24h in US LanguageErol GIRAUDY
586 views37 Folien

Was ist angesagt?(20)

10 Ways Your Boss Kills Employee Motivation von Officevibe
10 Ways Your Boss Kills Employee Motivation10 Ways Your Boss Kills Employee Motivation
10 Ways Your Boss Kills Employee Motivation
Officevibe770.8K views
20 Awesome Facts About Chocolate That You Need To Know For Valentine’s Day von Eason Chan
20 Awesome Facts About Chocolate That You Need To Know For Valentine’s Day20 Awesome Facts About Chocolate That You Need To Know For Valentine’s Day
20 Awesome Facts About Chocolate That You Need To Know For Valentine’s Day
Eason Chan56.7K views
10 Insightful Quotes On Designing A Better Customer Experience von Yuan Wang
10 Insightful Quotes On Designing A Better Customer Experience10 Insightful Quotes On Designing A Better Customer Experience
10 Insightful Quotes On Designing A Better Customer Experience
Yuan Wang1.3M views
10 Steps to Becoming Self Made Millionaire by Rhett Power von 24Slides
10 Steps to Becoming Self Made Millionaire by Rhett Power10 Steps to Becoming Self Made Millionaire by Rhett Power
10 Steps to Becoming Self Made Millionaire by Rhett Power
24Slides53.4K views
SPEAK with CHATGPT 24h in US Language von Erol GIRAUDY
SPEAK with CHATGPT 24h in US LanguageSPEAK with CHATGPT 24h in US Language
SPEAK with CHATGPT 24h in US Language
Erol GIRAUDY586 views
What 33 Successful Entrepreneurs Learned From Failure von ReferralCandy
What 33 Successful Entrepreneurs Learned From FailureWhat 33 Successful Entrepreneurs Learned From Failure
What 33 Successful Entrepreneurs Learned From Failure
ReferralCandy3.9M views
11 Statistics That Should Scare Every Manager von Elodie A.
11 Statistics That Should Scare Every Manager11 Statistics That Should Scare Every Manager
11 Statistics That Should Scare Every Manager
Elodie A.2.5K views
The Seven Deadly Social Media Sins von XPLAIN
The Seven Deadly Social Media SinsThe Seven Deadly Social Media Sins
The Seven Deadly Social Media Sins
XPLAIN4.4M views
Banish The Buzzwords von LinkedIn
Banish The BuzzwordsBanish The Buzzwords
Banish The Buzzwords
LinkedIn180.2K views
8 Things to Do Before You Manage Your Boss von Wiley
8 Things to Do Before You Manage Your Boss8 Things to Do Before You Manage Your Boss
8 Things to Do Before You Manage Your Boss
Wiley35.8K views
Kaggle presentation von HJ van Veen
Kaggle presentationKaggle presentation
Kaggle presentation
HJ van Veen13.4K views
Machine learning module 2 von Gokulks007
Machine learning module 2Machine learning module 2
Machine learning module 2
Gokulks007619 views
Machine Learning for retail and ecommerce von Andrei Lopatenko
Machine Learning for retail and ecommerceMachine Learning for retail and ecommerce
Machine Learning for retail and ecommerce
Andrei Lopatenko2.5K views
8 most important benefits of chatbots von MindTitan
8 most important benefits of chatbots8 most important benefits of chatbots
8 most important benefits of chatbots
MindTitan467 views
Generative Models and ChatGPT von Loic Merckel
Generative Models and ChatGPTGenerative Models and ChatGPT
Generative Models and ChatGPT
Loic Merckel644 views
The Productivity Secret Of The Best Leaders von Officevibe
The Productivity Secret Of The Best LeadersThe Productivity Secret Of The Best Leaders
The Productivity Secret Of The Best Leaders
Officevibe702.1K views
Product Management for AI/ML von Jeremy Horn
Product Management for AI/MLProduct Management for AI/ML
Product Management for AI/ML
Jeremy Horn1.7K views
The AI Revolution - Aaron Stelle - WFG Title von Aaron Stelle
The AI Revolution - Aaron Stelle - WFG TitleThe AI Revolution - Aaron Stelle - WFG Title
The AI Revolution - Aaron Stelle - WFG Title
Aaron Stelle55 views

Destacado

CSS Grid Layout von
CSS Grid LayoutCSS Grid Layout
CSS Grid LayoutRachel Andrew
128.2K views120 Folien
Andreas Tschas - Pioneers - Building Startup Marketplaces in Europe & Asia - ... von
Andreas Tschas - Pioneers - Building Startup Marketplaces in Europe & Asia - ...Andreas Tschas - Pioneers - Building Startup Marketplaces in Europe & Asia - ...
Andreas Tschas - Pioneers - Building Startup Marketplaces in Europe & Asia - ...Burton Lee
57.5K views35 Folien
Enabling Autonomy von
Enabling AutonomyEnabling Autonomy
Enabling AutonomyIan Livingstone
116.3K views47 Folien
data science @NYT ; inaugural Data Science Initiative Lecture von
data science @NYT ; inaugural Data Science Initiative Lecturedata science @NYT ; inaugural Data Science Initiative Lecture
data science @NYT ; inaugural Data Science Initiative Lecturechris wiggins
213.8K views93 Folien
Pollen VC Building A Digital Lending Business von
Pollen VC Building A Digital Lending BusinessPollen VC Building A Digital Lending Business
Pollen VC Building A Digital Lending BusinessPollen VC
100.8K views11 Folien
The Future Of Work & The Work Of The Future von
The Future Of Work & The Work Of The FutureThe Future Of Work & The Work Of The Future
The Future Of Work & The Work Of The FutureArturo Pelayo
446.6K views70 Folien

Destacado(6)

Andreas Tschas - Pioneers - Building Startup Marketplaces in Europe & Asia - ... von Burton Lee
Andreas Tschas - Pioneers - Building Startup Marketplaces in Europe & Asia - ...Andreas Tschas - Pioneers - Building Startup Marketplaces in Europe & Asia - ...
Andreas Tschas - Pioneers - Building Startup Marketplaces in Europe & Asia - ...
Burton Lee57.5K views
data science @NYT ; inaugural Data Science Initiative Lecture von chris wiggins
data science @NYT ; inaugural Data Science Initiative Lecturedata science @NYT ; inaugural Data Science Initiative Lecture
data science @NYT ; inaugural Data Science Initiative Lecture
chris wiggins213.8K views
Pollen VC Building A Digital Lending Business von Pollen VC
Pollen VC Building A Digital Lending BusinessPollen VC Building A Digital Lending Business
Pollen VC Building A Digital Lending Business
Pollen VC100.8K views
The Future Of Work & The Work Of The Future von Arturo Pelayo
The Future Of Work & The Work Of The FutureThe Future Of Work & The Work Of The Future
The Future Of Work & The Work Of The Future
Arturo Pelayo446.6K views

Similar a 7 ineffective coding habits many F# programmers don't have

Tour of language landscape von
Tour of language landscapeTour of language landscape
Tour of language landscapeYan Cui
8.4K views285 Folien
Tour of language landscape von
Tour of language landscapeTour of language landscape
Tour of language landscapeYan Cui
4.5K views156 Folien
Understanding others through their communication von
Understanding others through their communicationUnderstanding others through their communication
Understanding others through their communicationAngela Belotti
277 views14 Folien
Individual Analysis Of Working In A Group Situation Essay von
Individual Analysis Of Working In A Group Situation EssayIndividual Analysis Of Working In A Group Situation Essay
Individual Analysis Of Working In A Group Situation EssayHaley Johnson
3 views78 Folien
Science Fair Proposal von
Science Fair ProposalScience Fair Proposal
Science Fair ProposalJeanne Hall
6 views45 Folien
David Dylan Thomas - The Content Strategy of Civil Discourse von
David Dylan Thomas - The Content Strategy of Civil DiscourseDavid Dylan Thomas - The Content Strategy of Civil Discourse
David Dylan Thomas - The Content Strategy of Civil DiscourseLavaConConference
56 views61 Folien

Similar a 7 ineffective coding habits many F# programmers don't have(20)

Tour of language landscape von Yan Cui
Tour of language landscapeTour of language landscape
Tour of language landscape
Yan Cui8.4K views
Tour of language landscape von Yan Cui
Tour of language landscapeTour of language landscape
Tour of language landscape
Yan Cui4.5K views
Understanding others through their communication von Angela Belotti
Understanding others through their communicationUnderstanding others through their communication
Understanding others through their communication
Angela Belotti277 views
Individual Analysis Of Working In A Group Situation Essay von Haley Johnson
Individual Analysis Of Working In A Group Situation EssayIndividual Analysis Of Working In A Group Situation Essay
Individual Analysis Of Working In A Group Situation Essay
Haley Johnson3 views
David Dylan Thomas - The Content Strategy of Civil Discourse von LavaConConference
David Dylan Thomas - The Content Strategy of Civil DiscourseDavid Dylan Thomas - The Content Strategy of Civil Discourse
David Dylan Thomas - The Content Strategy of Civil Discourse
Tour of language landscape (code.talks) von Yan Cui
Tour of language landscape (code.talks)Tour of language landscape (code.talks)
Tour of language landscape (code.talks)
Yan Cui4.4K views
Importance Of Neutral Rights von Aimee Brown
Importance Of Neutral RightsImportance Of Neutral Rights
Importance Of Neutral Rights
Aimee Brown3 views
A Research On Interaction Design von Lisa Kennedy
A Research On Interaction DesignA Research On Interaction Design
A Research On Interaction Design
Lisa Kennedy3 views
Three Laws of Performance4 von Bob Mueller
Three Laws of Performance4Three Laws of Performance4
Three Laws of Performance4
Bob Mueller511 views
Agile Software Solution Supporting Cross-Organizational... von Patricia Medina
Agile Software Solution Supporting Cross-Organizational...Agile Software Solution Supporting Cross-Organizational...
Agile Software Solution Supporting Cross-Organizational...
Patricia Medina2 views
Toc evaporating cloud von henry KKK
Toc evaporating cloudToc evaporating cloud
Toc evaporating cloud
henry KKK1.1K views
Toc evaporating cloud von henry KKK
Toc evaporating cloudToc evaporating cloud
Toc evaporating cloud
henry KKK778 views
Karlgren von yaevents
KarlgrenKarlgren
Karlgren
yaevents328 views
OpenEducation Challenge Finalists' Workshop: Design Thinking Session von Yishay Mor
OpenEducation Challenge Finalists' Workshop: Design Thinking SessionOpenEducation Challenge Finalists' Workshop: Design Thinking Session
OpenEducation Challenge Finalists' Workshop: Design Thinking Session
Yishay Mor1.1K views
Fostering Collaboration Across Cultures von All Things Open
Fostering Collaboration Across CulturesFostering Collaboration Across Cultures
Fostering Collaboration Across Cultures
All Things Open184 views

Más de Yan Cui

How to win the game of trade-offs von
How to win the game of trade-offsHow to win the game of trade-offs
How to win the game of trade-offsYan Cui
21 views84 Folien
How to choose the right messaging service von
How to choose the right messaging serviceHow to choose the right messaging service
How to choose the right messaging serviceYan Cui
135 views118 Folien
How to choose the right messaging service for your workload von
How to choose the right messaging service for your workloadHow to choose the right messaging service for your workload
How to choose the right messaging service for your workloadYan Cui
65 views113 Folien
Patterns and practices for building resilient serverless applications.pdf von
Patterns and practices for building resilient serverless applications.pdfPatterns and practices for building resilient serverless applications.pdf
Patterns and practices for building resilient serverless applications.pdfYan Cui
170 views137 Folien
Lambda and DynamoDB best practices von
Lambda and DynamoDB best practicesLambda and DynamoDB best practices
Lambda and DynamoDB best practicesYan Cui
817 views148 Folien
Lessons from running AppSync in prod von
Lessons from running AppSync in prodLessons from running AppSync in prod
Lessons from running AppSync in prodYan Cui
1.1K views102 Folien

Más de Yan Cui(20)

How to win the game of trade-offs von Yan Cui
How to win the game of trade-offsHow to win the game of trade-offs
How to win the game of trade-offs
Yan Cui21 views
How to choose the right messaging service von Yan Cui
How to choose the right messaging serviceHow to choose the right messaging service
How to choose the right messaging service
Yan Cui135 views
How to choose the right messaging service for your workload von Yan Cui
How to choose the right messaging service for your workloadHow to choose the right messaging service for your workload
How to choose the right messaging service for your workload
Yan Cui65 views
Patterns and practices for building resilient serverless applications.pdf von Yan Cui
Patterns and practices for building resilient serverless applications.pdfPatterns and practices for building resilient serverless applications.pdf
Patterns and practices for building resilient serverless applications.pdf
Yan Cui170 views
Lambda and DynamoDB best practices von Yan Cui
Lambda and DynamoDB best practicesLambda and DynamoDB best practices
Lambda and DynamoDB best practices
Yan Cui817 views
Lessons from running AppSync in prod von Yan Cui
Lessons from running AppSync in prodLessons from running AppSync in prod
Lessons from running AppSync in prod
Yan Cui1.1K views
Serverless observability - a hero's perspective von Yan Cui
Serverless observability - a hero's perspectiveServerless observability - a hero's perspective
Serverless observability - a hero's perspective
Yan Cui385 views
How to ship customer value faster with step functions von Yan Cui
How to ship customer value faster with step functionsHow to ship customer value faster with step functions
How to ship customer value faster with step functions
Yan Cui652 views
How serverless changes the cost paradigm von Yan Cui
How serverless changes the cost paradigmHow serverless changes the cost paradigm
How serverless changes the cost paradigm
Yan Cui1.1K views
Why your next serverless project should use AWS AppSync von Yan Cui
Why your next serverless project should use AWS AppSyncWhy your next serverless project should use AWS AppSync
Why your next serverless project should use AWS AppSync
Yan Cui1.3K views
Build social network in 4 weeks von Yan Cui
Build social network in 4 weeksBuild social network in 4 weeks
Build social network in 4 weeks
Yan Cui642 views
Patterns and practices for building resilient serverless applications von Yan Cui
Patterns and practices for building resilient serverless applicationsPatterns and practices for building resilient serverless applications
Patterns and practices for building resilient serverless applications
Yan Cui393 views
How to bring chaos engineering to serverless von Yan Cui
How to bring chaos engineering to serverlessHow to bring chaos engineering to serverless
How to bring chaos engineering to serverless
Yan Cui456 views
Migrating existing monolith to serverless in 8 steps von Yan Cui
Migrating existing monolith to serverless in 8 stepsMigrating existing monolith to serverless in 8 steps
Migrating existing monolith to serverless in 8 steps
Yan Cui402 views
Building a social network in under 4 weeks with Serverless and GraphQL von Yan Cui
Building a social network in under 4 weeks with Serverless and GraphQLBuilding a social network in under 4 weeks with Serverless and GraphQL
Building a social network in under 4 weeks with Serverless and GraphQL
Yan Cui289 views
FinDev as a business advantage in the post covid19 economy von Yan Cui
FinDev as a business advantage in the post covid19 economyFinDev as a business advantage in the post covid19 economy
FinDev as a business advantage in the post covid19 economy
Yan Cui546 views
How to improve lambda cold starts von Yan Cui
How to improve lambda cold startsHow to improve lambda cold starts
How to improve lambda cold starts
Yan Cui867 views
What can you do with lambda in 2020 von Yan Cui
What can you do with lambda in 2020What can you do with lambda in 2020
What can you do with lambda in 2020
Yan Cui1K views
A chaos experiment a day, keeping the outage away von Yan Cui
A chaos experiment a day, keeping the outage awayA chaos experiment a day, keeping the outage away
A chaos experiment a day, keeping the outage away
Yan Cui385 views
How to debug slow lambda response times von Yan Cui
How to debug slow lambda response timesHow to debug slow lambda response times
How to debug slow lambda response times
Yan Cui317 views

Último

DESIGN OF SPRINGS-UNIT4.pptx von
DESIGN OF SPRINGS-UNIT4.pptxDESIGN OF SPRINGS-UNIT4.pptx
DESIGN OF SPRINGS-UNIT4.pptxgopinathcreddy
19 views47 Folien
802.11 Computer Networks von
802.11 Computer Networks802.11 Computer Networks
802.11 Computer NetworksTusharChoudhary72015
9 views33 Folien
K8S Roadmap.pdf von
K8S Roadmap.pdfK8S Roadmap.pdf
K8S Roadmap.pdfMaryamTavakkoli2
6 views1 Folie
Investor Presentation von
Investor PresentationInvestor Presentation
Investor Presentationeser sevinç
24 views26 Folien
What is Whirling Hygrometer.pdf von
What is Whirling Hygrometer.pdfWhat is Whirling Hygrometer.pdf
What is Whirling Hygrometer.pdfIIT KHARAGPUR
11 views3 Folien
Literature review and Case study on Commercial Complex in Nepal, Durbar mall,... von
Literature review and Case study on Commercial Complex in Nepal, Durbar mall,...Literature review and Case study on Commercial Complex in Nepal, Durbar mall,...
Literature review and Case study on Commercial Complex in Nepal, Durbar mall,...AakashShakya12
66 views115 Folien

Último(20)

Literature review and Case study on Commercial Complex in Nepal, Durbar mall,... von AakashShakya12
Literature review and Case study on Commercial Complex in Nepal, Durbar mall,...Literature review and Case study on Commercial Complex in Nepal, Durbar mall,...
Literature review and Case study on Commercial Complex in Nepal, Durbar mall,...
AakashShakya1266 views
Investigation of Physicochemical Changes of Soft Clay around Deep Geopolymer ... von AltinKaradagli
Investigation of Physicochemical Changes of Soft Clay around Deep Geopolymer ...Investigation of Physicochemical Changes of Soft Clay around Deep Geopolymer ...
Investigation of Physicochemical Changes of Soft Clay around Deep Geopolymer ...
AltinKaradagli9 views
NEW SUPPLIERS SUPPLIES (copie).pdf von georgesradjou
NEW SUPPLIERS SUPPLIES (copie).pdfNEW SUPPLIERS SUPPLIES (copie).pdf
NEW SUPPLIERS SUPPLIES (copie).pdf
georgesradjou15 views
Advances in micro milling: From tool fabrication to process outcomes von Shivendra Nandan
Advances in micro milling: From tool fabrication to process outcomesAdvances in micro milling: From tool fabrication to process outcomes
Advances in micro milling: From tool fabrication to process outcomes
Update 42 models(Diode/General ) in SPICE PARK(DEC2023) von Tsuyoshi Horigome
Update 42 models(Diode/General ) in SPICE PARK(DEC2023)Update 42 models(Diode/General ) in SPICE PARK(DEC2023)
Update 42 models(Diode/General ) in SPICE PARK(DEC2023)
SUMIT SQL PROJECT SUPERSTORE 1.pptx von Sumit Jadhav
SUMIT SQL PROJECT SUPERSTORE 1.pptxSUMIT SQL PROJECT SUPERSTORE 1.pptx
SUMIT SQL PROJECT SUPERSTORE 1.pptx
Sumit Jadhav 12 views
zincalume water storage tank design.pdf von 3D LABS
zincalume water storage tank design.pdfzincalume water storage tank design.pdf
zincalume water storage tank design.pdf
3D LABS5 views
_MAKRIADI-FOTEINI_diploma thesis.pptx von fotinimakriadi
_MAKRIADI-FOTEINI_diploma thesis.pptx_MAKRIADI-FOTEINI_diploma thesis.pptx
_MAKRIADI-FOTEINI_diploma thesis.pptx
fotinimakriadi7 views
Instrumentation & Control Lab Manual.pdf von NTU Faisalabad
Instrumentation & Control Lab Manual.pdfInstrumentation & Control Lab Manual.pdf
Instrumentation & Control Lab Manual.pdf
NTU Faisalabad 5 views
Control Systems Feedback.pdf von LGGaming5
Control Systems Feedback.pdfControl Systems Feedback.pdf
Control Systems Feedback.pdf
LGGaming55 views

7 ineffective coding habits many F# programmers don't have