geek!daily

... it is by will alone i set my mind in motion ...

RubyConf 2007 Slide Roundup

Haven't been able to find a definitive source for the slides from RubyConf and, judging from my referrer logs, many others are also looking. Here's my attempt to gather a reference to them in one place; I've just copied the schedule from the RubyConf site and am adding links as I find them. I'll update this as I find more (and please tell me if you know where to find them =)

UBER-UPDATE: Ryan Davis (aka zenspider) keeps an annual repository of the RubyConf presentations. He hasn't posted 2007 yet, but here's links to 2006, 2005, 2004, 2003, and 2002. Very nice.

UPDATES:

  • 20071119: Added link for Luke Kanies' "Essential Incompleteness" talk
  • 20071117: Added link for Andrea O.K. Wright's "Building Games with Ruby" talk
  • 20071117: Added link for Ben Bleything's "Controlling Electronics" talk
  • 20071115: Added link for Charles Nutter's "JRuby" talk
  • 20071114: Added link for Eric Ivancich's "Ropes" talk

RubyConf 2007

Charlotte, North Carolina

Friday November 2

Morning

9:00 Welcome
9:30 Marcel Molina What Makes Code Beautiful? [note: from Ruby Hoedown, anyone seen a more recent deck?]
10:30 Jim Weirich Advanced Ruby Class Design

Afternoon

Room 1

1:00 Nathaniel Talbott Why Camping Matters
2:00 Shunichi Shinohara and Kiwamu Kato Introduction to AP4R, Asynchronous Processing for Ruby
3:00 Nathan Sobo Treetop: Bringing the Elegance of Ruby to Syntactic Analysis
4:00 Paul Brannan Avoiding Pitfalls in C Extensions

Room 2

1:00 Ben Bleything Controlling Electronics with Ruby [note: blog post with slides and other goodies]
2:00 Andrea O.K. Wright High Art on Top of Low-Level APIs: Building Games with Ruby
3:00 Eric Ivancich Ropes: An Alternative to Ruby's Strings
4:00 Ryan Davis Hurting Code for Fun and Profit

Room 3

Ruby Clinic, an expert-guided afternoon of troubleshooting, fixing, and learning. Bring your questions and problems! (Experts to be announced.)

Evening

Town meeting with Yukihiro "Matz" Matsumoto, creator of Ruby

Saturday November 3

Morning

9:00 John Lam State of IronRuby
10:00 Charlie Nutter JRuby: Ruby for the JVM
[note: you may need to ctrl-click/right-click and download the link manually]
11:00 Evan Phoenix Rubinius 1.0

Afternoon

Room 1

1:00 Ed Borasky Profiling and Tuning Ruby 1.8
2:00 Phil Hagelberg Tightening the Feedback Loop
3:00 Eric Hodel Maximizing Productivity
4:00 Francis Hwang Conversations vs. Laws: What do we mean when we say Ruby is dynamic?

Room 2

1:00 Luke Kanies Essential Incompleteness in Program Modeling [note: blog post with link to slides]
2:00 Bruce Williams Writing Client and Desktop Applications in Ruby
3:00 Michael Neumann Efficient Ruby to Javascript Compilation and Applications
4:00 Laurent Sansonetti Mac OS X Loves Ruby

Room 3

Stuart Halloway presents Refactotum: Ruby, an afternoon presentation and workshop on the skills you need to prepare and contribute code to open source projects.

Evening

Keynote by Matz

Sunday, November 4

Morning

9:00 Dr Nic Williams Use Ruby to Generate More Ruby - RubiGen is Everywhere
10:00 David Chelimsky, Dave Astels Behaviour Driven Development with RSpec
11:00 Jay Phillips Next-Gen VoIP Development with Ruby and Adhearsion

Afternoon

Room 1

1:00 William Bereza Enhancing Embedded Development with Ruby
2:00 Kyle Maxwell JRuby in the Wild
3:00 Ben Scofield Cleanliness Is Next to Domain Specificity

Talk Room 2

1:00 Justin Gehtland Ruby and Identity: OpenID, CAS and Information Card [blog post,not slides]
2:00 Erik Hatcher solr-ruby: the best open source engine + ruby
3:00 Aaron Bedra Sploitin' with Ruby (Point, Click, Root)

2007.11.12 in RubyConf 2007 | Permalink | Comments (5) | TrackBack (0)

RubyConf, Day 2: Maximizing Productivity

Don't reinvent it if it doesn't exist; extend what exists.

Don't be a coding superhero -- you don't need the latest, greatest

Be selfish: fix your own problems first, and don't even feel like you need to release (but do share that you did something like that somewhere that others might notice)

KISS and YAGNI. Don't distract yourself.

YAGNITAGAFI: ...they aint' gonna ask for it. Invest in your own features, don't make guesses about what they'll want. They'll tell you. They may even write it themselves.

Test: tell your future self (and others) what you know is necessary and what you think might break.

Autotest to keep yourself from forgetting to test related things.

Keep everything in sight: Eric likes to be able to see his four shells: code, test, autotest, terminal) in quadrants of the screen. Keeps the edge of chat window handy. Uses SSH Keychain and SpiritedAway to keep essential bits on the menubar/tab accessible.

Use Heckle.

Automate everything: setup, migrations, common tasks. Automating setup is good self-defense against support requests.

Know (and love) your editor. [me: it's your primary tool, of course].

Pair programming [me: Eric pairs with zenspider; I've heard them called "peas and carrots" ;]

Ping-pong pairing: write a test, other person fixes and writes next test.

Polish your docs just before release (but rdoc along the way). README == quick start guide, synopsis and feature overview, links to bug tracker and rdoc. [I'd add contact info for developer]

Set up a bugtracking with no anonymous submissions. Don't keep it in your email or a mailing list. It opens up the debugging and fixing to the community of users.

Have a review partner beat on your code just before release. Local ruby user's group is a good source. =]

Releasing with Hoe: packaging uploads emails and blogs all taken care of. This makes it possible to release lightly and often. Small changesets. Less complexity, easier to pin down introduction of problems.

Go have a life! =]

Maintenance

Bug trackers allow collaboration and reduce the load on you. Except when they don't and instead send it to your email (or mailing lists, or blogs, or somewhere). Find them and move them into the bug tracker.

Version your tools meaningfully and consistently. (e.g. v1.2.3 == major minor bugs)

Don't fear breaking your code into the natural components when it grows too big to be easily dealt with. Find the natural divisions (and dependencies) and pull it apart.

Inspiration

"I don't owe you" ... "right now". You released it to the world so you agreed to help them, but it's okay not to drop everything. Be okay with criticism; the critic might dig in and fix it themselves.

Go to a HackNight/HackFest. Talk to people. Help them with their projects; they'll help you with yours. Go to the pre-/post- dinner/drinks where your laptop isn't out so you'll think and talk.

Look to other domains for interesting ideas. autotest was inspired by Smalltalk.

Answer your own annoyances -- automate or change your workflow. IMAPCleanse was written to read ruby-talk and flag messages that are interesting, and delete aging, unread messages.

Q: What bugtracker do you recommend?
A: Eric tends to use RubyForge, doesn't have a favorite.

Q: IMAPCleanse for ...?
A: ruby-talk, primarily. Very hard in that volume to keep track of a thread. Then use smart folders to highlight types of messages. [me: would be interesting to see email divided by tabs/sets like for a given mailing list or interest like "New Threads", "Old Threads I Replied To", "Old Threads I Didn't Reply To"]

Q; How much time do you spend communicating with the community? Do you close out the world occasionally?
A: Think week-to-week, not day-to-day.

Q: How do you pair program?
A: Ryan and Eric ping-pong at one screen, one keyboard. Turns into a contest to write the perfect failure test to force the other to spend maximum time coding the fix. "Coding Gang Bang" ... give a person a big window on the projector and all they can do is type what they're told. [me: yike! I don't wanna be the typist!]

Q: How much time do you spend on open source projects?
A: Sometimes a lot, sometimes a little. Depends on interest. Used to do a lot more but then hit burnout. Balance is very important. Smaller, simpler changes.

Q: What happened to Robot Coop?
A: I left and worked for LimeWire for a while, left in August to decompress (worked on RubyGems) and now working on a top secret project.

Q: You work closely with Ruby Core and have been thinking about productivity ... what do you think needs tweaking?
A: Hard to say. The biggest problem is language barrier. ruby-dev's titles are usually in english, so you can know what they're talking about but not what they're saying. ;]
A: (from bug manager on RubyForge project): Would love to see unification on one bug tracker.

Q: You talked about the importance of bugtrackers. The impression is that Ruby Core wants to have bugs/patches submitted to the mailing list, not a tracker.
A: (Matz) It's easier for me [...] because I'm mail based.

Q: Do you have a method size limit?
A: Yes! Roughly one window high (~26 lines). [me: shades of what Drew's been

Q: Do you lmit how long your rdoc is?
A: If it's that long, the code should likely be refactored as it's too complicated and needs that much explanation.

Q; What if you want to document mindset or why you chose a particular implementation?
A; I make it a short note at the end of the line(s) where the implementation choice was made.

Q: What methods do you use to increase coding speed?
A: I type on QWERTY (Ryan: "No, you don't!") Oh yeah, what am I saying, I type Dvorak (audience: Yay for pair programming!). Don't change your keycaps or you won't learn to touchtype. Autotest shaves a lot of time, ~2-10s per test run.

Q: Using autotest, do you just not save interim (e.g. broken) code?
A: No, autotest has trained me not to. Instead, I write small pieces. Small test. Small method. Saves every 30 seconds or so.

Q: How do you make it easier to pick up what you working on some time ago (a day or more)?
A; I break the work into chunks of a day or less, or spend a day in exploration.

Q: How do you go about becoming a better coder?
A: Pair programming. Test-first. Seeing what other people do and challenging their beliefs. Keep learning.

2007.11.03 in Ruby/Rails, RubyConf 2007 | Permalink | Comments (2) | TrackBack (0)

RubyConf, Day 2: Essential Incompleteness in Program Modeling

Ahhhh ... sleep makes all better. I came late today, caught the Rubinius part of the plenary and so didn't have any comfortable way to live blog it ... so I didn't.

Walking our way to Godel's incompleteness, in a hand-wavy sort of way.

This statement is false.

This statement is true (but not provable as English has no axioms)

Godel theorem requires completeness and consistency

Completeness: all statements are true and provable

Consistency: all statements relate/are built on other statements.

Godel says: Any sufficiently complex system cannot be complete or consistent. No sane person sacrifices consistency, so all (useful) modeled systems will be incomplete.

Godel's quine: This statement is not provable.

Godel's theorem is general, not specific to mathematics.

Barrow's first law: Any Universe simple enough to be understood is too simple to produce a mind able to understand it.

As folks were investigating set theory and real numbers, hoping these were a system which modeled reality completely and consistently. Bertrand Russell theorized "the set of all sets which do not contain themselves" which is paradoxical. This was disturbing, so they worked to define the system (Principia Mathematica) to eliminate the self-referential nature. Three volumes into this, Godel busted them with his theorem.

Applying this to Your Code

Don't make inifinite stacks.

Three parts: reality, your model of it, and your implementation of your model. You know your model will be incomplete *and you control in what ways it's incomplete*. Exercise your power consciously.

Applying Ramachandran energy modeling theory: Think of it as potential vs. kinetic energy. Predecision is potential: high energy state, etc.; post-decision starts you in motion, low energy and low tension, high movement. [me: he should have given a one sentence summation or Ramachandran theory at the top of this section; not doing so bogged him down].

He made some observations re: high vs. low energy states, largely urging that you stay in high energy state as long as you can/need. [me: His observations seem to relate to some interpretations of Wilfred Bion's work re: group psychology re: groups in working state being high tension]

Decisions == energy deltas. Unmade decisions are high energy; made, low. Many unmade is expensive but flexible, most made is cheap but less flexible.

Make decisions as late as possible -- you'll know more. And now we've derived agile programming as a good idea.

Asymptotes: lines or curves which approach a line or curve arbitrarily closely without touching.

"You can't perfectly match reality but you can asymptotically approach it"

Spending time on your model progressively increases the resolution of the model. Move the asymptote closer; don't take "iteration" to mean "new approach" unless you can't get closer with your current approach.

Math hurts your brain in new and interesting ways, provides new ways to think about our problems, and is wicked fun. =]

In 1979, Doug Hofstadter blew our minds with "Godel Escher Bach" ... over a quarter century later, the underlying ideas are still engaging a roomful of people. Excellent. Meanwhile, in 2001, JP Lewis gave a similar talk at SIGGRAPH which was poorly received (and horribly, boringly delivered, despite him being a fundamentally interesting person and having a pile of humorous anecdotes from production). Luke's presented it in a better context and with richer, more interesting sources.

2007.11.03 in Ruby/Rails, RubyConf 2007 | Permalink | Comments (0) | TrackBack (0)

RubyConf, Day 1, 4p: Hurting Code for Fun & Profit

Ahhh, a nap makes all well. Last session of the day. Okay, you want to see these slides and the video once it's posted by ConFreaks.

"Legacy code is any code you haven't written."

"People will press charges if you hurt them. Code won't."

"My name is Ryan and I like to hurt code. And I'm OK."

Ruby Sadism: deriving pleasure from inflicting pain on software, esp. bad software.

Ruby Asceticism: cahracterized by or ... [not fast enough, in the slides] ... self-discipline

unit test is self discipline, YAGNI is abstention

"Technical debt: skipping design is like borrowing money, refactoring is like repaying principal, interest is paid as time dealing with complexity." -- Ward Cunningham, ComplexityAsDebt, c2.com

Use the Pareto Principle (aka 80/20 rule) to focus efforts

Increase the signal:noise ratio. Big alligators, little alligators, swamp.

"A developer's obligation is to make sure that the code as written makes the clearest possible statement as to how the solution was understood ..." --Ward Cunningham, TechnicalDebt

Introspection Oriented Design: Find the "I" ... how did I miss that bug, where did I go wrong.

[HE QUOTED COVEY'S FOUR QUADRANTS! I'M VERY EXCITED! COULD YOU TELL?]

Expand your mind; more knowledge is better.

Write a lot of code. Make a lot of mistakes. Learn.

Push yourself, then push yourself more.

Mentarbator vs. Code Cowboy ... find your sweet spot in the middle.

Tools to Help

Continuous integration and Autotest (with the doom guy)

Flog: complexity reporter based on ABC metrics; the higher the score, the harder to test.

Coverage tools: good to spot gaps, but don't tell you the quality of your tests. 100% coverage with bad tests means nothing

Heckle: test mutator; if your tests pass after heckle, your tests are bad.

Be passionate. If you love your code, hate it, hurt it.

Q: Doesn't using emacs violate your complexity rules?
A: Hey, I need an operating system, don't I?

Q: When does [code-generation] violate complexity?
A: When it gives you a bad feeling.

Q: How much does your Evergreen background influence your philosophy?
A: Probably inverted my philosophy influenced the school I was compatible with. Stalker.

Q: You talked about design and about how you should always be thinking about it. Should you design the whole thing in advance or what (Chelimsky)
A: I design iteratively, TDD-based. If you try to solve the whole problem up front, you're going to have issues that many have written about.

Q: How do you work with people who write bad code?
Hoy: I've seen him make somebody cry.
ZS: Who did I make cry?
Hoy: It was in private and I'm not going to say. It wasn't me.
A: I try not to. Sometimes I'll throw down the gauntlet and write something competing. Other times I'll take advantage of ruby's dynamic nature to just include what I need ... I call it duck-raping

Q: WRT tech depth, how do you not revisit code flags?
A: I use a tag system (fix refactor hack doc and others). It lets me keep my brain on track and move on. [me: this is important]

Q: Have you found a way to automate heckle into your build process?
A: I have one lib (the png lib) that's fully heckle-proof. Last iteration I hooked heckle into autotest; when it went green, it'd invoke heckle. The problem is the geometric expansion of tests.

Q: Given that only one of your libs passes heckle, do you just seek a better score?
A: Heckle shows you the diff of your test and what it changed without making the test fail (e.g. replace an assignment with a nil). A rats nest of code with tight dependencies where it breaks if you change anything will pass Heckle.

Q; are there tools you need as an ascetic that don't exist yet?
A: Yes. Can't name one off the top of my head.

Q: Pair programming ... useful for you?
A: Ask Eric. (laughs) I find I get a 250% output increase.

Q: What's your test:code ratio?
A: I don't measure it often ... generally 1.5:1 -ish but with artificial inflation of individual tests per argument, method, etc.

2007.11.02 in Ruby/Rails, RubyConf 2007 | Permalink | Comments (0) | TrackBack (0)

RubyConf, Day 1, Plenary Part 2: Advanced Ruby Class Design

No coffee outside. How do they expect me to survive? However, the signs are out for the box lunches and they look to not suck.

Jim starts with a slide of a Flame Maple guitar back. Very beautiful.

Jim's journey: FORTRAN (Physics),  Lisp (in a fortran class taught by Daniel Friedman), C, Modula 2, C++, Eiffel, Java, FORTH, TCL, and Perl.

On learning Lisp: "Yes, these are your father's parentheses"

Out to show interesting techniques that aren't Java-esque.

Box 1: Master of Disguise, Rake::FileList

It's essentially a specialized array which can be init'd with a GLOB, has some extra methods including a custom to_s, and is a lazy evaluator. First cut inherited from Array (very non-Java, this inheriting from a concrete class)

Be sure to call super in subclass initializers.

Overrides Array's various accessor methods to cause them to all auto-resolve on access. This makes fl + [...] work, but doesn't help with [...] + fl ... so implement to_ary which is automatically called. Which would be peachy except that inheriting from Array causes this not to be called. So don't inherit from Array; instead contain one (and cause all your previously overridden accessors to access the contained array)


def [](index)
  resolve unless @resolved
  @items[index]
end

(and he showed an excellent metaprogramming method to handle defining all the accessors)

Box 2: The Art of Doing Nothing, Builder::XmlMarkup

uses method_missing to construct tag accessors, but what about name collisions (e.g. class)?

Inherits from BlankSlate (not Object):

class BlankSlate
  instance_methods.each do |name|
    undef_method name unless name =~ /^__/
  end
end

Kernel is a module included on all Objects, so this is icky:

require 'blank_slate'

class Kernel
  def foo
    'foo'
  end
end

And now BlankSlate is not blank. So use method_added hook (in Kernel) to catch when anyone reopens the class, then use that to have BlankSlate hide/remove the method if someone adds something to Kernel. Excellent, until:

module Foo
  dev foo
    'foo'
  end
end

class Object
  include Foo
end

@#%&! Time for the append_features hook and a nearly identical implementation.

Box 3: Parsing without Parsing,

Wouldn't it be nice to do this:

User.select { |user|
  user.name == 'jim'
}

The Naive Implementation

class User
  def self.select(&block)
    find(:all).select(&block)
  end
end

... perhaps a bit inefficient as you do a full table scan. ;] Might be good to offload the work to the database (but how to avoid SQL?)

class User
  def self.select(&block)
    cond = block_to_condition(block)
    find(:all, :conditions => cond)
  end
end

Use ParseTree: a la Ambition

user = TableNode.new("users")
result = user.name
puts result.to_s
users.name # <-- that's the SQL fragment to reference the db column

class TableNode < Node
  def initialize(table_name)
    @table_name = table_name
  end

  def method_missing(sym, *args, ...

[I can't keep up. We'll find his slides. I'm going to nap at lunch.]

2007.11.02 in Ruby/Rails, RubyConf 2007 | Permalink | Comments (0) | TrackBack (0)

RubyConf, Day 1, Plenary Part 1: Welcome and Beautiful Code

Apologies in advance for quality issues; our crack team of writer just stepped off a red-eye and into the conference. It's 9:10a and they're still working on the AV connex. Ah, here we go.

Conference this year is ~15x as big as the first RubyConf. Dave: "For some reason, people keep coming back for more."

Plenary sessions in the morning, breakouts in the afternoon with Room 3 for work sessions and other non-presentations.

Despite a late start, Dave finished the welcome 10 minutes early. Time for more coffee. And now acquired, having seen Evan (with our awesome Werewolf tees) and Tony Devlin, who say last night's Werewolfery was good but long. Now up: Marcel, with "What makes code beautiful?" ... I've seen him do this talk before, but I'm looking forward to seeing how it's changed over the last few months.

What's beautiful? Someone volunteered, "My wife!" which drew applause; someone else volunteered, "His wife!" which drew even louder laughter.

Plato asserted that the properties of beuaty are deep and structural which appearances hint at. Discovering what those properties are gives you an understanding of what beauty is.

Marcel's history: came from literature background, which led him to artificial languages, and here we are. He was early-on interested in looking at ways to make meaning (two sentences can be identical to the last few words and have widely variant meaning) and choosing the properly expressive form for the purpose. Realized over the years of learning and coding that he was really interested in writing what he sees as beautiful code. After evaluating many languages, Ruby rung most true at a subconscious level.

He desired to write software in search of beautiful code, so pursuing code beauty actively gets him to the desired end faster.

Pythagoras, passing a blacksmith, noted that the hammering sound had an appealing quality. As he investigated, he discovered that there were mathematical relationships between the size of the hammer and the pitch of the strike, as well as a relation to musical intervals. This eventually became the basis of the golden ratio.

Thomas Aquinas' definition of beauty seems the most applicable to software.

Elements of beauty:

Proportion: Marcel invites a roomful of people, largely men, to consider his body. But not in depth. Specifically, his hand and arm. They're very suited to their purposes. If you modified their proportions in  any way, they'd be less suited and thus less beautiful. Two parts of proportion: ratio of parts and economy of size. If everything were 10x, the ratio of parts would be undisturbed, but the economy of size would differ. [I'd argue that there's something about the system within which the thing exists that determines how economy of scale fits, and that it's also arguable that form evolves to suit purpose as we cannot efficiently approach purposes for which we are not suited but if they are critical to our survival, we'll evolve such that we can]

Integrity: Well-suited to its purpose. A crystal hammer might be beautiful, but it would shatter upon use.

Clarity: Something that's clear and simple (no more complex than required).

Coerce example (in the slides). Lines of code required can be a measure of proportionality; less is more. How long your unit tests take to run is another [me: and perhaps a better one as it's a real-world metric which affects how often you'll run your tests ... and the more you run your tests the better your code, right?]. Integrity is how well it behaves while running (does it leak memory?). Clarity is how expressive and readable.

[Rick DeNatale comments that his refactor of the coerce example ended up monkey-patching the String class rather than creating a new class. That might be another indicator of simplicity and how Ruby enables it.]

Kent Beck's "Smalltalk: Best Practice Patterns" may not express it as being "beautiful" but it expresses it well.

Rousseau equated "good" with "beauty in action".

Beauty is a moving target. It's contextual: it's not your parent's beauty.

Bohr: "An expert is a person who has made all the mistakes that can be made in a very narrow field." [me: this is another demonstration of my "make a lot of small mistakes fast" philosophy]

Ruby is optimized for beauty.

Try to imagine better modes of expression. Ugly things reveal mistakes. Make enough ugly things and you'll make beautiful ones.

Q: At what level can we apply this?
A: All levels, from a line of code to user experience

Q: [Paraphrased: What's the role of symmetry?]
A: [Paraphrased: Wide and varied]

2007.11.02 in Ruby/Rails, RubyConf 2007 | Permalink | Comments (0) | TrackBack (0)

My Photo

About

 Subscribe in a reader

AddThis Social Bookmark Button

Categories

  • Administrivia
  • Blogs
  • Books
  • Business
  • Computing
  • Data Portability
  • Economics
  • Electronics
  • Engineering
  • Environment
  • Facebook
  • Food and Drink
  • Fun!
  • Games
  • Graphing.Social
  • Hacking
  • History
  • Identity
  • Leadership
  • Linux
  • MacOS X
  • Management
  • Metadata
  • Open Source
  • Organization
  • Parenting
  • People
  • Photography
  • Privacy
  • PublicSquare
  • RailsRumble
  • Reputation
  • Ruby/Rails
  • RubyConf 2007
  • Science
  • Social Networks
  • TagEverything
  • Technology
  • Testing
  • Thinking
  • Trust
  • UI
  • Web 2.0
  • Weblogs
  • Writing

Archives

  • April 2013
  • March 2012
  • August 2010
  • October 2009
  • September 2009
  • August 2009
  • July 2009
  • June 2009
  • May 2009
  • January 2009

Words on a Page

  • Carol Tavris: Mistakes Were Made (But Not by Me): Why We Justify Foolish Beliefs, Bad Decisions, and Hurtful Acts

    Carol Tavris: Mistakes Were Made (But Not by Me): Why We Justify Foolish Beliefs, Bad Decisions, and Hurtful Acts

  • Steven Gary Blank: The Four Steps to the Epiphany

    Steven Gary Blank: The Four Steps to the Epiphany

  • Chip Heath: Made to Stick: Why Some Ideas Survive and Others Die

    Chip Heath: Made to Stick: Why Some Ideas Survive and Others Die

  • Patrick M. Lencioni: Silos, Politics and Turf Wars : A Leadership Fable About Destroying the Barriers That Turn Colleagues Into Competitors

    Patrick M. Lencioni: Silos, Politics and Turf Wars : A Leadership Fable About Destroying the Barriers That Turn Colleagues Into Competitors

  • Marc Ian Barasch: Field Notes on the Compassionate Life : A Search for the Soul of Kindness

    Marc Ian Barasch: Field Notes on the Compassionate Life : A Search for the Soul of Kindness

Pages

  • If
  • The Tagline Graveyard