Basics&of&Computer&Science
Maxim&Zaks
@iceX33
Things'I'learned'on'the'job,'a3er'my'CS'degree
Computer)Science)is:
Shoveling*Data*Around
Things'I'learned'on'the'job,'a3er'my'CS'degree
Computer)Science)is:
Consuming)Electricity
Things'I'learned'on'the'job,'a3er'my'CS'degree
Fast%code%produces%less%Data
Things'I'learned'on'the'job,'a3er'my'CS'degree
Things'I'learned'on'the'job,'a3er'my'CS'degree
How$do$we$represent$data$in$Swi/?
Things'I'learned'on'the'job,'a3er'my'CS'degree
By#Value:
Tuple,'Struct'or'Enum
By#Reference:
Class,&Func+on
Things'I'learned'on'the'job,'a3er'my'CS'degree
Value&Types&are&not&sharable!
Things'I'learned'on'the'job,'a3er'my'CS'degree
Taking'a'car'for'a'drive
Things'I'learned'on'the'job,'a3er'my'CS'degree
Value&types&are&cheaper&to&create
Things'I'learned'on'the'job,'a3er'my'CS'degree
typealias TPerson = (name:String, age:Int, male:Bool)
+-----------------------------------------+--------------------------------------------------+
struct SPerson{ | class CPerson{
let name : String | let name : String
let age : Int | let age : Int
let male : Bool | let male : Bool
} |
| init(name : String, age : Int, male : Bool){
+-----------------------------------------+ self.name = name
enum EPerson { | self.age = age
case Male(name: String, age : Int) | self.male = male
case Female(name : String, age : Int) | }
| }
func name()->String{ |
switch self { |
case let Male(name, _): |
return name |
case let Female(name, _): |
return name |
} |
} |
} +
Things'I'learned'on'the'job,'a3er'my'CS'degree
Benchmark*in*ms
• 000.00786781311035156*Tuple*10M
• 000.00405311584472656*Enum*10M
• 000.003814697265625*Struct*10M
• 813.668251037598*Class*10M
Things'I'learned'on'the'job,'a3er'my'CS'degree
How$do$we$represent$a$collec/on$of$
data?
Things'I'learned'on'the'job,'a3er'my'CS'degree
Data$Structures
Things'I'learned'on'the'job,'a3er'my'CS'degree
Reference'or'Array'Based
Things'I'learned'on'the'job,'a3er'my'CS'degree
Performance*Characteris0cs
• Add$(Prepand$/$Append$/$Insert)
• Get$(First$/$Last$/$ByIndex$/$ByValue)
• Find$(Biggest$/$Smallest)$
• Delete$(ByIndex$/$ByValue)
• Concatenate
Things'I'learned'on'the'job,'a3er'my'CS'degree
Swi$%Data%Structures
Array,&Dic*onary,&Set,&String
All#defined#as#Struct
Things'I'learned'on'the'job,'a3er'my'CS'degree
Once%upon%a%*me,%(before%Swi4%2)
I"decided"to"implement"my"own"List
Things'I'learned'on'the'job,'a3er'my'CS'degree
+-----------------------------------+-------------------------------------------------------------+
|
private protocol List{ | public struct ListNode<T> : List {
var tail : List {get} | public let value : T
} | private let _tail : List
+-----------------------------------+ private var tail : List {
| return _tail
private struct EmptyList : List{ | }
var tail : List { |
return EmptyList() | private init(value: T, tail : List){
} | self.value = value
} | self._tail = tail
| }
|
| public subscript(var index : UInt) -> ListNode<T>?{
+-----------------------------------+ var result : List = self
| while(index>0){
| result = result.tail
| index--
infix operator => { | }
associativity right | return result as? ListNode<T>
precedence 150 | }
} |
| }
+-----------------------------------+-------------------------------------------------------------+
public func => <T>(lhs: T, rhs: ListNode<T>?) -> ListNode<T> {
if let node = rhs {
return ListNode(value: lhs, tail: node)
}
return ListNode(value: lhs, tail: EmptyList())
}
Things'I'learned'on'the'job,'a3er'my'CS'degree
Benchmark*in*ms
• 208.853006362915+List+1K
• 000.30207633972168+BoxEList+1K
• 000.0660419464111328+ClassList+1K
• 000.0400543212890625+EEList+1K
• 000.0429153442382812+Array+1K
Things'I'learned'on'the'job,'a3er'my'CS'degree
WTF$happened?
Things'I'learned'on'the'job,'a3er'my'CS'degree
Let's&talk&about&Pure&Func2onal&
Programming
Things'I'learned'on'the'job,'a3er'my'CS'degree
Things'I'learned'on'the'job,'a3er'my'CS'degree
Purely'Func+onal'Data'Structure:
No#Destruc+ve#updates
Persistent((not(ephemeral)
Things'I'learned'on'the'job,'a3er'my'CS'degree
Why$is$it$important?
Things'I'learned'on'the'job,'a3er'my'CS'degree
Referen&al)transparency
Things'I'learned'on'the'job,'a3er'my'CS'degree
An#expression#always#evaluates#to#the#same#
result#in#any#context:
2"+"3
array.count
Things'I'learned'on'the'job,'a3er'my'CS'degree
Purely'Func+onal'Data'Structure:
No#Destruc+ve#updates
Persistent((not(ephemeral)
Things'I'learned'on'the'job,'a3er'my'CS'degree
But$our$hardware$memory$is$
destruc1ve$and$ephemeral
(Physics)
Things'I'learned'on'the'job,'a3er'my'CS'degree
Things'I'learned'on'the'job,'a3er'my'CS'degree
Structural(Sharing
Things'I'learned'on'the'job,'a3er'my'CS'degree
Things'I'learned'on'the'job,'a3er'my'CS'degree
Swi$
Reference'vs.'Value'Type
Things'I'learned'on'the'job,'a3er'my'CS'degree
Value&Type&are&not&sharable!
So#no#structural#sharing#is#posible
Things'I'learned'on'the'job,'a3er'my'CS'degree
Benchmark*in*ms
• 208.853006362915+List+1K
• 000.30207633972168+BoxEList+1K
• 000.0660419464111328+ClassList+1K
• 000.0400543212890625+EEList+1K
• 000.0429153442382812+Array+1K
Things'I'learned'on'the'job,'a3er'my'CS'degree
enum EEList<Element> {
case End
indirect case Node(Element, next: EEList<Element>)
var value: Element? {
switch self {
case let Node(x, _):
return x
case End:
return nil
}
}
}
extension EEList {
func cons(x: Element) -> EEList {
return .Node(x, next: self)
}
}
Things'I'learned'on'the'job,'a3er'my'CS'degree
Why$are$Swi+$data$structures$
defined$as$structs?
Things'I'learned'on'the'job,'a3er'my'CS'degree
Swi$%data%structure%types%are%
facades%which%support
No#Destruc+ve#updates
Persistent((not(ephemeral)
Things'I'learned'on'the'job,'a3er'my'CS'degree
Is#there#(me#to#talk#about#
Singletons?
Things'I'learned'on'the'job,'a3er'my'CS'degree
Thank&you!
Things'I'learned'on'the'job,'a3er'my'CS'degree
Singleton)is)a)globaly)shared)
instance
Things'I'learned'on'the'job,'a3er'my'CS'degree
How$many$shared$instances$do$you$see$here?
private var fibRow = [0, 1, 2]
public func fibM(number:Int)->Int{
if number >= fibRow.count {
fibRow.append(fibM(number-2)+fibM(number-1))
}
return fibRow[number]
}
Things'I'learned'on'the'job,'a3er'my'CS'degree
Named&func+ons&are&shared&
instances
Things'I'learned'on'the'job,'a3er'my'CS'degree
Sharing(means(coupling
Things'I'learned'on'the'job,'a3er'my'CS'degree
Coupling)means
• Tough'to'test
• And'tough'to'reuse
The$problem$with$object0oriented$languages$is$they've$got$all$this$
implicit$environment$that$they$carry$around$with$them.$You$wanted$
a$banana$but$what$you$got$was$a$gorilla$holding$the$banana$and$the$
en<re$jungle.
—"Joe"Armstrong
Things'I'learned'on'the'job,'a3er'my'CS'degree
We#can#solve#the#coupling#problem#
by#abstract#type#defini7ons
Things'I'learned'on'the'job,'a3er'my'CS'degree
+----------------+ +----------------+
| | | |
| SomethingA +-------> | AbstractB |
| | | |
+----------------+ +-------+--------+
^
|
|
|
+-------+--------+
| |
| SomethingB |
| |
+----------------+
Things'I'learned'on'the'job,'a3er'my'CS'degree
What%about%shared%state?
Isn't&share&nothing
(self&sufficient).architecture.be3er?
Things'I'learned'on'the'job,'a3er'my'CS'degree
Shared'resources:
• Memory
• I/O
• Network
Things'I'learned'on'the'job,'a3er'my'CS'degree
Things'I'learned'on'the'job,'a3er'my'CS'degree
Not$that$bigger$problem$for
iOS/OSX&developers.
Things'I'learned'on'the'job,'a3er'my'CS'degree
Apple%takes%cares%of%it:
• default...
• shared...
• main...
Things'I'learned'on'the'job,'a3er'my'CS'degree
Be#aware#of#Amdahl's#law
The$speedup$of$a$program$using$mul2ple$processors$in$parallel$
compu2ng$is$limited$by$the$2me$needed$for$the$sequen2al$frac2on$
of$the$program.
—"Wikipedia
Things'I'learned'on'the'job,'a3er'my'CS'degree
Now$I$am$done$:)
Things'I'learned'on'the'job,'a3er'my'CS'degree
Ques%ons?
Things'I'learned'on'the'job,'a3er'my'CS'degree
Thank&you
Things'I'learned'on'the'job,'a3er'my'CS'degree
Links:
• PerformanceTest
• Fibonacci
• Fork2Join2illustra6on
• Linked2List2implementa6on2with2Swi=22Enum
• Pure2Func6onal2Data2Structures
Things'I'learned'on'the'job,'a3er'my'CS'degree

Basics of Computer Science