basics of computer science

57
Basics of Computer Science Maxim Zaks @iceX33 Things I learned on the job, a3er my CS degree

Upload: maxim-zaks

Post on 14-Apr-2017

342 views

Category:

Education


4 download

TRANSCRIPT

Basics&of&Computer&ScienceMaxim&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%StructuresArray,&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%supportNo#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