An end

We learn from the world. We learn from the nature, its myriad creations, the things and the beings; depending on our ability to perceive. There are lessons which we can prove with certain amount of learning, and others we take by the word. Our unquenchable faith and respect on the source helps translate the later into principles. We live by them, or the impressions of so… or the grand delusions of knowledge!
 
Others learn by feeling.. they tear apart the layer of perception, that of logic and extrapolation. They dive into the fire like a moth. Their action runs them over. They are crushed. They die. They go dark. And they resurrect, like a phoenix, only with a few gray hairs and another scar on the face… insatiable is their curiosity.
 
Will they dive into the fire again? Yes, you bet! Why?  Just for the sake of it. For the pleasure. But they’ve died enough. Don’t they ever learn!?
 
Oh, where is the ignorance? They never aimed for the fire. Instead it was the light they dived into, that beautiful glow of blue which holds the flame. For they know, the moment we reach any summit, the definition of summit changes. The destination gets a new attribute, an end. Why should they live or die for an end?
 
The sheer beauty of just being there… close to it yet far. They shed the tears… not because they see an end, but because there is none… may be there never was one. The universe of folded thoughts, unspoken words, and actions that were never tainted with done. So pure that is…
 
Sometimes I wonder, if they chose the run, or the scars or the resurrection. It appears they just jumped… Somewhere along the path, the experience, the knowledge cradled them and they flowed together…

On nothing

It’s been almost six months since I signed up on this experiment – to do nothing.

My decision was to put a hard stop on all creations. I started by transitioning out of my open source projects, my co developers were kind enough to take the responsibility. Lucky to have worked with awesome people. I stopped the idea notebook. And peacefully ignored the thoughts about new applications, beautiful systems and mash-ups.

I have awesome friends who are passionate about life, the world and software bridging the gap between.  During these months, I did manage to get out of our awesome discussions on the future, and software taking over the world :)  I have said no to many opportunities to collaborate and build with you. My apologies if I have hurt you or sounded arrogant. You now know the reason.

So what did you do in these months?

I saw tidbits and observed. Every time I would get dragged by urge to create, I would remind the self “It’s 2013, so what the what..” ;)

I spent a good amount of time with friends. I tried awesome working hours. I cooked food at home for most of the days. I cooked for friends too… good stuff. Worked out daily for some months. But then there came the dimension of mind…

I saw relationships being forged and being washed away. I saw how people elope with loved ones ;) I saw the fear, the worry of having (and not having). I saw how we manipulate. Just because one thing matters to us, how we make the world tune to that one thing. And we justify the puny little deeds of ours.

I thought about my thoughts. I got curious. Tried. I got attached, terribly so. I would wake up with them, and try to push them away.. only to bring them to be with me all day. I tried desperately to get out of it. I wrote down on scraps of papers, dump the emotions, reduced everything to just concepts in my mind. Multiple times. And I would get curious again. It’s 2013, so what the what… I remember the weekend I spent on just thinking about “someday”, the science of it… seriously.

About curiosity, it drove me crazy when I thought I had to learn a thought or fathom its depth. It drove me crazy when I did learn. Unending cycles of craziness. So the key take away, if you’re able to reduce something to just a concept; stop, stop, absolutely stop there, don’t get curious :)

I discovered the fear of resonance. The first time ever. There were moments where I did not speak, I had two concerns. First, I was afraid words may dilute my thoughts. Second, what if the whole universe can relate to what I said. The immense power of that relatedness scared me. It still scares me.

I had a concept that actions should never depend on the people or the environment. What is right is right; the river has to flow, so it flows… across the mountains, the gorges, the plains or the canals. The environment is just a detail. I think I have tried to live up to this, consequences… not sure.

Along the way, some things in the present triggered the past. Thanks to the stupid pattern matching engine in my head, I spent evenings in the past as well ;) It was worth it, you know; when you look back and smile at your old self.

Well, that’s a summary of what nothingness does ;) I stopped creating, but curiosity picked up a different channel, it appears.

Long time. I have four days of rest now. Time to reflect and reconcile the bits n pieces I collected along… one more experiment after that, may be. Let’s see.

// A friend’s post triggered a thought on creation today morning. I thought to pen down my experiment…

Along the path

Why do I need to reach the summit? Is there a destination?
A creation, a beginning or an end; I need none.
There is no crest or trough. Neither rise, nor the fear of fall.
This moment is all that is. Let’s live it and just be…

I create the worlds of thoughts; but they can’t be real.
This feeling, so magnanimous and beautiful;
can a world so small contain it all?
Joy is all that is. Let’s immerse in it and just be…

Let it flow, ever pure, eternal and free; lead us to the ocean infinite.
I wish I could speak it out;
can the play of words paint that?
Silence is all that is. Let’s smile and just be…

Opposites

Beautiful things are moulded when the right amounts of opposites get together. Similar principle applies to us, as individual and teams.

As with tons of other examples in nature, let me talk about a triplet here.

Our first set of heroes are visionaries, and are great starters. They love ambiguity, chaos and randomness in general. They will figure a path out. Second party comes here, they love complexity. Ignite an idea and hand it over to them, they will make sure the idea turns a reality. The last party is realistic, rational? people. They ask a lot of questions. They don’t love assumptions. Any time first and second fly high, the last pinches them and brings them back to world :)

Step back. Think what you bring to the table. And what are the unique perspectives of others around the table.

Respect. Listen. Listen some more. Ask.

Everything you create will be beautiful.

An experiment, shipped!

One evening in August 2012, I and a friend were taking a stroll around Building 3 Campus. We had just signed off on a big product release. Aside the usual armchair philosophy discussion :P , another interesting topic came up – what were the painful feature cuts from the last release, and the biggest customer asks. After two more rounds around the building, we had closed on a side project to experiment and apply our learnings from last release.

17th August, 2012 – Initial checkin. And on 27th August (couple of insane coding sessions, head bangs and workarounds later), we had a workable version, so prep’d a demo video and announced our side project to the team! We got great response. The next milestone – let’s productize that!

We got a feature crew, threw the initial prototype design, wrote some more awesome code, broke that couple of times with our tests and.. today we announced the feature to our customers as a CTP release.

Feels good. “Work on a feature from prototype to ship” – checked.

Some things went well, a few lessons learned; all that in another post. For now, I’ll take a deep breath and sleep :)

Collection of Hrishikesh Mukherjee movies

Anand (1971 film)

Anand (1971 film) (Photo credit: Wikipedia)

During my school days, one of my friends recommended Anand. The movie, a masterpiece by Hrishikesh da, is one of my all time favourites. Been a big fan ever since :) These days I have started watching all his Directed movies, with the less known ones first.

Most of his movies are available on Youtube, Google video and so on. Many thanks to movie distributors (Venus, Shemaroo and so on) for making these movies available to us. Purpose of this post is to act as an index of links to online streaming urls for his movies. Hope it will save you little time.

Organizing test plan

A test plan is more about finding the “right” scenarios than listing “all” scenarios. The later always deceives you by creating a false confidence that you’ve covered a lot quantitatively. In my experience, organizing your thinking plays a pivotal role in helping you outline the coverage matrix, and those few cases which are easily missed.

One useful pattern is creating a test matrix. Outline all the parameters which affect the behavior of a feature. Usually these fall into buckets – a) inputs from user or another component, b) the configuration of environment/ecosystem in which your application runs. Now based on the priority of a particular combination dive deeper into the scenarios by modifying these. Or you could use a pairwise testing tool to do the scenarios generation (nice introduction here). Also consider explicitly mapping the functional requirements to the scenarios.

A test matrix clearly calls out the cases you’re not covering (because of low priority etc.). This coherent presentation of the scenarios will enable anyone with understanding of functionality of this feature to review/contribute to the scenarios (may be trick your Program Manager or Developer to help you with the test scenarios ;) ).

Back to todo lists

Post an unproductive week and some moments of retrospection later; the root cause of my state of non-action seemed to be lack of clarity and focus. Every day this week, I had bunch of ideas related to the on going projects. Somewhere during this cycle of dealing with tasks, I got overwhelmed with the chained “task” reaction, and lost the focus to organize/think through.

Looking back…

I needed to get into the System again, let the System worry about ideas/projects/tasks. And then my goal should as simple as knocking the tasks off, one by one. My previous attempts to hack on a System were only moderately successful (apart from the few months when I hosted Tracks on my domain). Two lessons from the past -

  • Go for the most minimalist yet tweakable user interface. You must know where what is
  • Carefully choose the system (GTD et. al), or the system would get too complex, and ultimately take me down with it :)

Made the jump

Remember the Milk, it is. The biggest other online contender was Toodledo with great many features (per this comparison chart). I do care a lot about how and where my data goes (read encrypted), todoist only provides SSL with premium accounts. No go. Plus with RTM, I loved their usability and the amazing community around. If you haven’t done already, check out their Tips and Tricks blog posts. So far so good :)

Next, choosing a system. I started with Zen To Done (loved the principles), thanks to ssimon for this nice writeup on implementing ZTD with RTM.

Tweak it up

Here are the RTM mods I’m using:

And this is how the interface looks currently.

58

Book notes: Jack Welch – Straight from the Gut

Book: Jack Welch – Straight from the Gut
Author: Jack Welch
Rating: 3/5

———————–

Read it early this year. Notes seem to be not complete :(

- “You Punk! If you don’t know how to lose, you will never know how to win. If you don’t know this,
  you shouldn’t be playing” (page 4)

- Building self confidence in others is a huge part of leadership. It comes from providing
  opportunities and challenges for people to do things they never imagined they could do – rewarding
  them after each success in every way possible. (page 5)

- Building self esteem is very pivotal too. Small praises help a lot (page 6)

- The same is true for most business problems. The process helps you get closer to the darker shade of gray. There are rarely black-and-white answers. More often than not, business is smell, feel, and touch as much as or more than numbers. If we wait for the perfect answer, the world will pass us by. (page 18)

- Bosses usually have answers in mind when they hand out questions. They’re just looking for
  confirmation. To set myself apart from the crowd, I thought I had to think bigger than the
  questions posed. I wanted to provide not only an answer, but an unexpected fresh perspective.
  (page 24)

- When people make mistakes, the last thing they need is discipline. It’s time for encouragement and confidence building. The job at this point is to restore self-confidence. I think “piling on” when
  someone is down is one of the worst things any of us can do… Piling on makes leaders lose their
  confidence, panic, and spiral downward into a hole of self-doubt. (page 29)

- If we’re managing good people who are clearly eating themselves up over an error, our job is to
  help through it.. That doesn’t mean you have to take it easy on your star performers… Obviously
  a negative role model act doesn’t play nice on everyone. You can do it with your best – as long as
  they know they’re your best. Using role models always helped me make a point to the larger group
  (page 31)

- The best way to support dreams and stretch is to set apart small ideas with big potential, then
  give people positive role models and the resources to turn small projects into big businesses..
  (re failure in a similar swing for a product that never took off) we made a big point of rewarding
  people in the team. We wanted everyone in the company to know that taking a big swing and missing was ok. (page 31)

- I “kicked”, but also I “hugged” (page 43)

Book notes: Delivering happiness

Book: Delivering Happiness
Author: Tony Hseih
Rating: 4/5

—————

Read the hard copy in 2010. Digitizing them :) Some notable parts from the book I loved:

- I failed my way to sucess -Thomas Edison
- ..I felt stupid for trying to sell christmas cards in August, so that also ended up being my last
  stop. I went back home trying to think of a business idea that had less seasonality to it.
- Even in school, sometimes it pays to take risks and think outside the box.
- I was given the opportunity to present my case, but I didn’t really have a case because I had no
  idea how the lunch card wound up in my pocket. Instead, I went into the session with the blind
  faith that the right thing would happen as long as I told the truth, so that’s exactly what I did.
  As it turned out, nobody believed me, and I was suspended from school for a day,…
  *sometimes truth alone is not enough, and that presentation of the truth was as important* as the
  truth (page 20)
- I had discovered the beauty of selling products with high average selling prices and high gross
  margins.
- “hubris” in greek is defined as “an exaggerated sense of pride or self confidence” which often led
  to downfall of many a greek hero.
- ..The power of crowdsourcing. (page 26)
- I felt I’d succeeded. I’d won the game of what I was told college was supposed to be all about:
  getting a job that paid as much money as possible…
- But we wanted to run our business and be in control of our own destiny. (Page 36)
- _*Start-Up*_: By the end of first week, it dawned on me that neither of us was actually passionate
  about doing Web design work. We loved the idea of owning and running our own business, but the
  reality ended up being a lot less fun than the fantasy. (Page 37)
- We didn’t know what we wanted to do, but we had learned what we *didn’t* want to do. We didn’t
  want to work for Oracle. We didn’t want to do any more Web design work. We didn’t want to make any more sales calls. And we didn’t want to be bored out of our minds. (Page 38)
- As a thought experiment, I made a list of all things I would do with the money if I had it.. I was
  surprised that my list was so short, and that it was actually difficult for me to add anything
  else to it. With the savings I already had, I already had the ability to buy some of these.
  ….
  I was already helping run a company that I was excited about. It seemed kind of silly to sell a
  company that I was excited about in order to start another company to be excited about.
  ….
  I knew in my heart that, even if we failed, going after the opportunity was the right thing to do.
  It was much more important than owning a condo or loft at the age of twenty-three. Becoming a home owner could wait until later in life.
  ….
  We were still young. We could afford to be bold.
  ….
  “We have decided to turn down their offer.”.. “There will never be another 1997.”.. It was us
  against the world, and we were going to make sure we would win. (Page 44)
  ….
  I remember looking around the room at all the happy faces and thinking to myself, I can’t believe
  this is real… It was about everything that had happened in the past year. It just didn’t seem
  real.
- _*Rapid growth*_: Walking up and down the stairs in our building I wasn’t sure if the people I
  ran into worked for !LinkExchange. At that time, we didn’t think it was a bad thing.. Not
  recognizing people due to our hyper growth fueled the 24/7 adrenaline rush we were feeling. This
  should have been a *warning sign*.
  We should have paid more attention to the company culture. In the first year, we’d hired people who wanted to be part of building something exciting and fun. Without realizing we had built a company culture we enjoyed being part of. Then, as we grew more than 25 people, we made mistake of hiring people who were joining company for other purposes. Good: people we hired were smart and motivated. Bad: many of them were motivated by the prospect of either making lot of money or building their careers and resumes.

Debugging python with pdb++

A ~6 min screencast to demonstrate the most basic debugging workflows with pdb++ [1]. Other tools used in this screencast are virtualenv [2] and virtualenv-wrapper [3]. Do enable captions (the cc button) in the video, hopefully it will provide little more context.

That was my first screencast :) Please feel free to leave your feedback. It took more time than I had thought, most time went in adding subtitles, sync’ing them. I will do one follow up post on creating screencasts.


[1] http://pypi.python.org/pypi/pdbpp/, https://bitbucket.org/antocuni/pdb/src
[2] http://pypi.python.org/pypi/virtualenv
[3] http://www.doughellmann.com/docs/virtualenvwrapper/

Lessons on writing vim plugins

Last week I was hacking on a vim plugin to post automatically to posterous. Vim-blogit is basically a python script at its core and is bound to the vim interface using vim’s python interop support.

My initial workflow was like: Fire vim up, test something and hit a non-actionable error (since I won’t have the entire stack trace, nor could I use pdb.set_trace/attach debugger :( ). There is no way to debug python code running as part of vim (for good or bad), which means I cannot simply attach to vim and set breakpoints on the python script.Ah, most of my time went in setting up the environment, trial and error to figure root cause.

Thus began the quest to figure out alternatives.

Isolate the problem

Our problem is the interop between vim and python. We are tightly coupling the interface/view vim with the logic.

It’s obvious. Keep your core logic separate from vim module as much as possible, and unit test it out. Write tests for each function that is an entrypoint from vim To your core logic. And then run your script outside vim.

But there is no “import vim” outside vim…

So why not mock it up with a mock testing piece. Take a look at the sample mock vim implementations available.

Following provides a failover for your script outside vim, and gets the mock vim:

try:
        import vim
    except ImportError:
        # Used outside of vim (for testing)
        import doctest, minimock
        from minimock import Mock, mock
        from tests.mock_vim import vim

On splitting the code

Python provides awesome support for packages and modules. Use it. Yes, it is possible to put all code/unit tests in your .vim file with a python >>>here string. But it will become a pain point to browse through and maintain it.

Following code snippet provides a way to implement your plugin as a package:

python << EOF
    import os, vim

    # Get the blogit in python module path
    for p in vim.eval('&runtimepath').split(','):
        sys.path.append(os.path.join(p, 'plugin'))

    sys.path.append(os.path.join(os.getcwd(), 'plugin'))

    from blogit import core
    blogit = core.BlogIt()

    EOF

Include that in your plugin .vim script. Simple stuff, we just add our python package to the package search path.

Credits: much of this understanding came reading through source codes of well written plugins. Open source, for the win! BTW Steve has written a great article on Writing Vim Plugins, I highly recommend it.

Windows Phone: Store unit test results to isolated storage

This is a tiny experiment to automate parts of unit testing in Windows Phone 7.5 (Mango, here onwards). We will extend silverlight unit testing framework to store the results of a Mango unit test in MSTest test results format in application Isolated Storage and finally fetch them onto desktop.

Assuming you’ve Mango tools setup already. Get Mango compatible SL unit testing framework bits from Jeff’s blog.

Sample project is available here.

Setting it up..

  • Add IsolatedStorageReportingProvider.cs to your test project
  • Wire it up with the UnitTestHarness in your application entry page (see my MainPage.xaml.cs). By the way, Silverlight Unit Test framework code is available on codeplex. Feel free to explore :)

    // Set custom log writer
    IsolatedStorageReportingProvider isoLog = new IsolatedStorageReportingProvider(((MobileTestPage)testPage).UnitTestHarness.Settings.TestService);
    ((MobileTestPage)testPage).UnitTestHarness.Settings.TestService.RegisterService(Microsoft.Silverlight.Testing.Service.TestServiceFeature.TestReporting, isoLog);
    
    // Uncomment this to automatically terminate the test application after test is complete!
    //isoLog.LogPublished += new EventHandler(this.OnTestHarnessCompleted);
    
    (Application.Current.RootVisual as PhoneApplicationFrame).Content = testPage;
  • Fire up ISETool.exe to get the results onto desktop

    Isetool

     

Additional thoughts

  • With some ISETool.exe and MSBuild fu, it should be possible to get continuous integration magic. In this context, Richard Szalay‘s WP7CI project looks promising. I haven’t tried it, may be it is possible to reuse the same set of scripts.
  • Publishing these results to TFS servers may be possible too. Looks like testresults.trx requires some additional files to work correctly in VS (could be because of vsmdi test metadata?)