Slide 1

Slide 1 text

The Well Rounded Engineer: Critical Path One step at a time. !

Slide 2

Slide 2 text

Swanand Pagnis " Director of Engineering at Deserve meetup.com/Bangalore-Ruby-Users-Group/ info.pagnis.in % postgres-workshop.com

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

This talk is about crossing or getting near the horizontal blue line.

Slide 5

Slide 5 text

Target Audience: Web based application developers, with a slight lean towards back-end developers.

Slide 6

Slide 6 text

A core skill or category of core skills What can you do to improve them?

Slide 7

Slide 7 text

Some interview skills What can you do to improve them?

Slide 8

Slide 8 text

Before we begin…

Slide 9

Slide 9 text

Some process tips:

Slide 10

Slide 10 text

Find peers; learn together Be accountable Hold them accountable

Slide 11

Slide 11 text

Get rid of the trial- and-error method Take a very analytical approach

Slide 12

Slide 12 text

Learn how to read research papers, specially older papers. Bleeding edge is often overrated

Slide 13

Slide 13 text

Write summaries of things you study Spaced repetition helps you get over the I'll- never-use-this-syndrome

Slide 14

Slide 14 text

1. Paradigm Polyglot

Slide 15

Slide 15 text

Be proficient in two paradigms.

Slide 16

Slide 16 text

Preferably OOP and FP.

Slide 17

Slide 17 text

Proficient = Being able to write non- trivial programs.

Slide 18

Slide 18 text

e.g. A Message Broker, A Web Crawler, An API Wrapper etc.

Slide 19

Slide 19 text

Boundaries are being blurred by languages like Go and Scala.

Slide 20

Slide 20 text

- Go, Java, Javascript - Ruby, Python - Haskell, OCaml

Slide 21

Slide 21 text

Pick one from each. Choose based on comfort & current skill.

Slide 22

Slide 22 text

Bonus: - Prolog, Factor, Idris - Lisp, Scheme, Clojure

Slide 23

Slide 23 text

My personal choice: Ruby, OCaml, Prolog

Slide 24

Slide 24 text

For Ruby: Avdi Grimm's Confident Ruby

Slide 25

Slide 25 text

For OCaml: Real World OCaml by Yaron Minsky et al

Slide 26

Slide 26 text

For Haskell: Haskell Book by Chris A. and Julie M.

Slide 27

Slide 27 text

For Prolog: Exercism Track and 99 Prolog Problems

Slide 28

Slide 28 text

Strongly recommended: Prof. Dan Grossman's "Programming Languages" on Coursera. Life changing course.

Slide 29

Slide 29 text

This course will help you understand programming languages on a fundamental level.

Slide 30

Slide 30 text

2. Database Polyglot

Slide 31

Slide 31 text

Be proficient in using two types of databases.

Slide 32

Slide 32 text

The two types are: RDBMS and NoSQL*. Duh. *NoSQL is too broad, but again, pick something closer to your preferred stack.

Slide 33

Slide 33 text

Conversant = - Model your data - Be performance aware - Write raw SQL

Slide 34

Slide 34 text

Proficient = - Idiomatic design - Be operations aware - Grok SQL

Slide 35

Slide 35 text

In general, proficiency is about understanding trade-offs.

Slide 36

Slide 36 text

In depth understanding of SQL is a competitive advantage.

Slide 37

Slide 37 text

- MySQL, PostgreSQL - Dynamo, Bigtable - Redis, Spanner, Neo4j

Slide 38

Slide 38 text

For PostgreSQL: Dmitri Fontaine's Mastering PostgreSQL in Application Development

Slide 39

Slide 39 text

For MySQL: Baron Schwartz's High Performance MySQL

Slide 40

Slide 40 text

For DynamoDB: DynamoDBGuide.com, AWS's Dynamo Paper

Slide 41

Slide 41 text

Books and guides are just a start, specially when it comes to DBs.

Slide 42

Slide 42 text

3. Protocol Polyglot

Slide 43

Slide 43 text

Be proficient in using two types of network protocols. )

Slide 44

Slide 44 text

Preferably TCP/IP and HTTP.

Slide 45

Slide 45 text

Proficient = - How it works - How to debug issues - Design considerations

Slide 46

Slide 46 text

Proficient = - Familiarity w/ SSL, TLS - App layer integration - Sockets & ports

Slide 47

Slide 47 text

Start here: Ilya Grigorik's High Performance Browser Networking

Slide 48

Slide 48 text

For TCP and Sockets: Jesse Storimer's Working With TCP Sockets

Slide 49

Slide 49 text

For HTTP: - Read RFC 7231 - Optionally: RFC 2616

Slide 50

Slide 50 text

4. Proficiency with build tooling, packaging and distribution of software

Slide 51

Slide 51 text

How does the code you write reach your users?

Slide 52

Slide 52 text

Proficiency = Being able to use these tools and tweak, change what's needed

Slide 53

Slide 53 text

For a Go programmer: Intimately understand go build

Slide 54

Slide 54 text

For a Rubyist: Understand how Gems are packaged, distributed, and loaded at runtime.

Slide 55

Slide 55 text

For a Rubyist: guides.rubygems.org

Slide 56

Slide 56 text

For everyone: Write a simple build tool.

Slide 57

Slide 57 text

What does it do? - Takes an opinionated directory structure - Compiles / runs your multi-file program

Slide 58

Slide 58 text

What does it do next? - Tackle simple dependencies - Build a jar / zip like package

Slide 59

Slide 59 text

5. Ability to analyse, reason about and debug programs.

Slide 60

Slide 60 text

Reading & reviewing code Debug running programs Observability & instrumentation

Slide 61

Slide 61 text

Reading & reviewing code

Slide 62

Slide 62 text

Develop a habit of reading, reviewing, and explaining every single line of code you write or review.

Slide 63

Slide 63 text

This includes whitespaces, empty lines, config files, dotfiles, comments

Slide 64

Slide 64 text

The 5-whys are your friend.

Slide 65

Slide 65 text

Develop a habit of reading library and open source code. They're often idiomatic.

Slide 66

Slide 66 text

Debug running programs

Slide 67

Slide 67 text

Use GDB or your favourite step-by-step debugger on a process running in QA / Staging

Slide 68

Slide 68 text

Setup IntelliJ or your favourite editor to trivially run debug mode, and step through code

Slide 69

Slide 69 text

Write a *very simple* sampling profiler for your language.

Slide 70

Slide 70 text

Julia Evans' talk about her building rbspy is full of good information

Slide 71

Slide 71 text

Optionally: Read the ptrace manpages. 3 times.

Slide 72

Slide 72 text

Observability and instrumentation

Slide 73

Slide 73 text

Inculcate observability in your process of writing software.

Slide 74

Slide 74 text

honeycomb.io 's Observability Guide.

Slide 75

Slide 75 text

Cindy Sridharan's Observability Book

Slide 76

Slide 76 text

How can I reliably answer a question about a system, without prying open the system.

Slide 77

Slide 77 text

6. Deployments, Infrastructure, and DevOps

Slide 78

Slide 78 text

Proficiency != Writing an Ansible clone

Slide 79

Slide 79 text

Proficiency = Understanding when you need Ansible clone

Slide 80

Slide 80 text

Write a simple Capistrano like deployment system

Slide 81

Slide 81 text

Keep it opinionated, and bare minimum.

Slide 82

Slide 82 text

7. Familiarity with software architecture principles, and basic scaling techniques.

Slide 83

Slide 83 text

Understand how to design commonly used systems

Slide 84

Slide 84 text

e.g. How to use workers, queues, and async processing

Slide 85

Slide 85 text

e.g. How to design a data pipeline

Slide 86

Slide 86 text

e.g. How to design simple load balancers

Slide 87

Slide 87 text

e.g. MapReduce™ and similar data processing patterns

Slide 88

Slide 88 text

Martin Kleppmann's Designing Data Intensive Applications

Slide 89

Slide 89 text

Michael Keeling's Design It!

Slide 90

Slide 90 text

Solve a few "scaling" problems from Gayle McDowell's Cracking the Coding Interview.

Slide 91

Slide 91 text

8. Ability to write toy compilers, interpreters, and parsers

Slide 92

Slide 92 text

No content

Slide 93

Slide 93 text

This is the most fun section.

Slide 94

Slide 94 text

This is also a very useful interview skill.

Slide 95

Slide 95 text

Start with parsers, then interpreters, and finally compilers.

Slide 96

Slide 96 text

Do not start at book

Slide 97

Slide 97 text

Work through Graham Hutton's "Higher Order Functions for Parsing"

Slide 98

Slide 98 text

Then work through Peter Norvig's Lispy: norvig.com/lispy.html

Slide 99

Slide 99 text

Once you're confident, attempt to write a JSON or YAML parser.

Slide 100

Slide 100 text

Recursive descent parsers open you up to a whole new coding style

Slide 101

Slide 101 text

Racket/Scheme/ Haskell/OCaml are ideal for writing compilers.

Slide 102

Slide 102 text

For compilers, work through "An incremental approach to compiler construction"

Slide 103

Slide 103 text

9. Ability to write toy games

Slide 104

Slide 104 text

Again a very useful interview skill

Slide 105

Slide 105 text

Games can have arbitrary changing requirements.

Slide 106

Slide 106 text

Games typically adhere to a specific set of rules

Slide 107

Slide 107 text

With games, come game playing bots.

Slide 108

Slide 108 text

Write a simple game with minimal or ascii graphics: Snake, Minesweeper, Jumper Frog, etc

Slide 109

Slide 109 text

Avoid unity or other frameworks, try from first principles.

Slide 110

Slide 110 text

Then write a bot that plays that game

Slide 111

Slide 111 text

If you like doing that, read about general game play: Bots that can play *any* game.

Slide 112

Slide 112 text

10. Ability to understand algorithmic analysis and solve algorithmic problems

Slide 113

Slide 113 text

Yet another useful interview skill

Slide 114

Slide 114 text

But an equally useful programming skill

Slide 115

Slide 115 text

Understand the fundamental approach of solving problems recursively.

Slide 116

Slide 116 text

Understand the "master method" to analyse recursive solutions.

Slide 117

Slide 117 text

Cracking The Coding Interview

Slide 118

Slide 118 text

InterviewCake

Slide 119

Slide 119 text

Tim Roughgarden's Course on Coursera - This is a challenging course

Slide 120

Slide 120 text

Putting it all together

Slide 121

Slide 121 text

Make a plan One thing at a time Focus hard on it Prioritize fundamental, foundational skills

Slide 122

Slide 122 text

Do not go too far away from current skillset Get in the habit of writing things down: notes, reviews, retrospectives.

Slide 123

Slide 123 text

Process tips again, they're that important

Slide 124

Slide 124 text

Find peers; learn together Be accountable Hold them accountable

Slide 125

Slide 125 text

Get rid of the trial- and-error method Take a very analytical approach

Slide 126

Slide 126 text

Learn how to read research papers, specially older papers. Bleeding edge is often overrated

Slide 127

Slide 127 text

Write summaries of things you study Spaced repetition will get you get over the I'll- never-use-this syndrome

Slide 128

Slide 128 text

Thank you! Tell me about your process.

Slide 129

Slide 129 text

Swanand Pagnis " Director of Engineering at Deserve meetup.com/Bangalore-Ruby-Users-Group/ info.pagnis.in % postgres-workshop.com