Be a library developer!

: subtitle

((*R*))emember ((*t*))han ((*I*))magine

: author

Kouhei Sutou

: institution

ClearCode Inc.

: date

2013/06/01

: allotted-time

28m

: theme

.

Table of contents

* Share this talk's goal
* Describe key idea
* Apply the key idea
* Wrap up & The next step

Share the goal

* ((*Share this talk's goal*))
* Describe key idea
* Apply the key idea
* Wrap up & The next step

This talk’s goal

((‘tag:as-large-as-possible’)) You knownhow to develop better softwares

Better?

Shownby example

API

# coderay ruby
context.save
context.circle(50, 50, 10)
context.stroke
context.restore

((‘tag:center’))((‘note:from cairo gem’))

slide property

: evaluate-code

true

API: Point

# coderay ruby
context.save    # <- Point
context.circle(50, 50, 10)
context.stroke
context.restore # <- Point

((‘tag:center’))((‘note:from cairo gem’))

slide property

: evaluate-code

true

API: Better

# coderay ruby
context.save do
context.circle(50, 50, 10)
context.stroke
end

((‘tag:center’))((‘note:from cairo gem’))

slide property

: evaluate-code

true

API: Why

Why is it better?

API: Because

Because it’s more Ruby-ish

Ruby-ish?

-ish ==n Similar to others

Is “similar” better?

* Similarity makes consistency
* Consistency makes readability
* Readability is important to develop better softwares

Is “readability” important?

* Readability makes maintenability

* Maintenability is needed for 
  improving your softwares repeatedly

So

Ruby-ish isnbetter

Let’s validate the example

Remember

File

Remember: File

# coderay ruby
# Setup
file = File.open(path)
file.read
# Teardown
file.close

Remember: File

# coderay ruby
# Setup
File.open(path) do |file|
  file.read
end # Teardown

API (reprise)

# coderay ruby
context.save    # Setup
context.circle(50, 50, 10)
context.stroke
context.restore # Teardown

((‘tag:center’))((‘note:from cairo gem’))

slide property

: evaluate-code

true

API: Better (reprise)

# coderay ruby
context.save do # Setup
  context.circle(50, 50, 10)
  context.stroke
end             # Teardown

((‘tag:center’))((‘note:from cairo gem’))

slide property

: evaluate-code

true

Wrap up

Better

Ruby-ish

In other words

Similar to others

The goal (reprise)

((‘tag:as-large-as-possible’)) You knownhow to develop better softwares

In other words

((‘tag:as-large-as-possible’)) You knownwhat is “similar” and do similarly

Describe key idea

* Share this talk's goal
* ((*Describe key idea*))
* Apply the key idea
* Wrap up & The next step

Key idea

((‘tag:left’)) ((‘tag:margin-left * 10’)) ((R))emembern((t))hann((I))magine

Remember than Imagine

# image
# src = remember-than-imagine.svg
# relative_height = 100

slide property

: enable-title-on-image

false

To remember,

# image
# src = to-remember.svg
# relative_height = 100

slide property

: enable-title-on-image

false

How to get knowledge?

* Experience
* Ask
* Observe

Experience!

* ((*Experience*)) ← Do this first!
* Ask
* Observe

Key idea

((‘tag:left’)) ((‘tag:margin-left * 10’)) ((R))emembern((t))hann((I))magine

Apply the key idea

* Share this talk's goal
* Describe key idea
* ((*Apply the key idea*))
* Wrap up & The next step

The goal (reprise)

((‘tag:as-large-as-possible’)) You knownhow to develop better softwares

Apply the key idea

# image
# src = apply-key-idea.svg
# relative_height = 100

slide property

: enable-title-on-image

false

To achieve the goal,

What should you experience?

What experience?

# image
# src = what-experience.svg
# relative_height = 100

slide property

: enable-title-on-image

false

Rubyist

# image
# src = rubyist-experience.svg
# relative_height = 100

slide property

: enable-title-on-image

false

Rubyist?

You experienced!

Try

API: Getter

# coderay ruby
window.get_property("opacity")
# What is better API???

((‘tag:center’))((‘note:from gtk2 gem’))

API: Getter (better)

# coderay ruby
window.get_property("opacity")
window.opacity # Better

((‘tag:center’))((‘note:from gtk2 gem’))

Now,

((‘tag:as-large-as-possible’)) You found “remember” is “difficult”

Difficult!

Remember!?n What isn“Ruby-ish”!?

Difficult?

# image
# src = remember-is-difficult.svg
# relative_height = 100

slide property

: enable-title-on-image

false

Because

((‘tag:as-large-as-possible’)) You don’t have experience aboutn “((R))emember ((t))han ((I))magine”

No “remember” experience

# image
# src = no-remember-experience.svg
# relative_height = 100

slide property

: enable-title-on-image

false

Your status

* Experience
* ((*Ask*)) (Heard) ← You are here!
* Observe

To achieve the goal,

What should you experience?

What experience?

# image
# src = what-experience-to-remember.svg
# relative_height = 100

slide property

: enable-title-on-image

false

Library developer

# image
# src = library-developer-experience.svg
# relative_height = 100

slide property

: enable-title-on-image

false

Library developer

Considers about

* easy to use API
  * as a Rubyist
* easy to understand document
  * as a library user

Library developer

Considers them ((*many times*))

“Many times”

It’s very good exercise

Exercises

* API
* Document

API

API: Getter (reprise)

# coderay ruby
# Low level
window.get_property("opacity")
# Better
window.opacity

((‘tag:center’))((‘note:from gtk2 gem’))

API: Better?

# coderay ruby
# Low level
window.get_property("visible")
# Better
# ???: hint: "visible" is bool

((‘tag:center’))((‘note:from gtk2 gem’))

API: Better

# coderay ruby
# Low level
window.get_property("visible")
# Better
window.visible?

((‘tag:center’))((‘note:from gtk2 gem’))

API: Getter

# coderay ruby
# Better for record as collection
record["name"]
# Better for record as object
record.name

((‘tag:center’))((‘note:from rroonga gem’))

API: Init

# coderay ruby
require "gst"
# ???
Gst.init # <- What?
Gst::ElementFactory.make("playbin")

((‘tag:center’))((‘note:from gstreamer gem’))

API: Init (usage)

# coderay ruby
require "gst"
# For advanced use
Gst.init("--gst-debug=*:9")
Gst::ElementFactory.make("playbin")

((‘tag:center’))((‘note:from gstreamer gem’))

API: Init (better)

# coderay ruby
require "gst"
# Make optional
# Gst.init
Gst::ElementFactory.make("playbin")

((‘tag:center’))((‘note:from gstreamer gem’))

API: Init (impl)

# coderay ruby
class << Gst
  def const_missing(name)
    init; const_get(name); end
  def init(*argv)
    # ...initialize library...
    class << self
      remove_method(:const_missing)
    end; end; end

((‘tag:center’))((‘note:from gstreamer gem’))

Document

Document: Install

Install:

For Debian GNU/Linux:
  % sudo apt-get install libgtk2.0-dev
  % gem install gtk2
For OS X:
  ...

Document: Better

Install:

% gem install gtk2

((‘tag:center’))((‘note:libgtk2-0-dev is installed automatically’))

((‘tag:center’))((‘note:“gem install GEM_NAME” is popular install way’))

Exercises end

* We remembered about\n
  "what is similar?"
* We done "similarly"

Do you understand aboutn“((R))emember ((t))han ((I))magine”?

Wrap up

* Share this talk's goal
* Describe key idea
* Apply the key idea
* ((*Wrap up*)) & The next step

This talk’s goal

((‘tag:as-large-as-possible’)) You knownhow to develop better softwares

Better

Ruby-ishn Similar to others

Goal: In other words

((‘tag:as-large-as-possible’)) You knownwhat is “similar” and do similarly

Key idea

((‘tag:left’)) ((‘tag:margin-left * 10’)) ((R))emembern((t))hann((I))magine

Remember than Imagine

# image
# src = remember-than-imagine.svg
# relative_height = 100

slide property

: enable-title-on-image

false

For development

* Experience Rubyist for ((*knowledge*))
* Then ((*remember*)) the knowledge
  * But it is difficult because 
    you don't have experience about "((*remember*))"

No “remember” experience

# image
# src = no-remember-experience.svg
# relative_height = 100

slide property

: enable-title-on-image

false

Experience lib developer

It’s very good exercise

The next step

* Share this talk's goal
* Describe key idea
* Apply the key idea
* Wrap up & ((*The next step*))

The next step

Use “library developer” experience to other things

For example,

Use it to develop other softwares

Develop other softwares

You can remember about

* a better bug report
  * How to reproduce?
* a better patch
  * How to commit? (size? message?)

Conclusion

Be a library developer!

FYI

  # image
  # src = clear-code.svg
  # relative_height = 20

* We accept applications about our internship
  * You can develop a library with us

Bonus tracks

* Similar vs. Innovation
* No "imagine" communication\n

Similarnvs.nInnovation

Innovation

* Doing "similarly" will not achieve "innovation"
* Should all we aspire innovation?

No

* We have regular life
* It's also important that\n
  we improve our regular life

Non“imagine” communication

No “imagine”

* Show all u need from the start
  * Don't omit anything
  * If you emit something,\n
    other people need "imagine"
* Use your experience for it!

Key idea

((‘tag:left’)) ((‘tag:margin-left * 10’)) ((R))emembern((t))hann((I))magine