The Well Rounded Engineer - Critical Path

Download as pdf or txt
Download as pdf or txt
You are on page 1of 129

The Well Rounded

Engineer: Critical Path


One step at a time. !
Swanand Pagnis
" Director of Engineering at Deserve
🍻 meetup.com/Bangalore-Ruby-Users-Group/
📔 info.pagnis.in
% postgres-workshop.com
This talk is about
crossing or getting near
the horizontal blue line.
Target Audience:
Web based application developers,
with a slight lean towards back-end developers.
A core skill or
category of core skills
What can you do to
improve them?
Some interview skills
What can you do to
improve them?
Before we begin…
Some process tips:
Find peers; learn
together
Be accountable
Hold them accountable
Get rid of the trial-
and-error method
Take a very analytical
approach
Learn how to read
research papers, specially
older papers.
Bleeding edge is often
overrated
Write summaries of
things you study
Spaced repetition helps
you get over the I'll-
never-use-this-syndrome
1. Paradigm Polyglot
Be proficient in two
paradigms. 🍎 🍊
Preferably OOP and FP.
Proficient =
Being able to write non-
trivial programs.
e.g. A Message Broker,
A Web Crawler, An API
Wrapper etc.
Boundaries are being
blurred by languages
like Go and Scala.
- Go, Java, Javascript
- Ruby, Python
- Haskell, OCaml
Pick one from each.
Choose based on
comfort & current skill.
Bonus:
- Prolog, Factor, Idris
- Lisp, Scheme, Clojure
My personal choice:
Ruby, OCaml, Prolog
For Ruby:
Avdi Grimm's
Confident Ruby
For OCaml:
Real World OCaml by
Yaron Minsky et al
For Haskell:
Haskell Book by
Chris A. and Julie M.
For Prolog:
Exercism Track and 99
Prolog Problems
Strongly
recommended:
Prof. Dan Grossman's "Programming Languages"
on Coursera. Life changing course.
This course will
help you understand
programming languages
on a fundamental level.
2. Database Polyglot
Be proficient in using
two types of databases.
The two types are:
RDBMS and NoSQL*.
Duh.
*NoSQL is too broad, but again, pick something closer to your
preferred stack.
Conversant =
- Model your data
- Be performance aware
- Write raw SQL
Proficient =
- Idiomatic design
- Be operations aware
- Grok SQL
In general, proficiency is
about understanding
trade-offs.
In depth understanding
of SQL is a competitive
advantage.
- MySQL, PostgreSQL
- Dynamo, Bigtable
- Redis, Spanner, Neo4j
For PostgreSQL:
Dmitri Fontaine's
Mastering PostgreSQL in
Application Development
For MySQL:
Baron Schwartz's High
Performance MySQL
For DynamoDB:
DynamoDBGuide.com,
AWS's Dynamo Paper
Books and guides are
just a start, specially
when it comes to DBs.
3. Protocol Polyglot
Be proficient in using
two types of network
protocols. 🏏)
Preferably
TCP/IP and HTTP.
Proficient =
- How it works
- How to debug issues
- Design considerations
Proficient =
- Familiarity w/ SSL, TLS
- App layer integration
- Sockets & ports
Start here:
Ilya Grigorik's High
Performance Browser
Networking
For TCP and Sockets:
Jesse Storimer's
Working With TCP
Sockets
For HTTP:
- Read RFC 7231
- Optionally: RFC 2616
4. Proficiency with
build tooling,
packaging and
distribution of software
How does the code you
write reach your users?
Proficiency =
Being able to use these
tools and tweak,
change what's needed
For a Go programmer:
Intimately understand
go build
For a Rubyist:
Understand how Gems
are packaged, distributed,
and loaded at runtime.
For a Rubyist:
guides.rubygems.org
For everyone:
Write a simple build
tool.
What does it do?
- Takes an opinionated
directory structure
- Compiles / runs your
multi-file program
What does it do next?
- Tackle simple
dependencies
- Build a jar / zip like
package
5. Ability to analyse,
reason about and
debug programs.
Reading & reviewing code
Debug running programs
Observability &
instrumentation
Reading & reviewing
code
Develop a habit of reading,
reviewing, and explaining
every single line of code
you write or review.
This includes
whitespaces, empty
lines, config files,
dotfiles, comments
The 5-whys are your
friend.
Develop a habit of
reading library and open
source code. They're
often idiomatic.
Debug running
programs
Use GDB or your
favourite step-by-step
debugger on a process
running in QA / Staging
Setup IntelliJ or your
favourite editor to
trivially run debug mode,
and step through code
Write a *very simple*
sampling profiler for
your language.
Julia Evans' talk about
her building rbspy is full
of good information
Optionally:
Read the ptrace
manpages. 3 times.
Observability and
instrumentation
Inculcate observability
in your process of
writing software.
honeycomb.io 's
Observability Guide.
Cindy Sridharan's
Observability Book
How can I reliably
answer a question
about a system, without
prying open the system.
6. Deployments,
Infrastructure, and
DevOps
Proficiency !=
Writing an Ansible clone
Proficiency =
Understanding when
you need Ansible clone
Write a simple
Capistrano like
deployment system
Keep it opinionated,
and bare minimum.
7. Familiarity with
software architecture
principles, and basic
scaling techniques.
Understand how to
design commonly used
systems
e.g. How to use
workers, queues, and
async processing
e.g. How to design a
data pipeline
e.g. How to design
simple load balancers
e.g. MapReduce™ and
similar data processing
patterns
Martin Kleppmann's
Designing Data
Intensive Applications
Michael Keeling's
Design It!
Solve a few "scaling"
problems from Gayle
McDowell's Cracking
the Coding Interview.
8. Ability to write toy
compilers,
interpreters, and
parsers
🎉
This is the most fun
section.
This is also a very useful
interview skill.
Start with parsers, then
interpreters, and finally
compilers.
Do not start at 🐉 book
Work through Graham
Hutton's "Higher Order
Functions for Parsing"
Then work through
Peter Norvig's Lispy:
norvig.com/lispy.html
Once you're confident,
attempt to write a
JSON or YAML parser.
Recursive descent
parsers open you up to a
whole new coding style
Racket/Scheme/
Haskell/OCaml are ideal
for writing compilers.
For compilers, work
through "An
incremental approach to
compiler construction"
9. Ability to write toy
games
Again a very useful
interview skill
Games can have
arbitrary changing
requirements.
Games typically adhere
to a specific set of rules
With games, come
game playing bots.
Write a simple game with
minimal or ascii graphics:
Snake, Minesweeper,
Jumper Frog, etc
Avoid unity or other
frameworks, try from
first principles.
Then write a bot that
plays that game
If you like doing that,
read about general
game play: Bots that
can play *any* game.
10. Ability to
understand algorithmic
analysis and solve
algorithmic problems
Yet another useful
interview skill
But an equally useful
programming skill
Understand the
fundamental approach
of solving problems
recursively.
Understand the
"master method" to
analyse recursive
solutions.
Cracking The Coding
Interview
InterviewCake
Tim Roughgarden's
Course on Coursera
- This is a challenging
course
Putting it all
together
Make a plan
One thing at a time
Focus hard on it
Prioritize fundamental,
foundational skills
Do not go too far away
from current skillset
Get in the habit of writing
things down: notes,
reviews, retrospectives.
Process tips again,
they're that important
Find peers; learn
together
Be accountable
Hold them accountable
Get rid of the trial-
and-error method
Take a very analytical
approach
Learn how to read
research papers, specially
older papers.
Bleeding edge is often
overrated
Write summaries of
things you study
Spaced repetition will get
you get over the I'll-
never-use-this syndrome
Thank you!
Tell me about your process.
Swanand Pagnis
" Director of Engineering at Deserve
🍻 meetup.com/Bangalore-Ruby-Users-Group/
📔 info.pagnis.in
% postgres-workshop.com

You might also like