Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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