<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-265396792905196759</id><updated>2011-10-15T23:54:28.526-07:00</updated><category term='quotes'/><category term='business'/><category term='happiness philosophy'/><category term='python'/><category term='clojure'/><category term='inspiration'/><category term='planning'/><category term='rant'/><category term='pedantry'/><title type='text'>One Amongst a Multitude</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.lo-phi.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-5735882569285149694</id><published>2010-09-07T00:18:00.000-07:00</published><updated>2010-09-07T00:22:46.466-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='happiness philosophy'/><title type='text'>Happiness, by Max Ehrmann</title><content type='html'>- one of my favorite poems, and a personal philosophy.&lt;br /&gt;&lt;br /&gt;To be without desire is to be content.&lt;br /&gt;But contentment is not happiness.&lt;br /&gt;And in contentment there is no progress. &lt;br /&gt;Happiness is to desire something, to work for it, and to obtain at least a part of it.&lt;br /&gt;In the pursuit of beloved labor the busy days pass cheerfully employed, and still nights in peaceful sleep.&lt;br /&gt;For labor born of desire is not drudgery, but manly play.&lt;br /&gt;Success brings hope, hope inspires fresh desire, and desire gives zest to life and joy to labor.&lt;br /&gt;This is true whether your days be spent in the palaces of the powerful or in some little green by-way of the world.&lt;br /&gt;&lt;br /&gt;Therefore, while yet you have the strength, cherish a desire to do some useful work in your little corner of the world, and have the steadfastness to labor.&lt;br /&gt;For this is the way to the happy life; with health and endearing ties, it is the way to the glorious life.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-5735882569285149694?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/5735882569285149694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=5735882569285149694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/5735882569285149694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/5735882569285149694'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2010/09/happiness-by-max-ehrmann.html' title='Happiness, by Max Ehrmann'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-3244388610195192764</id><published>2010-04-01T00:50:00.000-07:00</published><updated>2010-04-01T00:53:00.496-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Generating all subsets</title><content type='html'>is a breeze with itertools&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/351534.js?file=all_subsets.py"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-3244388610195192764?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/3244388610195192764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=3244388610195192764' title='33 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3244388610195192764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3244388610195192764'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2010/04/generating-all-subsets.html' title='Generating all subsets'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-3803262992084542885</id><published>2010-03-20T16:08:00.000-07:00</published><updated>2010-03-21T16:51:27.964-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pedantry'/><title type='text'>Maiden hands</title><content type='html'>Time turns&lt;br /&gt;faster,&lt;br /&gt;slower...&lt;br /&gt;and at times he stood still,&lt;br /&gt;quiet, unmoving.&lt;br /&gt;Like the dawn of winter mornings&lt;br /&gt;in snowy Wisconsin.&lt;br /&gt;&lt;br /&gt;When he passes in the hands of a maiden.&lt;br /&gt;--&lt;br /&gt;Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-3803262992084542885?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/3803262992084542885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=3803262992084542885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3803262992084542885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3803262992084542885'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2010/03/hands-of-maiden.html' title='Maiden hands'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-6682700403929672080</id><published>2010-03-14T21:50:00.001-07:00</published><updated>2010-03-20T22:17:27.219-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pedantry'/><title type='text'>Gray</title><content type='html'>Black and white, so cut and dried..&lt;br /&gt;unflinchingly looked me in the eye.&lt;br /&gt;&lt;br /&gt;"Don't give in, to the heat.&lt;br /&gt;Don't be marching to the beat."&lt;br /&gt;&lt;br /&gt;Vows, sworn, under the light.&lt;br /&gt;When all was clear, horizon bright.&lt;br /&gt;&lt;br /&gt;On the peaks of destiny,&lt;br /&gt;in the valleys of ignominy,&lt;br /&gt;&lt;br /&gt;Seem made to be broken in the numbing grey,&lt;br /&gt;of life's choices that we face.&lt;br /&gt;&lt;br /&gt;-- May08&lt;br /&gt;Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-6682700403929672080?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/6682700403929672080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=6682700403929672080' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6682700403929672080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6682700403929672080'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2010/03/gray.html' title='Gray'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-6188601717742964425</id><published>2010-01-05T21:53:00.001-08:00</published><updated>2010-03-20T22:17:16.620-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pedantry'/><title type='text'>Over and Over</title><content type='html'>Over and over, &lt;br /&gt;I come to forks in the road,&lt;br /&gt;a path splits to two,&lt;br /&gt;sometimes three.&lt;br /&gt;&lt;br /&gt;Over and over,&lt;br /&gt;mind indecisive,&lt;br /&gt;past weighing on me,&lt;br /&gt;future unseen.&lt;br /&gt;&lt;br /&gt;To go one way,&lt;br /&gt;is to not see the other.&lt;br /&gt;yet to stand at the crossroads,&lt;br /&gt;is to be left without life and memories.&lt;br /&gt;&lt;br /&gt;Over and over, &lt;br /&gt;I choose,&lt;br /&gt;to walk on one path,&lt;br /&gt;to open one door, and close the others.&lt;br /&gt;&lt;br /&gt;Yet.... over and over,&lt;br /&gt;I move forward.&lt;br /&gt;&lt;br /&gt;Sometimes with trepidation,&lt;br /&gt;sometimes with caution,&lt;br /&gt;sometimes with relief,&lt;br /&gt;with joy, with a touch of bitterness, with regret, with prescience, with ignorance,&lt;br /&gt;but forward.&lt;br /&gt;&lt;br /&gt;And that has made all the difference.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-6188601717742964425?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/6188601717742964425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=6188601717742964425' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6188601717742964425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6188601717742964425'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2010/01/over-and-over.html' title='Over and Over'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-192653028163105547</id><published>2009-11-29T22:16:00.000-08:00</published><updated>2009-11-29T22:17:11.031-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><title type='text'>quote from shimon peres</title><content type='html'>The most careful thing is to dare.&lt;br /&gt;- Shimon Peres&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-192653028163105547?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/192653028163105547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=192653028163105547' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/192653028163105547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/192653028163105547'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/11/quote-from-shimon-peres.html' title='quote from shimon peres'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-6275839040683120352</id><published>2009-11-02T23:33:00.000-08:00</published><updated>2009-11-02T23:34:34.217-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><title type='text'>Marcus Aurelius's Meditations</title><content type='html'>The person who loves reputation supposes that his own good depends on the activity of others; the lover of pleasures finds his own good in being affected by his emotions. But the person who has Intelligence understands the good to be in his own actions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-6275839040683120352?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/6275839040683120352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=6275839040683120352' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6275839040683120352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6275839040683120352'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/11/marcus-aureliuss-meditations.html' title='Marcus Aurelius&apos;s Meditations'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-5831906051578636139</id><published>2009-10-19T23:06:00.000-07:00</published><updated>2009-10-19T23:07:10.864-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='inspiration'/><title type='text'>from dilbert creator</title><content type='html'>an artist listens to his inner calling and hopes the public agrees. A business person listens to the audience and gives them what they want&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-5831906051578636139?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/5831906051578636139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=5831906051578636139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/5831906051578636139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/5831906051578636139'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/10/from-dilbert-creator.html' title='from dilbert creator'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-8871810017682482401</id><published>2009-10-18T00:31:00.000-07:00</published><updated>2009-10-18T00:34:40.353-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='inspiration'/><title type='text'>Book of Changes</title><content type='html'>Take not gain or loss to heart.&lt;br /&gt;What man holds high comes to nothing.&lt;br /&gt;&lt;br /&gt;Do not waste even a moment on gains and losses when death is plucking your ears saying, "Live! I am coming."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-8871810017682482401?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/8871810017682482401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=8871810017682482401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/8871810017682482401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/8871810017682482401'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/10/book-of-changes.html' title='Book of Changes'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-4108700248043812399</id><published>2009-10-17T19:12:00.000-07:00</published><updated>2009-10-17T19:13:31.609-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='inspiration'/><title type='text'>ayn rand -hope</title><content type='html'>Do not let your fire go out, spark by irreplaceable spark, in the hopeless swamps of the approximate, the not-quite, the not-yet, the not-at-all. Do not let the hero in your soul perish in lonely frustration for the life you deserved, but have never been able to reach. Check your road and the nature of your battle. The world you desired can be won. It exists, it is real, it is possible, it is yours.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-4108700248043812399?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/4108700248043812399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=4108700248043812399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4108700248043812399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4108700248043812399'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/10/ayn-rand-hope.html' title='ayn rand -hope'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-3777570526270469125</id><published>2009-08-02T23:51:00.001-07:00</published><updated>2009-08-02T23:51:37.835-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='inspiration'/><title type='text'>Your Work...</title><content type='html'>your work is to keep cranking the flywheel that turns the gears&lt;br /&gt;that spin the belt in the engine of belief that keeps you and your desk in midair&lt;br /&gt;&lt;br /&gt;-Ann Dillard in the Writing Life&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-3777570526270469125?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/3777570526270469125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=3777570526270469125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3777570526270469125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3777570526270469125'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/08/your-work.html' title='Your Work...'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-196824885742310775</id><published>2009-07-22T16:49:00.000-07:00</published><updated>2009-07-22T19:03:06.974-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>Clojure recursive accumulator</title><content type='html'>I'm trying to extract all values with a certain key in an arbitrarily nested value in clojure.&lt;br /&gt;I couldn't find this functionality right off the bat in core/contrib, so I decided to write it, if there's a better way to do this, leave a comment! I'm not completely happy with my implementation.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/152401.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-196824885742310775?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/196824885742310775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=196824885742310775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/196824885742310775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/196824885742310775'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/07/clojure-recursive-accumulator.html' title='Clojure recursive accumulator'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-1593378924740310016</id><published>2009-07-19T16:24:00.000-07:00</published><updated>2009-07-22T19:03:36.068-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='inspiration'/><title type='text'>Ayn Rand - show me your happiness. From The Fountainhead.</title><content type='html'>Men have not found the words for it, nor the deed nor the thought, but they have found the music. Let me see that in one single act of man on earth. Let me see it made real. Let me see the answer to the promise of that music. Not servants nor those served; not altars and immolations, but the final, the fulfilled, the innocent of pain. Don't help me or serve me, but let me see it once, because I need it. Don't work for my happiness, my brothers - show me yours - show me that it is possible - show me your achievement - and the knowledge will give me courage for mine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-1593378924740310016?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/1593378924740310016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=1593378924740310016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1593378924740310016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1593378924740310016'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/07/ayn-rand-show-me-your-happiness-from.html' title='Ayn Rand - show me your happiness. From The Fountainhead.'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-634412208943834461</id><published>2009-07-07T20:06:00.000-07:00</published><updated>2009-07-07T20:27:25.921-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>apply-fnmap - clojure</title><content type='html'>I'm not really sure what to call this, but we have to do some data analysis using hadoop, and in order to be efficient, we apply mutiple classifiers at once to the dataset per job.&lt;br /&gt;&lt;br /&gt;There might be stuff for this already somewhere in the builtin libs, but I wanted to apply a map of functions to a bunch of data (variable number of them) and have the result be the key and the transformed data/function result.&lt;br /&gt;Here's the src...&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/142551.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-634412208943834461?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/634412208943834461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=634412208943834461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/634412208943834461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/634412208943834461'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/07/apply-fnmap-clojure.html' title='apply-fnmap - clojure'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-2849715650820214933</id><published>2009-07-02T20:28:00.000-07:00</published><updated>2009-07-02T20:49:15.297-07:00</updated><title type='text'>My Emacs setup (for clojure, ecb, etc)</title><content type='html'>To check out the src, go to &lt;a href="http://github.com/timwee/emacssetup/tree/master"&gt;github.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So I've been working recently in Clojure with a &lt;a href="http://bradfordcross.blogspot.com/"&gt;colleague of mine&lt;/a&gt;, and being a Vim user, it's been kind of daunting initially to get started with emacs.&lt;br /&gt;&lt;br /&gt;I was looking for a standard install that comes with sane default plugins already installed. I saw ClojureBox, but I wanted it to not be such a black box in case I wanted to put some of my own customizations.&lt;br /&gt;&lt;br /&gt;It's a good thing I found &lt;a href="http://jonasboner.com/"&gt;Jonas Boner&lt;/a&gt;'s &lt;a href="http://github.com/jboner/emacs-config/tree/master"&gt;emacs config on github,&lt;/a&gt;&lt;br /&gt;It was a pretty modular setup, and came with some stuff that I wanted like &lt;a href="http://ecb.sourceforge.net/"&gt;ECB (code browsing).&lt;/a&gt;&lt;br /&gt;The third-party plugins are all in a folder, with the startup and loading all in a different one, and you can put an emacs lisp file for whatever you want to happen during emacs startup. &lt;br /&gt;&lt;br /&gt;(mapcar 'load-directory&lt;br /&gt;        '("$EMACS_LIB/startup")) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I just sanitized and generalized a lot of it, and made the clojure stuff work better, and also grabbed some stuff from Brad Cross's clojure emacs config like clojure-pom, which has slime-project. (It starts with clojure-contrib) It's really easy to get started, go on ahead and take a look at the &lt;a href="http://github.com/timwee/emacssetup/tree/master"&gt;README&lt;/a&gt; to see what I mean. (just 2 steps!)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Some startup keys:&lt;br /&gt;M-x ecb-activate&lt;br /&gt;M-x slime-project&lt;Enter&gt;   (then enter path to project)&lt;br /&gt;C-c C-, (run test-is for clojure on current file)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-2849715650820214933?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/2849715650820214933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=2849715650820214933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/2849715650820214933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/2849715650820214933'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/07/my-emacs-setup-for-clojure-ecb-etc.html' title='My Emacs setup (for clojure, ecb, etc)'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-7042132644993897814</id><published>2009-07-01T20:07:00.000-07:00</published><updated>2009-07-01T20:09:14.205-07:00</updated><title type='text'>If You Ever Need to Bootstrap Clojure in a non-Clojure environment</title><content type='html'>Read this thread. http://bit.ly/HocNx&lt;br /&gt;&lt;br /&gt;I'm using clojure as a wrapper over cascading, and reading this has been really helpful in finding out how clojure works under the hood.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-7042132644993897814?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/7042132644993897814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=7042132644993897814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/7042132644993897814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/7042132644993897814'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/07/if-you-ever-need-to-bootstrap-clojure.html' title='If You Ever Need to Bootstrap Clojure in a non-Clojure environment'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-5049785100120803503</id><published>2009-06-26T12:29:00.001-07:00</published><updated>2009-07-22T20:26:18.627-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Art of War for Business....</title><content type='html'>Turn their strengths against them.&lt;br /&gt;Or find weaknesses in their strengths, or core competencies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-5049785100120803503?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/5049785100120803503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=5049785100120803503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/5049785100120803503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/5049785100120803503'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/06/art-of-war-for-business.html' title='Art of War for Business....'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-8315923677206055720</id><published>2009-06-21T18:25:00.000-07:00</published><updated>2009-06-21T18:29:02.366-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>Clojure to Java interop gotchas so far</title><content type='html'>1.) When your package name has a dash (-), in the filesystem, it should be an underscore. (_) .&lt;br /&gt;&lt;br /&gt;2.) When calling vararg Java methods or constructors: ie.&lt;br /&gt;&lt;br /&gt;public transient Fields(java.lang.Comparable... comparables) { /* compiled code */ }&lt;br /&gt;&lt;br /&gt;you have to call it by using into-array in clojure.&lt;br /&gt;&lt;br /&gt;(Fields. (into-array Comparable ["1" "2" "3"]))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;These couple of things just bit me recently, and they took some time to resolve.&lt;br /&gt;&lt;br /&gt;Please post more in the comments or in your own blogs if you find any gotchas!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-8315923677206055720?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/8315923677206055720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=8315923677206055720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/8315923677206055720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/8315923677206055720'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/06/clojure-to-java-interop-gotchas-so-far.html' title='Clojure to Java interop gotchas so far'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-4530110675574078893</id><published>2009-06-21T11:01:00.000-07:00</published><updated>2009-06-21T11:02:38.576-07:00</updated><title type='text'>Good words to work by.</title><content type='html'>So I have just one wish for you — the good luck to be somewhere where you are free to maintain the kind of integrity I have described, and where you do not feel forced by a need to maintain your position in the organization, or financial support, or so on, to lose your integrity. May you have that freedom.&lt;br /&gt;&lt;br /&gt;-Richard Feynman&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-4530110675574078893?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/4530110675574078893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=4530110675574078893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4530110675574078893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4530110675574078893'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/06/good-words-to-work-by.html' title='Good words to work by.'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-2510933425105261155</id><published>2009-06-20T21:22:00.000-07:00</published><updated>2009-06-20T21:34:11.610-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>Lazy Windowed View into collection for clojure</title><content type='html'>There's a frequent need in time-series/financial applications and statistical analysis to do a windowed view into a collection of values.&lt;br /&gt;Say you want to compute the mean of every 4 overlapping values of a huge collection/stream, it would look like this:&lt;br /&gt;&lt;br /&gt;stream: [1, 2, 3, 4, 5, 6, 7, 8.....n]&lt;br /&gt;result: [(mean [1 2 3 4]) (mean [2 3 4 5]) .... (mean [n-3 n-2 n-1 n])]&lt;br /&gt;&lt;br /&gt;you can do this in clojure really easily, in a lazy and memoized way as well to prevent a stackoverflow in case the source stream is too big.&lt;br /&gt;&lt;br /&gt;Below is the code:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/133399.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-2510933425105261155?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/2510933425105261155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=2510933425105261155' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/2510933425105261155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/2510933425105261155'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/06/lazy-windowed-view-into-collection-for.html' title='Lazy Windowed View into collection for clojure'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-7813562824477326850</id><published>2009-04-04T20:31:00.000-07:00</published><updated>2009-04-04T20:34:13.560-07:00</updated><title type='text'>When dealing with Non-Linear situations</title><content type='html'>&lt;span style="font-weight: bold;"&gt;A few things to remember&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;Thought is influenced by emotions, context, values, and motivations. Man is no logical machine.&lt;br /&gt;&lt;br /&gt;As time goes on, (as we get used to environment) we become more people of action than reflection.&lt;br /&gt;&lt;br /&gt;The problem can sometimes be unintentionally redefined by participants&lt;br /&gt;&lt;br /&gt;Helplessness generates cynicism.&lt;br /&gt;&lt;br /&gt;Consistency is not a virtue, at least in problem solving.&lt;br /&gt;&lt;br /&gt;Watch for secondary effects. (munger)&lt;br /&gt;&lt;br /&gt;Set useful goals =)&lt;br /&gt;&lt;br /&gt;Hard situation - complexity, lack of transparency, internal dynamics, inadequate understanding of the system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Learning and discovery flow:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.) Goal formulation&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;General goals can be unclear, which trigger "repair service" behavior. (just solve immediate problem, instead of getting to root cause, solving underlying issues)&lt;/li&gt;&lt;li&gt;After "repair service" behavior, sometimes people will change their goal to solving the immediate problem. This happens when there is a desire for safety, or a lack of confidence from the problem-solver.&lt;/li&gt;&lt;li&gt;Beware conflicting goals.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2.) Models&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Positive feedback - increase in one, increases the other&lt;/li&gt;&lt;li&gt;Negative feedback - increase in one, decrease in other.&lt;/li&gt;&lt;li&gt;Systems thinking, secondary/third effects&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;3.) Time Sequence&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;nonlinear rates of growth&lt;/li&gt;&lt;li&gt;watch out for non-immediate effects, we always overcompensate.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;4.) Summary&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;state goals clearly, we all know we should do that but we rarely encounter the necessity.&lt;/li&gt;&lt;li&gt;can't realize goals all at once because different goals may conflict with each other. need compromise sometimes&lt;/li&gt;&lt;li&gt;establish priorities but can't hang on to them forever. may have to change them&lt;/li&gt;&lt;li&gt;when dealing with a a given configuration, establish a model to deal with it, must anticipate side effects and long term repercussions.&lt;/li&gt;&lt;li&gt;adapt information gathering to task at hand, not go into excessive detail or stop too short.&lt;/li&gt;&lt;li&gt;learn consequences of excessive abstraction.&lt;/li&gt;&lt;li&gt;watch out for hastily ascribing all events in a certain field to one cause.&lt;/li&gt;&lt;li&gt;when to continue gathering information and when to stop.&lt;/li&gt;&lt;li&gt;we sometimes act because we want to prove to ourselves that we can act. watch out for this. No acting for the sake of action/pride/insecurity.&lt;/li&gt;&lt;li&gt;Watch out for knee-jerk methodology/cargo-culting.&lt;/li&gt;&lt;li&gt;draw lessons from errors.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Negatives&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;acted without prior analysis of the situation&lt;/li&gt;&lt;li&gt;failed to anticipate side effects and long term repercussions.&lt;/li&gt;&lt;li&gt;assumed that the absence of immediately obvious negative effects meant that correct measures have been taken.&lt;/li&gt;&lt;li&gt;let over involvement in projects blind them to emerging needs and changes in situation.&lt;/li&gt;&lt;li&gt;prone to cynical reactions.&lt;/li&gt;&lt;li&gt;very ad-hoc, easily distracted, reactionary&lt;/li&gt;&lt;li&gt;no reflection&lt;/li&gt;&lt;li&gt;blames others for failure&lt;/li&gt;&lt;li&gt;solve problems they can solve rather than what they ought to.&lt;/li&gt;&lt;li&gt;regulate one instance/situation instead of taking a higher level view. (process, etc).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Positives&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;more decisions. felt they could influence fate more.&lt;/li&gt;&lt;li&gt;more decisions/goal or intention. acted more complexly.&lt;/li&gt;&lt;li&gt;tested their hypothesis.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-7813562824477326850?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/7813562824477326850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=7813562824477326850' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/7813562824477326850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/7813562824477326850'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/04/when-dealing-with-non-linear-situations.html' title='When dealing with Non-Linear situations'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-3497073730106094447</id><published>2009-01-15T19:51:00.000-08:00</published><updated>2009-01-15T20:18:55.496-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='planning'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Planning: Don't Use Forecasts, Instead Use Scenarios and PreMortems</title><content type='html'>I'm a little peeved after hearing the word "forecast" for the umpeenth time today. I guess since it's the beginning of the year, it comes with the territory.&lt;br /&gt;My beef with forecasts is that they aim to provide answers and to justify the PLAN or the SPREADSHEET when no one can really know the future. It also usually draws too much on the immediate past. So when the forecast is wrong, it is often wrong in a bad way. Forecasts are also written to be consumed, they don't encourage critical thinking of the different factors and risks that could come into play.&lt;br /&gt;Companies, groups, and even individuals base their plans and expectations on forecasts, (esp. the ones staffed full of MBAs) which makes them blind to whatever signals and signs that they should have been paying attention to. People presenting forecasts often present it with certainty and a crapload of data, giving the impression that they've done their due diligence, when actually what they've done is to retrofit evidence and statistics to justify the status quo (most of the time) or whatever theory they're pushing. (hello consultants)&lt;br /&gt;&lt;br /&gt;So given that I think forecasts are useless, what should be used instead?&lt;br /&gt;Well, it can be anything, as long as it encourages the participants to think critically about what could affect their future. It should also encourage a mindset to disprove things, not just to justify them.&lt;br /&gt;One method that I like is &lt;a href="http://www.anecdote.com.au/archives/2006/12/the_premortem_a.html"&gt;premortems&lt;/a&gt;, where you imagine that the worst has come true that year, and come up with possible reasons why this might be the case.&lt;br /&gt;This encourages participants to detach emotionally from the plan that they've come up with. &lt;br /&gt;It also helps to have a diverse group of people doing the exercise, so you can approach things from different perspectives and come up with different scenarios.&lt;br /&gt;&lt;br /&gt;I think doing this over forecasts gives you most of the value that you want out of planning. You don't plan to have certainty; I think the value in planning is so that you've done a good mental simulation of things that could happen, including the more implausible ones, so that when they crop up, at least you've already given some thought to them.&lt;br /&gt;Doing planning this way also makes you aware of the different signals and factors that could give you an early warning about possible shifts and disruptions, so maybe at the beginning of the year you can set up and automate for certain flags to be thrown to make you aware of them.&lt;br /&gt;&lt;br /&gt;Anyhoo, just a little rant about planning meetings, MBAs, and their insanity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-3497073730106094447?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/3497073730106094447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=3497073730106094447' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3497073730106094447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3497073730106094447'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2009/01/planning-dont-use-forecasts-instead-use.html' title='Planning: Don&apos;t Use Forecasts, Instead Use Scenarios and PreMortems'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-4608006442400492459</id><published>2008-09-12T00:08:00.000-07:00</published><updated>2008-12-03T00:01:03.033-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pedantry'/><title type='text'>Blindly Right</title><content type='html'>I once took pride &lt;br /&gt;in being right,&lt;br /&gt;in knowing truth,&lt;br /&gt;in fooling sight.&lt;br /&gt;&lt;br /&gt;But lately I've been thinking...&lt;br /&gt;there's much a cost&lt;br /&gt;to this pride.&lt;br /&gt;&lt;br /&gt;Time changes &lt;br /&gt;today's truth.&lt;br /&gt;and to be proud,&lt;br /&gt;is to be blind.&lt;br /&gt;&lt;br /&gt;So from today on,&lt;br /&gt;I'll take away the mask of pride.&lt;br /&gt;And promise &lt;br /&gt;to see things from your side.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-4608006442400492459?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/4608006442400492459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=4608006442400492459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4608006442400492459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4608006442400492459'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/09/blindly-right.html' title='Blindly Right'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-173250899580029202</id><published>2008-08-21T21:36:00.001-07:00</published><updated>2008-08-21T21:38:13.650-07:00</updated><title type='text'>From HBO's the Wire...</title><content type='html'>"You can hold back from the suffering of the world. You have free permission to do so, and it is in accordance with your nature. But perhaps the holding back is the one suffering you could have avoided."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-173250899580029202?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/173250899580029202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=173250899580029202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/173250899580029202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/173250899580029202'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/08/from-hbos-wire.html' title='From HBO&apos;s the Wire...'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-4429722879946647937</id><published>2008-08-19T22:52:00.001-07:00</published><updated>2008-12-03T00:01:17.363-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pedantry'/><title type='text'>The Wheel Of Time</title><content type='html'>&lt;span style="font-style: italic;font-family:arial;" &gt; (with apologies to Robert Jordan)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"Time is money",&lt;br /&gt;the old adage goes,&lt;br /&gt;so I busied and hurried,&lt;br /&gt;with no thought for repose.&lt;br /&gt;&lt;br /&gt;Right out of school,&lt;br /&gt;with Wall street as my shrine,&lt;br /&gt;Hoping to retire,&lt;br /&gt;when I'm thirty-nine.&lt;br /&gt;&lt;br /&gt;I worked day and night,&lt;br /&gt;with nary a bite,&lt;br /&gt;to secure financial freedom,&lt;br /&gt;at the cost of my life.&lt;br /&gt;&lt;br /&gt;With a house on the lake,&lt;br /&gt;four cars and a yatch,&lt;br /&gt;To have money enough,&lt;br /&gt;to buy a dot on the map.&lt;br /&gt;&lt;br /&gt;As the years went by,&lt;br /&gt;they came and went quicker.&lt;br /&gt;Yet my life marched on,&lt;br /&gt;to the beat of the stock ticker.&lt;br /&gt;&lt;br /&gt;Until one evening,&lt;br /&gt;with my head full of wine,&lt;br /&gt;the clock struck twelve,&lt;br /&gt;I was forty-nine...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The best years of my life,&lt;br /&gt;have come and gone,&lt;br /&gt;my wife and kids,&lt;br /&gt;strangers they've become.&lt;br /&gt;&lt;br /&gt;Love for money,&lt;br /&gt;Lust and greed,&lt;br /&gt;have blinded my eyes,&lt;br /&gt;to what I really need.&lt;br /&gt;&lt;br /&gt;What profit did I get,&lt;br /&gt;from losing family and soul,&lt;br /&gt;though I gained the world,&lt;br /&gt;my life was the toll.&lt;br /&gt;&lt;br /&gt;Regret and emptiness,&lt;br /&gt;for the years of my life,&lt;br /&gt;forever will be,&lt;br /&gt;companions of mine.&lt;br /&gt;&lt;br /&gt;For in eternity,&lt;br /&gt;they could've echoed sublime...&lt;br /&gt;but they've been grinded to dust,&lt;br /&gt;by the wheel of time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-4429722879946647937?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/4429722879946647937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=4429722879946647937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4429722879946647937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4429722879946647937'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/08/wheel-of-time.html' title='The Wheel Of Time'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-1593136192808714998</id><published>2008-07-22T00:25:00.000-07:00</published><updated>2008-07-28T23:54:14.599-07:00</updated><title type='text'>It Takes More Than Hard Work ....</title><content type='html'>to deliver good software consistently. (by good, I mean functional defect-free software that delivers business value and is &lt;a href="http://www.alphaitjournal.com/articles/20080625"&gt;maintainable&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;I think there is a tendency for a lot of technical people to not push back on the business, and say yes to everything that gets thrown to them. I used to have this tendency in the past. I always looked at tight schedules and unrealistic expectations as a personal challenge, and having someone question the validity of my "yes, I can do it" answer as an affront to my technical ability. As a result, it creates unrealistic expectations, forcing developers to go into &lt;a href="http://www.37signals.com/svn/posts/386-dont-be-a-hero-giving-up-is-good"&gt;hero mode&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Going into hero mode should be the last resort. It piles on a lot of &lt;a href="http://www.martinfowler.com/bliki/TechnicalDebt.html"&gt;technical debt&lt;/a&gt;, creates silos among the developers in terms of knowledge of the application, and prevents the code from achieving low coupling and high cohesion. It also makes developers go into "firefighting" mode (emergency bug-fixing) all the time, since you don't really have the time to step back and think about what you're doing, or *shudder* write tests to verify your code, which will prevent emergencies in the future.&lt;br /&gt;&lt;br /&gt;Organizations with a hero/fire-fighting culture sprints faster in the beginning, and tend to think that things are going well until too late. By all accounts, things are getting done, business needs are being met, and operational metrics are not too far off expectation.&lt;br /&gt;But as the code base grows larger, and the "heros" get tired of the &lt;a href="http://www.laputan.org/mud/"&gt;big ball of mud&lt;/a&gt; architecture that came out of their "rockstar hacking", it becomes a lot harder for the application the change and evolve along with the needs of the business and the marketplace.&lt;br /&gt;&lt;br /&gt;A better culture for writing software is one that promotes bug-prevention, code maintainability, and &lt;a href="http://steve-yegge.blogspot.com/2008/06/done-and-gets-things-smart.html"&gt;"getting things smart"&lt;/a&gt; over bug-fixing and just plain-old "getting things done".&lt;br /&gt;This sounds really obvious, but a lot of times, it seems to be treated as a nice-to-have instead of something essential to delivering software.&lt;br /&gt;I think this is due to a couple of reasons:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.) &lt;/span&gt;&lt;span style="font-style: italic;"&gt;establishing this kind of culture is harder and has more upfront cost.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You need to build up and maintain automated tests to catch errors, developers actually need to think about where they should put their code, instead of having classes called "CommonUtil", "CommonHelper", and their many variants.&lt;br /&gt;Sadly, this kind of culture only seems to exist in technical/software companies, because as far as business people are concerned, they only care that it's cheap and it works, not about the code and the how.&lt;br /&gt;I think a good analogy for this is stock-picking. Some people only look at the financial data sheet and the numbers when picking stocks, while others look at the whole picture; the management, the industry, the company's position in the market, etc.&lt;br /&gt;I'm no expert in stock-picking to say which way is better, so I will defer to &lt;a href="http://en.wikipedia.org/wiki/Charlie_Munger"&gt;Charlie Munger&lt;/a&gt; on this one:&lt;br /&gt;"A great business at a fair price is superior to a fair business at a great price."&lt;br /&gt;Similarly, "a well-written and maintained application at a fair price is better than a "well it works" codebase at a great price."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;2.)&lt;/span&gt; A culture of prevention is more team-oriented, so individual developers don't get the lion's share of the credit for a successful application as much as a "hero" culture.&lt;/span&gt;&lt;br /&gt;Having a culture of prevention in software is actually more beneficial to the business than developers.&lt;br /&gt;In a "hero" culture, developers have more job security, because individual developers are typically the only ones who know certain areas of an application. It also promotes knowledge-hoarding, since you want to be the one to fix the next bug instead of the other guy.&lt;br /&gt;In contrast, a culture of prevention is typically more team oriented..(a good description I found was "&lt;a href="http://c2.com/cgi/wiki?EgolessProgramming"&gt;egoless programming&lt;/a&gt;"). You also find most programming mistakes by running tests, instead of having a pile of defects and developers incessantly setting the debugger all over the place.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;While having a culture of prevention makes more sense than having a culture of fire-fighting, it's definitely not the norm. I think a lot of organizations have realized that this is the case, but it is really hard to change the culture once it is set.&lt;br /&gt;The best way, in my opinion is to change the way individuals and projects are measured and judged on whether they are successes or failures.&lt;br /&gt;After all, you will only get what you measure and reward.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-1593136192808714998?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/1593136192808714998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=1593136192808714998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1593136192808714998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1593136192808714998'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/07/it-takes-more-than-hard-work-and.html' title='It Takes More Than Hard Work ....'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-5579994683477955417</id><published>2008-07-20T22:16:00.000-07:00</published><updated>2008-07-20T22:43:19.504-07:00</updated><title type='text'>Career Advice From Charlie Munger</title><content type='html'>- Don't sell anything you wouldn't buy yourself.&lt;br /&gt;- Don't work for anyone you don't respect or admire.&lt;br /&gt;- Work only with people you enjoy.&lt;br /&gt;&lt;br /&gt;From the book, &lt;a href="http://www.poorcharliesalmanack.com/index_pca.html"&gt;Poor Charlie's Almanack&lt;/a&gt;. I highly, highly recommend reading it.&lt;br /&gt;&lt;br /&gt;It sounds so simple but getting simple down and the principles right is the most important, and often the most-ignored part of the way we do things nowadays....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-5579994683477955417?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/5579994683477955417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=5579994683477955417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/5579994683477955417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/5579994683477955417'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/07/career-advice-from-charlie-munger.html' title='Career Advice From Charlie Munger'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-3046977839184865568</id><published>2008-07-19T00:49:00.001-07:00</published><updated>2008-07-19T00:50:12.875-07:00</updated><title type='text'>If...</title><content type='html'>&lt;a href="http://www.kipling.org.uk/poems_if.htm"&gt;what a fantastic poem!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-3046977839184865568?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/3046977839184865568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=3046977839184865568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3046977839184865568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3046977839184865568'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/07/if.html' title='If...'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-1076941405587195948</id><published>2008-07-16T23:16:00.001-07:00</published><updated>2008-07-20T17:33:14.212-07:00</updated><title type='text'>People Can Rationalize Anything...</title><content type='html'>but having a reason does not make a certain choice the right one.&lt;br /&gt;We all think we make rational decisions based on good information... and all our actions make sense.&lt;br /&gt;&lt;br /&gt;The truth is, we are ruled by our emotions, biases, beliefs, and history more than we realize, or might want to admit.&lt;br /&gt;&lt;br /&gt;It's hard enough to act on uncertainty, but if we can't take in data and information unfiltered, it makes things even worse. We end up not maximizing our probabilities, and even though we might have a short run at success due to luck; luck, as they say, is a fickle mistress.&lt;br /&gt;&lt;br /&gt;The best skill to learn is to first, take in information for the choices we care about without filters and prejudice, then to learn to evaluate that information.&lt;br /&gt;&lt;br /&gt;It sounds simple, but it really is so hard. I find myself having set reactions to so many triggers, a lot of them so pavlovian that it borders on the comical.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-1076941405587195948?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/1076941405587195948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=1076941405587195948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1076941405587195948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1076941405587195948'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/07/we-can-rationalize-anything.html' title='People Can Rationalize Anything...'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-7774123415647006806</id><published>2008-05-21T16:51:00.000-07:00</published><updated>2008-06-21T21:36:56.468-07:00</updated><title type='text'>Cynical or Idealistic?</title><content type='html'>&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Idealistic about strategy (vision). Cynical in terms of execution. (code and process)&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande; min-height: 18.0px"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;A lot of people are either idealistic or cynical, and they take pride in being one and not the other. I think you need to be both.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;You need to be idealistic about your vision. It requires many leaps of faith to think big and create new opportunities. &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;You need to be fully commited to your vision to have any shot at success.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande; min-height: 18.0px"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;But for code and process, you need to be cynical. Like a colleague of mine says, you need to look at this with a balance sheet.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;You have to realize when an asset (a codebase) is worth investing more money into, or when it's time to cut your losses.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;At a certain point, a codebase can turn from being an asset to a liability, (once it accrues too much technical debt) especially if it hinders the business from evolving against competition.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Lucida Grande; min-height: 18.0px"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-7774123415647006806?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/7774123415647006806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=7774123415647006806' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/7774123415647006806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/7774123415647006806'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/05/cynical-or-idealistic.html' title='Cynical or Idealistic?'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-1568752066769781218</id><published>2008-05-16T16:12:00.000-07:00</published><updated>2008-05-21T15:11:44.649-07:00</updated><title type='text'>Thoughts on Hiring: Why You Shouldn't Judge People Solely On Outcomes</title><content type='html'>History and track records are important. They establish credibility and inspire confidence.&lt;br /&gt;We see this in many things: best-selling authors, recommendations in Linkedin, suggestions for doctors from someone you know, or people's resumes and references.&lt;br /&gt;Track records can also be kind of a self-fulfilling prophecy for success; the more successful you were in the past, more people will want to work with you and the more opportunities will come up.&lt;br /&gt;&lt;br /&gt;The problem that I see with track records is, most people, especially when desperate for more help, never look beyond it and just take everything people with good track records say at face value, and don't dig any deeper. This is especially dangerous for non-deterministic situations.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fortune's Role&lt;/span&gt;&lt;br /&gt;Track records are made out of outcomes. The thing about outcomes is a lot of it is due to chance. People generally think probability is only important in activities like gambling and finance, but it also plays a very important role in business, software development, new ventures, etc.&lt;br /&gt;A long string of successes often blinds us to luck's effect on those outcomes, and we start feeling an aura of invincibility and treating future ventures with an inevitability of success, which is very dangerous.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Not All Successes are Made Equally&lt;/span&gt;&lt;br /&gt;This sounds really obvious. For example, in professional baseball, if I have a hitter at the minor leagues who hits .300, and someone in the majors who hits .290, it's fairly obvious that the 2 are not comparable, and that you have more of an appreciation for the major leaguer's batting skills. (at least I do) Even though it's really obvious, a lot of times we seem to ignore this fact.&lt;br /&gt;Let's say for example, you are interviewing 2 people for a job. The first one has successfully delivered in all 10 of his projects, while the other guy has 4 failed ventures, and 6 successes. Given that information, who would you choose? I think most people will pick guy #1, without any more questions asked.&lt;br /&gt;What they failed to investigate, was that guy #1 has mostly been working on similar looking projects that are easier to deliver, while guy #2 took on some hard stuff early on and took some failures, learned from them, and has since had a higher success rate. Guy #2 also has took on a wide variety of jobs, giving him a lot of perspective on what tradeoffs for the choices that he has had to make. Guy #1 in the meantime, just follows a "tried-and-true" formula for everything that he does. (remember, there are no silver bullets!)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Halo Effect&lt;/span&gt;&lt;br /&gt;A corollary to this is people who rationalize their actions by saying, "so-and-so also does it".&lt;br /&gt;&lt;br /&gt;It's a common reaction to treat everything that a successful person does as good or worthy of duplication. Successful people have a halo effect. An example was: puzzles as interview questions from Microsoft. Because Microsoft was the hot new success back in the 80's and early 90's, everyone started trying to copy their interviewing techniques. People have since questioned the direct correlation between puzzle-solving and software development skills, but this practice has spread so much that virtually all software developers have encountered puzzle questions in interviews. (I guess maybe if you are &lt;a href="http://www.amazon.com/Mock-Mockingbird-Raymond-M-Smullyan/dp/0192801422/ref=ed_oe_p"&gt;programming in Haskell (read Smullyan's to Mock a MockingBird)&lt;/a&gt;, some sort of logical reasoning skills are important)&lt;br /&gt;The point is, you have to beware of &lt;a href="http://en.wikipedia.org/wiki/Cargo_cult"&gt;cargo-culters&lt;/a&gt; who blindly follow the people with good track records.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What You Should Look For: Process/Approach and an Appreciation for Risk&lt;/span&gt;&lt;br /&gt;Process can sometimes be a touchy subject, because to some extent, everyone does things a little differently, and different situations call for slightly different processes.&lt;br /&gt;I like the word approach better, I think there are some common themes that you should look for in a person's reasoning and thinking when they talk about how they do things.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Do they try to get quick feedback?&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Feedback gives you data so that you can make more informed decisions. This is especially important when there are a lot of unknowns. You have to drive those unknowns out.&lt;/li&gt;&lt;/ul&gt;     2.  Are they "philosophical" about both their failures and successes?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I don't know if philosophical is the right word, but people often think a lot about their failures and try to learn from them and turn them into a positive experience. A lot of people don't really think deeply about their good outcomes; they mostly attribute good things to good strategy and execution, instead of thinking about what could have gone wrong that went right, and whether the decisions that they made were the best, and what part luck and coincidence played in their success.&lt;br /&gt;You want this type of person because they appreciate the fact that success is never a given, and the best chance for succeeding in any non-deterministic task is ability to get feedback, and to act on the feedback when appropriate.&lt;br /&gt;When hiring people with a lot of experience, this is doubly important. You mostly hire experienced people for their insight, and because they should have a lot of different perspectives. But if they don't look back and think/internalize about what they have done, they won't have this. Instead they will mostly likely be set in their ways, and it will be hard to get them to adjust to new things and ideas.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;3.  Do they take risk into account?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I have always hated platitudes that try to stir up emotion and try to show determination. Sayings like, "Failure is not an option", or "We will prevail", "we will not fail", etc. A lot of people who say these kinds of things seldom have a plan to hedge for risk, and they always flame out spectacularly in the end. People who don't take risk into account are dangerous for you to be associated with, especially if they have a history of successes. Those successes have probably made them too confident in the way they do things, and are too arrogant to admit mistakes and change.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;The Question That You Have To Ask:&lt;/span&gt;&lt;br /&gt;Which person/choice improves my probabilities the most for what I want to do?&lt;br /&gt;At the end of the day, that is all that matters. Track record is only important in the context that it will improve the odds of future success.&lt;br /&gt;You can't answer this question until you probe and find out about the person's decision-making approach, and his perspective on his previous experiences.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-1568752066769781218?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/1568752066769781218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=1568752066769781218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1568752066769781218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1568752066769781218'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/05/why-you-shouldnt-judge-people-solely-on.html' title='Thoughts on Hiring: Why You Shouldn&apos;t Judge People Solely On Outcomes'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-2774989124569488791</id><published>2008-03-30T19:32:00.000-07:00</published><updated>2008-04-05T14:54:50.148-07:00</updated><title type='text'>On Choices, and Making Decisions</title><content type='html'>People always say that it's good to have choices, and most of the time, they're right.&lt;br /&gt;But sometimes, having to choose can be a curse, especially when there is no obvious option.... it becomes an exercise of weighing tradeoffs and second-guessing yourself. This process can get torturous, and some people go to great lengths to avoid thinking about it. They tend to either pick a choice randomly after pushing off the decision until the latest moment, or go with the popular vote.&lt;br /&gt;&lt;br /&gt;For some of the decisions we have to make, (picking which brand to buy, where to eat) we don't really care about what choice we make, but for others, we care a lot. (where to move to, who to marry, what to do for a living, etc.)&lt;br /&gt;&lt;br /&gt;I've recently had to make an important decision, and it was hard to pick among the choices. Below are some of the things I did and questions that I asked to come to my choice.&lt;br /&gt;&lt;br /&gt;1.) &lt;span style="font-weight: bold;"&gt;What do you really want out of this decision?&lt;/span&gt;&lt;br /&gt;This sounds really obvious, but I did not ask myself this until later, because I was swayed by the popular vote and blinded by the pontential dazzle and prestige of some of the choices. Answering this question gave me a baseline to work with, and ruled out some choices quickly. It also made me realize which benefits were the real meat and potatoes and which ones were just gravy.&lt;br /&gt;&lt;br /&gt;2.) &lt;b style="font-weight: bold;"&gt;What can be realistically expected out of X&lt;/b&gt;&lt;span style="font-weight: bold;"&gt; choice?&lt;/span&gt;&lt;br /&gt;A lot of times, we get blinded by potential. The problem with potential, is that of course, there is a big chance that it will go unfulfilled. (as a lot of fantasy sports team players know =)) When making decisions, it's important to take note of what each choice can give us for sure, and which benefits are reaches.&lt;br /&gt;&lt;br /&gt;3.) &lt;b style="font-weight: bold;"&gt;What's the worst that could happen if I make X&lt;/b&gt;&lt;span style="font-weight: bold;"&gt; choice? (downside)&lt;/span&gt;&lt;br /&gt;Asking this question helped me to understand and deal with my fears behind each of my choices, and also gave me a clearer picture of my risk tolerance. A lot of times, we are afraid of riskier choices, and other people's advice often steer us to the status quo. What we have to realize is that risky choices and big changes can be good for us at certain points of our lives. Opportunity only knocks a couple of times, and if we don't take it, we will often regret it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4.) &lt;span style="font-weight: bold;"&gt;What would the future me on my deathbed think?&lt;/span&gt;&lt;br /&gt;A little dramatic, but a very useful question nonetheless. This helps to put things in perspective. It gives us a long-term outlook over what is more convenient now, and often helps us realize what is really important to us.&lt;br /&gt;&lt;br /&gt;5.) &lt;span style="font-weight: bold;"&gt;What does your gut tell you?&lt;/span&gt;&lt;br /&gt;This is a little harder to quantify, but we often get a "feeling" about some particular choice. I was hesitant to put this in, because bad things have happened when people followed their gut/heart instead of their head. (stocks, life partners, etc.) I consider this more to be a tie-breaker. If everything else is equal, or pretty close, then this will probably be the thing to push one choice over the top.&lt;br /&gt;&lt;br /&gt;6.) &lt;span style="font-weight: bold;"&gt;Realize that the future is always uncertain.&lt;/span&gt;&lt;br /&gt;Sometimes I get paralyzed by some particular choice that I have to make. I drag my feet hoping for more certainty to emerge, but most of the time it doesn't. This makes me afraid to make a choice and I often decide to take the easy way out and keep the status quo. I've regretted it everytime... a lot of times, the only way to improve is to take a risk. Life is about probabilities, and the only thing you can do is to improve your odds.&lt;br /&gt;&lt;br /&gt;And..... that's it for now. All of us face decisions everyday, some of us never learn how to do it. Hopefully this helps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-2774989124569488791?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/2774989124569488791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=2774989124569488791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/2774989124569488791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/2774989124569488791'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/03/on-choices-and-making-decisions.html' title='On Choices, and Making Decisions'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-6793998440173314592</id><published>2008-03-01T11:23:00.000-08:00</published><updated>2008-03-01T11:26:31.555-08:00</updated><title type='text'>Buying Advice</title><content type='html'>"It is far more profitable to sell advice, than to take it."&lt;br /&gt;&lt;br /&gt;- Steve Forbes, publisher of &lt;span style="font-style:italic;"&gt;Forbes&lt;/span&gt; magazine&lt;br /&gt;&lt;br /&gt;Being a cynic, and a consultant, I can really see the humor of that quote! =)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-6793998440173314592?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/6793998440173314592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=6793998440173314592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6793998440173314592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6793998440173314592'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/03/buying-advice.html' title='Buying Advice'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-6757252890008358133</id><published>2008-02-03T00:03:00.000-08:00</published><updated>2008-02-03T00:41:16.333-08:00</updated><title type='text'>Idiomatic Python Resources</title><content type='html'>I've finally found a good resource on how to write idiomatic Python/Pythonic code. It's a &lt;a href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html"&gt; presentation &lt;/a&gt; from Pycon 2007.&lt;br /&gt;Check out the references at the end of the page.&lt;br /&gt;&lt;br /&gt;These are really useful because coming from a Java background, I don't want to keep writing in a Java or just functional style. (I went crazy with this after reading the Little Schemer and the Seasoned Schemer books.)&lt;br /&gt;In Python, you can do both, which seems to make &lt;a href="http://gnosis.cx/TPiP/"&gt;Pythonistas more pragmatic&lt;/a&gt; (uses both styles) than the purely functional programmers, while not being tied to just &lt;a href="http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html"&gt;nouns&lt;/a&gt; like Java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-6757252890008358133?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/6757252890008358133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=6757252890008358133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6757252890008358133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6757252890008358133'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2008/02/idiomatic-python-resources.html' title='Idiomatic Python Resources'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-7020249156261374123</id><published>2007-12-23T19:20:00.000-08:00</published><updated>2008-02-13T16:56:15.006-08:00</updated><title type='text'>Reality Is...</title><content type='html'>"Reality is like fine wine, it will not appeal to children."&lt;br /&gt;&lt;br /&gt;- Don Miller&lt;br /&gt;&lt;br /&gt;A little snobby but true... great quote.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-7020249156261374123?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/7020249156261374123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=7020249156261374123' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/7020249156261374123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/7020249156261374123'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/12/reality-is.html' title='Reality Is...'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-6129232137150414889</id><published>2007-10-19T20:44:00.000-07:00</published><updated>2007-10-19T20:45:16.368-07:00</updated><title type='text'>Some Geek Humor</title><content type='html'>&lt;a href="http://davidrupp.blogspot.com/2007/10/last-language-war-language-trolling.html"&gt;Programming language humor&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-6129232137150414889?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/6129232137150414889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=6129232137150414889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6129232137150414889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/6129232137150414889'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/10/some-geek-humor.html' title='Some Geek Humor'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-4924802667255986796</id><published>2007-10-17T20:04:00.001-07:00</published><updated>2007-10-17T20:47:58.461-07:00</updated><title type='text'>A Prime Question</title><content type='html'>What's the fastest/most efficient way to get the common prime factors of 2 numbers?&lt;br /&gt;&lt;br /&gt;I thought about getting the gcd (greatest common divisor) using Euclid's algorithm, then find the prime factors for the gcd&lt;br /&gt;&lt;br /&gt;Not sure if there is a more efficient method.&lt;br /&gt;&lt;br /&gt;Guess gotta ask some more math-y people...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-4924802667255986796?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/4924802667255986796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=4924802667255986796' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4924802667255986796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4924802667255986796'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/10/prime-question.html' title='A Prime Question'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-5066343925034704728</id><published>2007-10-16T06:40:00.000-07:00</published><updated>2007-12-02T20:45:09.298-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python is very succinct</title><content type='html'>So I decided to pick up Python the other day, just to see what it was all about.&lt;br /&gt;Normally when I learn a new language, I read about the basics and dive right into it by using it to write a program.&lt;br /&gt;&lt;br /&gt;For Python, I decided to write a solution for one of the Facebook puzzles, &lt;a href="http://www.facebook.com/jobs_puzzles/?puzzle_id=5"&gt; Prime Bits.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It was great. I finished the problem quicker than I thought I would, (1 day) considering I'm just learning the language.&lt;br /&gt;And it was under a 100 lines of code as well. (not counting unittests of course, which are more than 100 lines by themselves)&lt;br /&gt;&lt;br /&gt;I've been thinking about why that is, and I think it's because of all the built-in list operations at least in this program's case.&lt;br /&gt;In Java, the equivalent of a list comprehension in Python might take 10 more lines of code.&lt;br /&gt;&lt;br /&gt;I wonder if it's the same for Ruby...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-5066343925034704728?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/5066343925034704728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=5066343925034704728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/5066343925034704728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/5066343925034704728'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/10/python-is-very-succinct.html' title='Python is very succinct'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-344835608196338798</id><published>2007-08-28T19:51:00.000-07:00</published><updated>2007-08-28T19:54:44.167-07:00</updated><title type='text'>Two Boys From Manila</title><content type='html'>Two boys growing up,&lt;br /&gt;Two minutes from each other.&lt;br /&gt;&lt;br /&gt;One eats three meals a day, sometimes more.&lt;br /&gt;The other is lucky to eat anything at all.&lt;br /&gt;&lt;br /&gt;One sleeps on a bed, in an air-conditioned room.&lt;br /&gt;The other on cardboard, under the stars and the moon.&lt;br /&gt;&lt;br /&gt;One has a car to take him places,&lt;br /&gt;The other wishes for shoes to help his paces.&lt;br /&gt;&lt;br /&gt;One has three maids, for his every want and need.&lt;br /&gt;The other has eight siblings to clothe and to feed.&lt;br /&gt;&lt;br /&gt;One has parents, who would give him the world,&lt;br /&gt;Yet proud and spoiled, he rebels at their every word.&lt;br /&gt;The other's father, gambles everyday,&lt;br /&gt;Money for food, he takes to play.&lt;br /&gt;&lt;br /&gt;One gets money, and doesn't appreciate,&lt;br /&gt;"I want more than this", he shouts irate.&lt;br /&gt;The other in dumpsters, he scraps and collects.&lt;br /&gt;To feed his family with the one's rejects.&lt;br /&gt;&lt;br /&gt;Bent down in hunger, on his knees,&lt;br /&gt;The other sees one on the street.&lt;br /&gt;"Palimos po", the other pleads.&lt;br /&gt;But one only spits on the concrete.&lt;br /&gt;&lt;br /&gt;Forgive me Father, for I was the one.&lt;br /&gt;Who had been given everything by your Son.&lt;br /&gt;But selfish and blind, failed to see the other,&lt;br /&gt;Who in need, was my brother.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;written Jan '06&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-344835608196338798?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/344835608196338798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=344835608196338798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/344835608196338798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/344835608196338798'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/08/two-boys-from-manila.html' title='Two Boys From Manila'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-3664782109835728863</id><published>2007-08-26T15:41:00.000-07:00</published><updated>2007-08-26T16:25:27.358-07:00</updated><title type='text'>Learning to Find the Right Solution</title><content type='html'>All through my years in school, from prep school in Manila to a Comp Sci degree at UW-Madison, I was taught and told to memorize many different formulas and solutions.&lt;br /&gt;&lt;br /&gt;Math, science, economics, programming, etc. all followed a similar trend. We were taught formulas and theories in lecture, and then were expected to apply these new learnings to the problems that we faced in projects and tests.&lt;br /&gt;&lt;br /&gt;This was supposed to serve as training for a job in the working world.&lt;br /&gt;&lt;br /&gt;I think there is something fundamentally wrong with this pattern, specifically in the lecture then test part. As a student, when you are facing a question on a test, &lt;span style="font-weight: bold;"&gt;you know that the expected answer can be constrained to something that you just learned&lt;/span&gt;.&lt;br /&gt;So in order to do well on tests, most students end up just memorizing the text and regurgitating what was commited to memory.&lt;br /&gt;&lt;br /&gt;The solutions and formulas end up becoming useless detail, a hoop that students have to jump through in order to get the piece of paper that says they are fit and knowledgable enough to work.&lt;br /&gt;&lt;br /&gt;Because &lt;span style="font-weight: bold;"&gt;the problems/requirements are driven by the solution&lt;/span&gt;, and not the other way around, we know that we only need to blindly apply the solution to whatever problem we need to solve in the test/project.&lt;br /&gt;&lt;br /&gt;This pattern of learning does not really encourage creativity and real thinking. Worse, it does not teach students on how to solve problems and how to deal with ambiguity, which is a very essential skill in the working world.&lt;br /&gt;&lt;br /&gt;Students also do not get the answer to their frequently asked question, &lt;span style="font-weight: bold;"&gt;"Why do we need to learn this?"&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;As a result, the majority of graduates from school are only fit to work in the old factory model, where you are told exactly what to do and to follow the solution blindly.&lt;br /&gt;&lt;br /&gt;One of the worse things that come out as a result is that if the solution doesn't solve the problem completely, the problem gets reframed so that it fits the solution! I've observed that this is particularly true of a lot of MBAs. (not all of them, but a lot, I think this is a result of how much they had to pay to learn those solutions =))&lt;br /&gt;&lt;br /&gt;How can we change this? After all, there is a lot of value in knowing different solutions and formulas, and knowing them are usually requirements to getting jobs and delivering value.&lt;br /&gt;&lt;br /&gt;Well, from personal experience, I've found that I learn best when I am faced with a hard problem that I want to solve.&lt;br /&gt;I learn to research, and to know the pros and cons of solutions, and how to deal with one-offs, and to mix and match when appropriate.&lt;br /&gt;&lt;br /&gt;Still, the old mentality crops up sometimes, especially when I just learn about a new way of doing things. I find myself trying to apply what I just learned to all the problems that I face right after.&lt;br /&gt;&lt;br /&gt;&lt;span style=""&gt;&lt;span style="font-style: italic;"&gt;"If you only have a &lt;/span&gt;&lt;b style="font-style: italic;"&gt;hammer&lt;/b&gt;&lt;span style="font-style: italic;"&gt;, you tend to see every problem as a &lt;/span&gt;&lt;b style="font-style: italic;"&gt;nail&lt;/b&gt;&lt;span style="font-style: italic;"&gt;." &lt;/span&gt;    -Abraham Maslow.&lt;br /&gt;&lt;br /&gt;There is a definite disjoint in what school teaches us and what we have to face in the real world. School gets half of it right, you do need to know the solutions and formulas and ways of doing things.&lt;br /&gt;But we also need to know when it is appropriate to apply what we learned, and the current model of learning just does not cut it, when evaluated in this regard.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-3664782109835728863?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/3664782109835728863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=3664782109835728863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3664782109835728863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/3664782109835728863'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/08/learning-to-find-right-solution.html' title='Learning to Find the Right Solution'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-2778643957093376450</id><published>2007-08-25T17:43:00.000-07:00</published><updated>2007-08-25T21:06:58.238-07:00</updated><title type='text'>Performance Testing Java Code</title><content type='html'>I'm currently reading the book, &lt;a href="http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601"&gt;Java Concurrency in Practice,&lt;/a&gt; and there is a great section in there about performance testing programs written in Java. (If you haven't read the book and you are a programmer of any language having to deal with concurrency, I highly recommend it!)&lt;br /&gt;&lt;br /&gt;There are some "gotchas" in there that I don't think I would've thought of that might produce variances in your performance testing numbers: (some of these is java specific, but most of them can be generalized)&lt;br /&gt;&lt;br /&gt;1.) &lt;span style="font-weight: bold;"&gt;Remember to tune your app with all production configurations for your VM set.&lt;/span&gt; If you don't and don't use the -server flag, you wil most likely be surprised at the bottlenecks and problems when your app is on production and under heavy use, since the bottlenecks that you encountered might be done away by optimizations done by the -server setting.&lt;br /&gt;Worse, the code that you wrote to get around the bottleneck during testing might become the bottleneck.&lt;br /&gt;&lt;br /&gt;2.) &lt;a href="http://en.wikipedia.org/wiki/Dynamic_compilation"&gt;&lt;b&gt;Dynamic Compilation&lt;/b&gt;&lt;/a&gt; - Java has 2 ways of running your code, it will either interpret the bytecode, or after a while, the dynamic compiler will convert the bytecode to machine code.&lt;br /&gt;I don't think you can really know when this will kick in, but this could cause a lot of variance in your performance testing results because machine code will run faster than bytecode. (the chart in the book shows more than half gain) Also, if the compiler decides to do its thing when your test is running, that will also use up resources, etc. which could also skew the numbers.&lt;br /&gt;The solution the book proposes is to "warm up" the code a few times to avoid this.&lt;br /&gt;&lt;br /&gt;3.) &lt;b&gt;Usage patterns&lt;/b&gt; - Trying to simulate lot of threads hitting a part of your code is not enough to be an accurate indicator of bottlenecks. There is also the element of how much computation the threads are crunching, and the size of the payloads/data.&lt;br /&gt;For example, for simplified purposes, you might decide to use test data or shorten the tasks that are being executed by the threads when you are performance testing, and try to make up for it by the volume of concurrent tasks that you throw at it.&lt;br /&gt;Thing is, this could be a different usage pattern, a lot of short-running tasks versus fewer long-running computations call for different optimizations.&lt;br /&gt;With a lot of short-running tasks, there could be a lot of contention for shared resources, so trying to solve that bottleneck would be a big benefit.&lt;br /&gt;Fewer long-running tasks do not have this problem. Instead there is more a &lt;a href="http://java.sun.com/docs/books/tutorial/essential/concurrency/liveness.html"&gt;liveness&lt;/a&gt; concern with the application; how do you know whether the thread is running slow or blocking/waiting for resources?  How do you know it's not deadlocked?, etc.&lt;br /&gt;Optimizing for one usage pattern will most likely not be applicable for another, that's why it's important to know this kind of background information before starting to optimize.&lt;br /&gt;&lt;br /&gt;4.) &lt;span style="font-weight: bold;"&gt;Static/Unchanging Test Data&lt;/span&gt; - if your test always pushes the same input data through to be computed/operated on by your code, the compiler might compute it once and store/cache or replace the code that you have with a precomputed result. This will cause in long-running first passes through the code,  and really fast execution after awhile.&lt;br /&gt;This is something to watch out for especially if the data your code is computing comes from  users, make sure you use dynamic data.&lt;br /&gt;&lt;br /&gt;There are many other good points in the book, some parts of it require re-reading a couple of times, but I think it's because of the complexity of the subject, not the writing/language. (it is very readable, plus, there are a lot of good code samples) I think it is one of those books where you get something different out of it everytime you read it, since the pages are so information-packed that you can only focus on certain things the first pass through.&lt;br /&gt;&lt;br /&gt;I'm finally getting close to the end of it, and right now, my brain is close to bursting, so I guess it's time to empty it again with a few beers. Ciao!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-2778643957093376450?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/2778643957093376450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=2778643957093376450' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/2778643957093376450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/2778643957093376450'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/08/performance-testing-java-code.html' title='Performance Testing Java Code'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-1029397732062281861</id><published>2007-08-23T19:58:00.000-07:00</published><updated>2007-08-25T18:21:31.928-07:00</updated><title type='text'>The Thing About Higher-Level Programming Languages</title><content type='html'>I just read Paul Graham's &lt;a href="http://www.paulgraham.com/head.html"&gt;"Holding a Program in One's Head"&lt;/a&gt;. The premise is pretty much, the programmer becomes his utmost best and gets into the "flow" when he can think of the whole program at once.&lt;br /&gt;&lt;br /&gt;In my experience, this is very true, when I program for a while, I get to a certain point where my brain just flows and I can clearly see what I have to do to accomplish whatever the program's purpose was.&lt;br /&gt;&lt;br /&gt;There are many things that could interrupt this flow. One of them is not being able to transcribe the stuff in my brain to my IDE/editor. For those of you not familiar with programming software, this is analogous to someone trying to write a speech, but the transcriber is a slow typer and can't keep up with the flood of words, as a result, the speechwriter's flow is interrupted and is forced to repeat whatever he just said, causing him to lose his train of thought.&lt;br /&gt;&lt;br /&gt;Programming is the same way. You want to know your tools so well that they become an extension of your brain. The problem with lower-level languages is kind of like having someone not fluent in your language as your transcriber; you have to spell out more complicated words for the transcriber to understand.&lt;br /&gt;&lt;br /&gt;Using a good programming IDE/editor helps a lot with the tediousness. With a few keystrokes, you can automate away a lot of it. The problem is, sometimes it is still not enough. You will always encounter instances where you have to stop and spell out explicitly what you want the program to do. (fight with type system, deal with syntax idiosyncracy, etc.)&lt;br /&gt;&lt;br /&gt;That, I think, sums up why programming should mostly be done in higher-level languages. It interrupts your flow less often, you come up with elegant and simple solutions that are straight to the point because you can see more clearly. It increases productivity and creativity by a wide margin, because it abstracts away the low-level details that are not relevant. (except maybe for performance) If performance starts becoming a bottleneck, then you can always substitute the particular piece of code with a lower-level language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-1029397732062281861?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/1029397732062281861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=1029397732062281861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1029397732062281861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1029397732062281861'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/08/thing-about-higher-level-programming.html' title='The Thing About Higher-Level Programming Languages'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-4271923470341949765</id><published>2007-08-19T16:03:00.000-07:00</published><updated>2007-10-15T20:35:48.191-07:00</updated><title type='text'>Learning to Learn the Right Things</title><content type='html'>Everyday as we go about our business, we encounter many new and unfamiliar things and situations. This is good, since unfamiliarity often leads to a new experience and learning.&lt;br /&gt;&lt;br /&gt;Too much of this however, can become a bad thing; our minds become saturated, or we might struggle and lose confidence and get overloaded with details, we end up not learning much of anything at all.&lt;br /&gt;&lt;br /&gt;It's probably the same with other fields, but in software development, there is always something new to learn. A new language, a new framework, a new library, and sometimes, a totally new paradigm. A programmer who actively learns his craft for &lt;a href="http://norvig.com/21-days.html"&gt;10 years&lt;/a&gt; could have barely just scratched the surface. That's one of the reasons that led to the traditional IT shop becoming so siloed and specialized. (which is a bad thing)&lt;br /&gt;&lt;br /&gt;Given the sheer amount of details, it is important to step back and set goals, and realize what you want to learn and do. If you just follow what you need for your job, you end up learning only about a particular vendor's product or your company's home-brewed solution. When that vendor (or your company) goes belly-up or if you get laid-off (or bangalored/shanghaied) then all you can do is get on your knees and start praying because the knowledge that you have accumulated becomes useless detail. (unless of course, you work for a company like Amazon, Google, or MS, then your company's infrastructure might actually be more interesting than what's out there)&lt;br /&gt;&lt;br /&gt;Since we only have so much capacity in our brains, we should be more selective of what we learn. The best things to learn are the standardized things so your knowledge can be transferred. Or better yet, learn the principles of creation and design behind a particular implementation or a product.&lt;br /&gt;&lt;br /&gt;When I first started in the software industry, I thought given time, I would become proficient in the majority of the areas, but as I dig deeper, I am finally starting to realize how much I don't know yet and how much there is to learn.&lt;br /&gt;&lt;br /&gt;I've decided to scale back and be realistic, and focus on just a few fields. (compilers, networking/distributed systems) Otherwise, I want to learn too many things and end up just spinning my wheels.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-4271923470341949765?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/4271923470341949765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=4271923470341949765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4271923470341949765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4271923470341949765'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/08/learning-to-learn-right-things.html' title='Learning to Learn the Right Things'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-4640659221767236089</id><published>2007-08-13T07:04:00.000-07:00</published><updated>2007-08-25T18:22:04.900-07:00</updated><title type='text'>My Learning Goals as a Software Developer</title><content type='html'>1.) &lt;span style="font-weight: bold;"&gt;The compiler is not a black box.&lt;/span&gt;&lt;br /&gt;(ANTLR, compiler theory, Programming Language Pragmatics&lt;br /&gt;&lt;br /&gt;2.) &lt;span style="font-weight: bold;"&gt;Multicore processors&lt;/span&gt;&lt;br /&gt;(multi-threaded programming, Erlang)&lt;br /&gt;&lt;br /&gt;3.) &lt;span style="font-weight: bold;"&gt;Networking/Distributed Systems&lt;/span&gt;&lt;br /&gt;(communication protocols, scaling gracefully, algorithms, web servers)&lt;br /&gt;&lt;br /&gt;4.) &lt;span style="font-weight: bold;"&gt;Computer Science/Math&lt;/span&gt;&lt;br /&gt;(Modern Heuristics, Graph Theory, Computational Geometry, Combinatorial Math)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-4640659221767236089?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/4640659221767236089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=4640659221767236089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4640659221767236089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/4640659221767236089'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/08/my-learning-goals-as-software-developer.html' title='My Learning Goals as a Software Developer'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-1336048288323656389</id><published>2007-08-06T19:34:00.000-07:00</published><updated>2007-08-06T19:36:01.915-07:00</updated><title type='text'>Thoughts After First Project (Written in May '07)</title><content type='html'>&lt;p&gt;It's been really hectic the past few weeks, and next week will be a grind, but before dumping my head in and jumping back into the fray, I wanted to take a little time and make sure that I catalog a few things that I have learned over the past couple of months. After all, the whole point of doing projects, (other than business value for the client and revenue for us of course) is to grow and make sure that pain points experienced now will hopefully be prevented in the future.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Before I start, I should give a little background and general thoughts. (without getting into legal implications about confidentiality and stuff =)) &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The project is for a very well-known client in Chicago. Work is being done co-sourced, (with client devs and delivery/pm managers) and had a fairly aggressive timeline. It's close but I think we are going to make it. &lt;br /&gt;Overall, it's an awesome first project to be in. A lot of senior devs, great team "chemistry", open source tools used, interesting work, and a lot of learning for me.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The following list are things that I have learned and observed during the course of the project.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;1.) Technical debt is sometimes necessary&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;Every project accumulates technical debt. For this project, because of wanting to stay on track and maintain/increase velocity, decisions sometimes had to be made to move forward and cut a few corners.&lt;br /&gt;Whether it's less than optimal solutions or not taking more time to investigate different options, the decision that will increase the best business value might be to drop it and move forward.&lt;br /&gt;Just make sure that you, the rest of the team, and the client knows the pros and cons of the decisions. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;2.) Don't try to be a hero&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;I thought about this more after reading &lt;a href="http://www.37signals.com/svn/posts/386-dont-be-a-hero-giving-up-is-good"&gt;DHH's recent blog post&lt;/a&gt;. (Ruby on Rails creator)&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;There were quite a few times over the course of the project where senior devs would push back on riskier features that I thought might've been implementable given the amount of time. While everything might've come out OK, it should be the client's decision to decide whether a certain feature is core or a nice-to-have, given the risk and the potential cost.&lt;br/&gt;&lt;br /&gt;I can see that some of the pushing back is paying off now, and we are able to put in certain nice-to-have's as well once the core has been done.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;3.) Falling ice, beware!&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;Projects will always have risk. And just as signs on the sidewalk are important to make us aware of potential hazards, risks on a project should also be identified and flagged.&lt;br/&gt;&lt;br /&gt;So who should be flagging risks? Well, technically you could say the project manager, since he is the logical choice to coordinate a solution or present it to clients. But the right answer is everyone on the team. On this particular project, a lot of the risks were flagged by developers and BAs, and a lot of times, they were one step ahead of the risks with potential/implemented solutions for them already.   &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;4.) "Walk softly, and carry a big gun." - dawn of war&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;Performance matters. And since it does, it should be addressed earlier.&lt;br /&gt;Note that I am not talking about &lt;a href="http://en.wikipedia.org/wiki/Optimization_%28computer_science%29#When_to_optimize"&gt;premature optimization&lt;/a&gt;. But once certain areas of the application are done, it seems to be a good idea to start measuring and getting performance numbers to have a rough inkling about where the bottleneck might be, instead of waiting for everything to be done and the cement to set before doing it. Once you start optimizing, make sure that performance does not degrade by putting some performance tests in your integration/deployment/daily build.  &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;5.) Put &lt;a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29"&gt;Ajax&lt;/a&gt;/JS effects last&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;If there was anything painful about this project, it's the "view" part of the application. The client specifically wanted Ajax on certain parts of the site, so developers (including me) implementing the features would put the Ajax right away as the de facto choice.&lt;br/&gt;&lt;br /&gt;Looking back, this was a bad idea for a couple of reasons, this made Ajax implementation and the user experience inconsistent across different areas, and the application does not degrade gracefully.&lt;br /&gt;I recently finished the book &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0321472667/oneamongstamu-20"&gt;Bulletproof Ajax &lt;/a&gt;, and the author &lt;a href="http://adactio.com/"&gt;Jeremy Keith&lt;/a&gt; discusses a good way to do it.&lt;br/&gt;&lt;br /&gt;First make sure the site works in normal HTML with standard get and post reloads without Javascript, then hijack user behavior with Javascript/Ajax. This way, the Javascript is &lt;a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript"&gt;unobtrusive&lt;/a&gt; and the application has a default before to fall back on if Javascript is not working/enabled.&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;This also has the advantage of being easier to combine/reuse Javascript across multiple pages.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;6.) Don't leave the view for the end&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;We got our "display" stuff (HTML/CSS) from a third party design firm for this project. There was a lot of pain experienced integrating their work with ours, parts of some pages broke, etc. because of different CSS class names, HTML element id's, pure HTML vs JSP, etc.&lt;br /&gt;Looking back, I think integration between design firms and dev teams might be better if HTML (just the HTML, CSS not necessary) was delivered up front before the dev team started so that the id's, classes, and names of HTML elements will not have to change much. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;7.) Be consistent, enforce agreements&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;I saw the importance of consistency in this project. While things are not perfect, I can say that I can reasonably expect a certain way of doing things when looking at Java code, like naming conventions, etc.&lt;br /&gt;The same cannot be said for the Javascript. But I've talked enough about that in #5.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;8.) Minimize risks from external dependencies&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;We had to integrate with certain external services for our application.&lt;br /&gt;It's important to&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;a.) have a separate module deal with the outside source and have the rest of your application deal with that one module.&lt;br/&gt;&lt;br /&gt;b.) expect the external service to be done and plan accordingly. Also to stub things out for testing!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;9.) Know (and learn) good tools&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;Tools like &lt;a href="http://www.openqa.org/selenium/"&gt;selenium&lt;/a&gt;, &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;cruise control&lt;/a&gt;, (a given on Thoughtworks projects) &lt;a href="http://checkstyle.sourceforge.net/"&gt;checkstyle&lt;/a&gt;, &lt;a href="http://pmd.sourceforge.net/cpd.html"&gt;cpd&lt;/a&gt; (copy paste detector) and &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;firebug&lt;/a&gt; were very useful for the project. I found firebug to especially be a lifesaver for doing Javascript and browser work. I've used it before this project, just not to the extent that I am using it now. Having the ability to inspect an HTML DOM element, having a debugger for Javascript, and changing CSS and HTML directly in the browser have been great time savers.  &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;10.) &lt;a href="http://en.wikipedia.org/wiki/Refactoring"&gt;Refactor&lt;/a&gt; beyond the scope of the &lt;a href="http://en.wikipedia.org/wiki/User_story"&gt;"story"&lt;/a&gt;&lt;/strong&gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/User_story"&gt;Stories&lt;/a&gt; is an agile development term for feature. Usually developers get assigned to do stories.&lt;br/&gt;&lt;br /&gt;There are times were a bunch of stories will be in play that are all related and are similar to each other, so different dev pairs will be churning out pretty similar looking code.&lt;br/&gt;&lt;br /&gt;Once the stories are done, we usually move on to do other stories. But I think there should be some time spent refactoring and removing duplication in the Java code, as well as the view area. (jsp's, javascript, html, etc.)&lt;br/&gt;&lt;br /&gt;This should be done as early as possible because once people start building more code on top of the duplication, it gets really really hard to refactor it.&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;So for some later requirement being played, (for example: guest users need to be prompted to login when clicking a save button) instead of changing Javascript in one place, you will have to go page by page, since changing the jsp's at this time will mean editing the css, the java code, the xml files, etc.&lt;br/&gt;&lt;br /&gt;I guess that's why &lt;a href="http://gettingreal.37signals.com/"&gt;small teams are preferable&lt;/a&gt;, it's easier to have good cohesion and less duplication in the code.  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-1336048288323656389?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/1336048288323656389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=1336048288323656389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1336048288323656389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/1336048288323656389'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/08/thoughts-after-first-project-written-in.html' title='Thoughts After First Project (Written in May &apos;07)'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-265396792905196759.post-9201531254029862523</id><published>2007-08-06T18:04:00.000-07:00</published><updated>2007-08-07T18:14:52.772-07:00</updated><title type='text'>The More Things Change...</title><content type='html'>the more they feel the same.&lt;br /&gt;&lt;br /&gt;Sure, everytime something new comes along, there is inevitably a feeling of shininess, a sense of wonder and excitement at something different.&lt;br /&gt;But lately, it seems like new things are just old things rehashed, there is really nothing new under the sun.&lt;br /&gt;&lt;br /&gt;New things become old, and as a person, my reaction to the different happenings in my life fall into a pattern. Is this what it means to grow up?&lt;br /&gt;&lt;br /&gt;I miss the feeling of school, where your future looks unbound, and your current place is just a step to what seems like a great journey.&lt;br /&gt;&lt;br /&gt;Lately, work has given my outlook a feeling of finality. Like, "this is pretty much how it's going to be, for the forseeable future."&lt;br /&gt;&lt;br /&gt;I guess there I'm feeling a sense of disillusionment at the failure of new things to deliver on their promise.&lt;br /&gt;&lt;br /&gt;I hope this is not true, that there are things out there that will get me up and motivated again, I guess we'll see. I'm not ready to give up yet. In the meantime, I should keep looking.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/265396792905196759-9201531254029862523?l=www.lo-phi.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lo-phi.com/feeds/9201531254029862523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=265396792905196759&amp;postID=9201531254029862523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/9201531254029862523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/265396792905196759/posts/default/9201531254029862523'/><link rel='alternate' type='text/html' href='http://www.lo-phi.com/2007/08/more-things-change.html' title='The More Things Change...'/><author><name>Timothy Wee</name><uri>http://www.blogger.com/profile/14906745045127017671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
