Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Wow Code, Such Read!

Wow Code, Such Read!

Abstract:
An exploration of improving at the skill of reading source code.

This talk was presented at the New Relic afterparty for RailsConf 2016 in Kansas City, MO.
Blog post: http://kwugirl.blogspot.com/2016/05/wow-code-such-read.html

40be222374e709cae7543dee233fe2e1?s=128

Katherine Wu

May 04, 2016
Tweet

Transcript

  1. @kwugirl Wow Code, Such Read! KWu Ruby Agent Engineer amaze

    understand so power
  2. @kwugirl This document and the information herein (including any information

    that may be incorporated by reference) is provided for informational purposes only and should not be construed as an offer, commitment, promise or obligation on behalf of New Relic, Inc. (“New Relic”) to sell securities or deliver any product, material, code, functionality, or other feature. Any information provided hereby is proprietary to New Relic and may not be replicated or disclosed without New Relic’s express written permission. Such information may contain forward-looking statements within the meaning of federal securities laws. Any statement that is not a historical fact or refers to expectations, projections, future plans, objectives, estimates, goals, or other characterizations of future events is a forward-looking statement. These forward-looking statements can often be identified as such because the context of the statement will include words such as “believes,” “anticipates,” “expects” or words of similar import. Actual results may differ materially from those expressed in these forward-looking statements, which speak only as of the date hereof, and are subject to change at any time without notice. Existing and prospective investors, customers and other third parties transacting business with New Relic are cautioned not to place undue reliance on this forward-looking information. The achievement or success of the matters covered by such forward-looking statements are based on New Relic’s current assumptions, expectations, and beliefs and are subject to substantial risks, uncertainties, assumptions, and changes in circumstances that may cause the actual results, performance, or achievements to differ materially from those expressed or implied in any forward-looking statement. Further information on factors that could affect such forward-looking statements is included in the filings we make with the SEC from time to time. Copies of these documents may be obtained by visiting New Relic’s Investor Relations website at ir.newrelic.com or the SEC’s website at www.sec.gov. New Relic assumes no obligation and does not intend to update these forward-looking statements, except as required by law. New Relic makes no warranties, expressed or implied, in this document or otherwise, with respect to the information provided.
  3. @kwugirl the goal: get better at reading code

  4. be fearless in diving into code you don’t know Edmond

    Lau theeffectiveengineer.com
  5. @kwugirl 2. remember your question 3. enlist help 1. see

    the code
  6. @kwugirl the problem

  7. @kwugirl the problem connection.execute("EXPLAIN #{query}")

  8. @kwugirl the problem connection.execute("EXPLAIN #{query}") SELECT "blogs".* FROM "blogs" WHERE

    "blogs"."id" = $1 LIMIT 1 with
  9. @kwugirl the problem connection.execute("EXPLAIN #{query}") SELECT "blogs".* FROM "blogs" WHERE

    "blogs"."id" = $1 LIMIT 1 with
  10. @kwugirl { :sql=>
 "SELECT \"blogs\".* FROM \"blogs\" WHERE \"blogs\".\"id \"

    = $1 LIMIT 1", … :binds=> [[#<ActiveRecord::ConnectionAdapters::PostgreSQLColumn: 0x007fd13a879e58 @array=false, @cast_type=#<ActiveRecord::ConnectionAdapters::PostgreS QL::OID::Integer:0x007fd13a87afd8 @limit=nil, @precision=nil, @range=-2147483648...2147483648, @scale=nil>,…,42]] } ActiveSupport::Notifications.subscribe 'sql.active_record'
  11. @kwugirl { :sql=>
 "SELECT \"blogs\".* FROM \"blogs\" WHERE \"blogs\".\"id \"

    = $1 LIMIT 1", … :binds=> [[#<ActiveRecord::ConnectionAdapters::PostgreSQLColumn: 0x007fd13a879e58 @array=false, @cast_type=#<ActiveRecord::ConnectionAdapters::PostgreS QL::OID::Integer:0x007fd13a87afd8 @limit=nil, @precision=nil, @range=-2147483648...2147483648, @scale=nil>,…,42]] } ActiveSupport::Notifications.subscribe 'sql.active_record'
  12. @kwugirl 2. remember your question 3. enlist help 1. see

    the code
  13. @kwugirl

  14. @kwugirl $ cd src/

  15. @kwugirl $ cd src/ $ git clone git@github.com:rails/rails.git
 $ cd

    rails/
  16. @kwugirl $ cd src/ $ git clone git@github.com:rails/rails.git
 $ cd

    rails/ $ git checkout v4.2.0
  17. @kwugirl # Gemfile gem 'rails', '4.2.0'

  18. @kwugirl # Gemfile # gem 'rails', '4.2.0' gem 'rails', :path

    => '../../src/rails'
  19. @kwugirl @instrumenter.instrument( "sql.active_record", :sql => sql, :name => name, :connection_id

    => object_id, :statement_name => statement_name, :binds => binds) { yield } def log(sql, name = "SQL", binds = [], statement_name = nil) # active_record/connection_adapters/abstract_adapter.rb
  20. @kwugirl @instrumenter.instrument( "sql.active_record", :sql => sql, :name => name, :connection_id

    => object_id, :statement_name => statement_name, :binds => binds) { yield } def log(sql, name = "SQL", binds = [], statement_name = nil) # active_record/connection_adapters/abstract_adapter.rb
  21. @kwugirl @instrumenter.instrument( "sql.active_record", :sql => sql, :name => name, :connection_id

    => object_id, :statement_name => statement_name, :binds => binds) { yield } def log(sql, name = "SQL", binds = [], statement_name = nil) # active_record/connection_adapters/abstract_adapter.rb
  22. @kwugirl def log(sql, name = "SQL", binds = [], statement_name

    = nil) @instrumenter.instrument( "sql.active_record", :sql => sql, :name => name, :connection_id => object_id, :statement_name => statement_name, :binds => binds) { yield } puts "====== HELLO IS IT ME YOU'RE LOOKING FOR?!!?? ======" # active_record/connection_adapters/abstract_adapter.rb
  23. @kwugirl git blame (can be) your friend

  24. @kwugirl 2. remember your question 3. enlist help 1. see

    the code
  25. @kwugirl don’t get lost

  26. @kwugirl don’t get lost learn one thing at a time

  27. @kwugirl don’t get lost learn one thing at a time

    what are your unknowns?
  28. @kwugirl the problem connection.execute("EXPLAIN #{query}") SELECT "blogs".* FROM "blogs" WHERE

    "blogs"."id" = $1 LIMIT 1 with
  29. @kwugirl the problem connection.execute("EXPLAIN #{query}") SELECT "blogs".* FROM "blogs" WHERE

    "blogs"."id" = $1 LIMIT 1 with
  30. @kwugirl the problem connection.execute("EXPLAIN #{query}") SELECT "blogs".* FROM "blogs" WHERE

    "blogs"."id" = $1 LIMIT 1 with
  31. @kwugirl 2. remember your question 3. enlist help 1. see

    the code
  32. @kwugirl pair programming

  33. @kwugirl pair programming ?????????? ?????????? ??????????

  34. @kwugirl

  35. @kwugirl What are you looking for?

  36. @kwugirl What are you looking for? Why?

  37. @kwugirl What are you looking for? Why? How did you

    know to look there?
  38. @kwugirl Kernel#caller

  39. @kwugirl active_record/connection_adapters/postgresql_adapter.rb:601:in `exec_cache' active_record/connection_adapters/postgresql_adapter.rb:585:in `execute_and_clear' active_record/connection_adapters/postgresql/database_statements.rb:161:in `exec_query' active_record/connection_adapters/abstract/database_statements.rb:341:in `select' active_record/connection_adapters/abstract/database_statements.rb:37:in

    `select_all' active_record/connection_adapters/abstract/query_cache.rb:70:in `select_all' active_record/querying.rb:39:in `find_by_sql' active_record/relation.rb:639:in `exec_queries' active_record/relation.rb:514:in `load' active_record/relation.rb:243:in `to_a' active_record/relation.rb:617:in `pretty_print' Kernel#caller
  40. @kwugirl Method#source_location

  41. @kwugirl Method#source_location $ bundle exec rails console

  42. @kwugirl Method#source_location $ bundle exec rails console irb(main):001:0> method(:try).source_location

  43. @kwugirl Method#source_location $ bundle exec rails console irb(main):001:0> method(:try).source_location =>

    ["/…/active_support/core_ext/object/try.rb", 62]
  44. @kwugirl the solution connection.exec_query("EXPLAIN #{statement.sql}", "Explain #{statement.name}", statement.binds) wow beauty

    wonder
  45. @kwugirl the solution connection.exec_query("EXPLAIN #{statement.sql}", "Explain #{statement.name}", statement.binds) wow beauty

    wonder
  46. @kwugirl the solution connection.exec_query("EXPLAIN #{statement.sql}", "Explain #{statement.name}", statement.binds) wow beauty

    wonder
  47. @kwugirl success!!1!one!!

  48. @kwugirl success!!1!one!! $1

  49. @kwugirl success!!1!one!! $1 }Explain plan

  50. @kwugirl success!!1!one!! released last week in 3.15.2 $1 }Explain plan

  51. @kwugirl 2. remember your question 3. enlist help 1. see

    the code
  52. @kwugirl resources

  53. @kwugirl resources readingcodegood.com

  54. @kwugirl resources readingcodegood.com schneems' talk “Dissecting Ruby with Ruby”

  55. @kwugirl resources readingcodegood.com schneems' talk “Dissecting Ruby with Ruby” schneems.com/2016/01/25/ruby-debugging-magic-

    cheat-sheet.html
 tenderlovemaking.com/2016/02/05/i-am-a-puts- debuggerer.html
  56. @kwugirl appendix

  57. @kwugirl doge The White Rabbit, Alice in Wonderland sad Keanu

    pear/pair programming Lionel Richie + Where’s Waldo !!1!one!! the “!1” phenomenon breadfish Slurms MacKenzie, Futurama