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