Your Website2022-05-31T18:09:15+00:00http://prasannapendse.com/Prasanna Pendseprasanna.pendse@gmail.comhttp://prasannapendse.com/2021/05/21/reading-women-challenge-2020Reflections on the Reading Women Challenge 20202021-05-21T00:00:00+00:002021-05-21T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<aside>
<p>
<h2>Books</h2>
Here are some of the books I mention in this article.
<ul id="goodstuff">
<li><a href="https://www.goodreads.com/book/show/19161852-the-fifth-season"><img src="/images/book_covers/the_fifth_season.jpg" /></a></li>
<li><a href="https://www.goodreads.com/book/show/42074525-the-city-we-became"><img src="/images/book_covers/the_city_we_became.jpg" /></a></li>
<li><a href="https://www.goodreads.com/book/show/40855636-how-long-til-black-future-month"><img src="/images/book_covers/how_long_til_black_future_month.jpg" /></a></li>
<li><a href="https://www.goodreads.com/book/show/60931.Kindred"><img src="/images/book_covers/kindred.jpg" /></a></li>
<li><a href="https://www.goodreads.com/book/show/36222611-aru-shah-and-the-end-of-time"><img src="/images/book_covers/aru_shah_and_the_end_of_time.jpg" /></a></li>
</ul>
</p>
</aside>
<section>
<div class='post'>
<p>
In 2020, I participated in the <a href="https://www.readingwomenpodcast.com/reading-women-challenge-2020">Reading Women Challenge</a>.
I read 32 books for the 24 prompts plus 2 bonus prompts. It was a great experience and I wanted to share
my journeys through some of those books.
</p>
<p>
First, I must thank <a href="https://twitter.com/snehaprabhu">@snehaprabhu</a> for starting the group and inviting me to join.
Second, I want to acknowledge all the members of the group who shared their passion for reading, book recommendations, reviews and encouragement. I couldn't have finished the challenge without you.
Third, let me clarify that when I say "read" books, I mean "listened to" books on Audible.
</p>
<p>Also, spoiler alert: While I will try to be careful, I may say things about these books that you may consider a spoiler. Sorry! With that, let's get started.</p>
<p>
The book that shook me the most was <a href="https://www.goodreads.com/book/show/19161852-the-fifth-season">The Fifth Season</a>
by <a href="https://twitter.com/nkjemisin">@nkjemisin</a>. I have read a lot of Sci-Fi but this was different. It was raw and relatable. It reflected on the problems of our society, not from a distance, not as an observer, but from being immersed in them. Yet, it remained a fantasy and took the reader on an epic journey through a world so different than ours!
</p>
<p>
Of course, then I had to finish the rest of the <a href="https://www.goodreads.com/series/112296-the-broken-earth">Broken Earth</a> trilogy and it was ground-breaking! After reading the trilogy, in my mind, <a href="https://twitter.com/nkjemisin">@nkjemisin</a> was the voice of an entire generation.
I needed to read more. So, I read her earlier work, the <a href="https://www.goodreads.com/series/46971-inheritance-trilogy">Inheritance trilogy</a> which was just as epic and mind-bending but incredibly real at the same time. This series gets into the world of gods and godlings. You could make a case that it draws a thread of inspiration from Hinduism, at least in terms of having a lot of gods around doing things, good and bad, caring and callous.
</p>
<p>
Then I read her later work <a href="https://www.goodreads.com/book/show/42074525-the-city-we-became">The City We Became</a>. As a former New Yorker, I *loved*. Who hasn't been that guy in Central Park? Who hasn't been in one of those cabs? Who hasn't seen those beautiful graffiti murals in Brooklyn and the Bronx?
</p>
<p>On deck for me is another book of hers: <a href="https://www.goodreads.com/book/show/40855636-how-long-til-black-future-month">How long 'til Black Future Month?</a>
</p>
<p>
I started following <a href="https://twitter.com/nkjemisin">@nkjemisin</a> on Twitter and saw that she mentioned <a href="https://www.goodreads.com/author/show/29535.Octavia_E_Butler">Octavia Butler</a> as her inspiration. I had not read Octavia Butler, and the Challenge had a prompt for "new to you author". Hmmm... so I dove in.
I ended up reading the <a href="https://www.goodreads.com/book/show/60931.Kindred">Kindred</a> and the <a href="https://www.goodreads.com/series/55489-patternmaster">Patternmaster</a> series.
</p>
<p>
The suffering, cruelty and helplessness she explores is moving by itself. The matter-of-fact way in which it is presented is shocking at first and then it helps you cope with the fact that it keeps going. The small triumphs of the characters bring unbridled job and the suspense is kept up, page after page.
</p>
<p>
On a lighter note, I also read <a href="https://www.goodreads.com/book/show/36222611-aru-shah-and-the-end-of-time">Aru Shah and the End of Time</a>. It is more "YA" than my usual fare, but I really liked it! It is a journey of an unsuspecting hero with mysteries to unravel and worlds to travel. So, of course, I had to finish reading the rest of the <a href="https://www.goodreads.com/series/204910-pandava">Pandava</a> series. Book 4 came out this year (2021) and it is on my list.
</p>
<p>
(to be continued... I will keep adding more books as I find the time)
</p>
</div>
</section>
http://prasannapendse.com/2021/04/29/data-strategies-to-drive-value-at-scaleData Strategies to Drive Value at Scale2021-04-29T00:00:00+00:002021-04-29T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<aside>
<a href="https://www.thoughtworks.com/perspectives/edition15-data-strategies-article"><img src="/images/perspectives.png"/></a>
</aside>
<div class='post'>
<p>
We have heard about how valuable data is supposed to be for years.
We have invested a lot. Sure, we have seen PoCs show promise, but are really getting the returns to justify
calling data "the new oil"?
</p>
<p>
My colleagues Zhamak Dehghani, Emily Gorcenski and I explore why this is the case
and what can businesses do about it.
</p>
<p>
<a href="https://www.thoughtworks.com/perspectives/edition15-data-strategies-article">Read article on PERSPECTIVES >></a>
</p>
</div>
http://prasannapendse.com/2013/08/28/still-not-free150 years later, the [African American] is still not free2013-08-28T00:00:00+00:002013-08-28T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/http://prasannapendse.com/2013/05/15/top-ten-version-control-features-of-tfsTop 10 Version Control Features of TFS2013-05-15T00:00:00+00:002013-05-15T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>
<img src="http://prasannapendse.com/images/top10heart_sm.png" style="float:right;" alt="Top 10!"/>
Everyone who uses TFS as a Version Control System has their reasons. Usually, it is about the features and everyone has their favorites. Here are my top 10 favorite TFS VCS features:
<ol class="top-ten" reversed>
<li>Over-write each others files... no merge required!</li>
<li>Others give you atomic commits, we give you sub-atomic commits!</li>
<li>Safe delete: When you delete a file, we don't really delete it!</li>
<li>Promotes deliberate practice! Lost your changes, now do them again!</li>
<li>Work-life balance! No VPN? No taking work home! Happy Family!</li>
<li>Boosts employment! 10 people for the job of none!</li>
<li>Non-trivial upgrades! Feels like you're getting your money's worth!</li>
<li>Improves debugging skills! Find which files I've scrambled for you!</li>
<li>Its easy... just click here, here, ok, wait, cancel, then select this, then click here, here, cancel, then ok, then</li>
<li>Its FREE!!! Just buy these MSDN licenses...</li>
</ol>
</p>
<p>Got your own favorites? <a href="https://twitter.com/home?status=%23tfsluv" target="_blank"><img alt="Tweet 'em here" src="http://prasannapendse.com/images/tweet-tfsluv.png" style="vertical-align:bottom"></a>! Enjoy <a href="https://twitter.com/search?q=%23tfsluv" target="_blank">#tfsluv</a>!
</div>
http://prasannapendse.com/2013/01/26/getting-started-with-dotnetGetting started with .NET2013-01-26T00:00:00+00:002013-01-26T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<section>
<p></p>
<header><h3>Motivation</h3></header>
<p>
I was joining a .NET project. As a developer who has worked mostly on Unix systems for the last 17 years, this was, shall we say, a learning opportunity. I was looking for a one-stop-shop which captures what I should read and do. However, I didn't really find one. So with the help of my ThoughtWorks colleagues, I made one. Think of this as a long list of things to google for when you need something. Hopefully someone will find this list useful some day! I'll keep updating this as and when I find something. Please feel free to point me to something I should include here.
</p>
<header><h3>Setting Up</h3></header>
<p>
What kind of a machine do I need to be an effective dev workstation? Are there things I need to know about ... eg: I/O is slower on Windows than Linux
<ul>
<li>CPU: at least a dual-core 2.4GHz</li>
<li>RAM: min 4GB, but I recommend 8GB if you want to run everything on your local environment</li>
<li>Disk: SSD helps</li>
</ul>
</p>
<header><h3>Mindset</h3></header>
<p>
Having been brain-washed by the open-source mafia, how do I get into a Microsoft mind-set? What do I need to forget (like Richard Stallman or ideas like one tool for one job)?
<ul>
<li>"Code First Approach" in relation to Entity framework</li>
<li>"A lot of patience" -TM</li>
</ul>
</p>
<header><h3>Resources for Beginners</h3></header>
<p>
<ul>
<li>Books</li>
<ul>
<li><a href="http://www.amazon.com/CLR-via-C-Jeffrey-Richter/dp/0735627045">CLR via C#</a></li>
<li><a href="http://www.amazon.com/2010-NET-Platform-Andrew-Troelsen/dp/1430225491">C# and the .NET Platform</a></li>
<li><a href="http://www.amazon.com/3-0-Beginners-Guide-Herbert-Schildt/dp/0071588302">C# 3.0 A Beginners Guide</a> (for people new to programming, or static languages)</li>
<li><a href="http://www.amazon.com/Dependency-Injection-NET-Mark-Seemann/dp/1935182501">Dependency Injection in .NET</a></li>
<li><a href="http://www.amazon.com/Windows-PowerShell-Cookbook-Scripting-Microsofts/dp/0596801505">Windows PowerShell Cookbook</a></li>
</ul>
<li>Blogs</li>
<ul>
<li><a href="http://www.hanselman.com/blog/">Scott Hanselman</a></li>
</ul>
<li>Articles</li>
<li>Resources</li>
<ul>
<li>MSDN</li>
</ul>
<li>Tools</li>
<ul>
<li>Unit Testing</li>
<ul>
<li>NUnit</li>
<li>XUnit</li>
<li>MSpec</li>
<li>NCrunch and Continuous Tests/MightyMoose are both pretty cool, although they are pretty memory intensive (they're autotest/guard like tools for .Net).</li>
</ul>
<li>Mocking</li>
<ul>
<li>Moq</li>
</ul>
<li>Logging</li>
<ul>
<li>NLog</li>
<li>log4net is still used heavily in logging, though whether you would actively pick it for a new project, I don't know. You will encounter it though.</li>
</ul>
<li>Build</li>
<ul>
<li>Powershell + PSake is probably the most popular</li>
<li>NAnt (old / deprecated)</li>
<li>MSBuild is around, but needs full install of VS on build server if you use some features</li>
</ul>
<li>Infrastructure Automation</li>
<ul>
<li>PowerShell</li>
<li>CFEngine</li>
<li>PSake</li>
<li>YDeliver</li>
<li>Chef (works well with PowerShell)</li>
</ul>
<li>Packaging</li>
<ul>
<li>Nuget</li>
<li>OpenWrap</li>
</ul>
<li>CI/CD</li>
<ul>
<li>Go</li>
<li>CruiseControl.NET</li>
<li>TeamCity</li>
<li>Avoid TFS</li>
</ul>
<li>SCM</li>
<ul>
<li>Git, Mercurial</li>
<li>Github for Windows</li>
<li>Avoid TFS</li>
</ul>
<li>Profiler</li>
<ul>
<li>.NET Memory Profiler... ( .NET Memory Profiler - In-depth .NET Memory Profiling)</li>
<li>JetBrains dotTrace (CPU profiler)</li>
<li>Redgate Ants memory profiler</li>
</ul>
<li>Code Metrics</li>
<ul>
<li>opencover</li>
<li>dotCover by JetBrains</li>
<li>Visual Studio has some built-in stuff</li>
</ul>
<li>Monitoring</li>
<ul>
<li>New Relic</li>
</ul>
<li>IoC</li>
<ul>
<li>Windsor</li>
<li>Castle</li>
<li>Unity</li>
<li>NInject</li>
<li>StructureMap</li>
<li>For all of these be sure to not use them in public-static ServiceLocator configuration. That is't Inversion of Control, it's Inversion of Inversion of Control (Blog Entries)</li>
</ul>
<li>Refactoring</li>
<ul>
<li>Resharper</li>
<li>Just Code and a few others aren't as good as resharper</li>
</ul>
<li>ORM</li>
<ul>
<li>NHibernate</li>
<li>Entity framework</li>
<li><a href="https://github.com/robconery/massive">Massive</a></li>
<li><a href="https://github.com/markrendle/Simple.Data">Simple.Data</a></li>
<li>Dapper</li>
<li>Fluent NHibernate</li>
<li>Linq</li>
<li>Be aware that .Net standard operating procedure is to used Stored Procedures. This means that many solutions in the server code are intended to be stateless, and anemic in terms of business logic. To try to push to a more layered solution that you're more used to in Java/Ruby/Python land. This may be unpopular in the team.</li>
</ul>
<li>DB</li>
<ul>
<li>MS SQL Server</li>
<li>Raven DB</li>
</ul>
<li>DB Migrations</li>
<ul>
<li>dbdeploy.net</li>
<li>redgate</li>
<li>MigratorDotNet</li>
<li>Mig#</li>
<li>Tarantino</li>
</ul>
<li>BDD</li>
<ul>
<li>specflow</li>
</ul>
<li>IDE</li>
<ul>
<li>Visual Studio</li>
</ul>
<li>Server-side Frameworks</li>
<ul>
<li>WCF</li>
<li>WebForms</li>
<li>WSF</li>
<li>ASP.NET MVC 3 or 4 (.Net devs will just know this as "MVC" sadly, and ignore the 1970's design pattern of the same name).</li>
<li>Razor</li>
<li>Nancy (like Sinatra for .NET)</li>
<li>WebAPI to expose RESTful API</li>
<li>restsharp, if you need to consume any REST api's</li>
</ul>
<li>Client-side Frameworks</li>
<ul>
<li>Knockout JS (avoid KnockoutMVC.com)</li>
</ul>
</ul>
</ul>
</p>
</section>
http://prasannapendse.com/2012/11/04/a-tribute-to-malcolm-marshallA tribute to Malcolm Marshall2012-11-04T00:00:00+00:002012-11-04T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/http://prasannapendse.com/2012/09/23/vivekananda-in-chicagoVivekananda in Chicago2012-09-23T00:00:00+00:002012-09-23T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/http://prasannapendse.com/2012/09/23/story-of-stuffStory of Stuff2012-09-23T00:00:00+00:002012-09-23T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/http://prasannapendse.com/2012/06/25/magical-maasai-maraMagical Maasai Mara2012-06-25T00:00:00+00:002012-06-25T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<img src="http://prasannapendse.com/images/photos/2012/maasai_mara/thumbs/maasai_mara_33.png"/>
<img src="http://prasannapendse.com/images/photos/2012/maasai_mara/thumbs/maasai_mara_03.png"/>
<img src="http://prasannapendse.com/images/photos/2012/maasai_mara/thumbs/maasai_mara_04.png"/>
http://prasannapendse.com/2011/11/09/an-interesting-findAn interesting find2011-11-09T00:00:00+00:002011-11-09T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>We needed to expose a resource such that its url looked like:<br /></p><p>http://www.example.com/widgets/<url-encoded-identifier><br /></p><p>In some cases, we found that the request never made it to the controller. The reason for that was when the identifier contained %2F (url encoded '/') followed by other characters, it appeared as if either apache or passenger url-unencoded it before trying to figure out who send the request to. And it couldn't find anything, so it returned a 404.<br /></p><p>If we start the server using rackup instead of via Apache Passenger, the request would be routed correctly.<br /></p><p>Now, if the identifier contained a space (urlencoded as +), then we saw another problem. We know Rails tries to help by unescaping parameters. When the param comes from a URL path, Rails uses URI::unescape. This leaves the + in! The parameter received by the controller is incorrect. If it was only the +, it would be one thing. It turns out that URI::unescape is depracated in Ruby 1.9.2 and it doesn't work for a few other characters as well. So gsub wasn't an option.<br /></p><p>In Ruby 1.9.2, URI::unescape is replaced by CGI::unescape. And it behaves correctly. However, in Ruby 1.8.7, CGI::unescape is not considered stable. So, Rails had to decide which Ruby it will support better. It seems they have taken a half-way approach. Rails uses URI::unescape when unescaping params from the URL path, but it seems to use CGI::unescape when the param comes from the query string!<br /></p><p>Given the two issues, we had to change our URL structure to something like:<br /></p><p>http://www.example.com/widgets/<hex-identifier>?id=<url-encoded-identifier><br /></p><p>Grrr...<br /></p><p>Does anyone have a better solution?<br /></p></div>
http://prasannapendse.com/2011/08/27/annaAnna2011-08-27T00:00:00+00:002011-08-27T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>
Anna Hazare's revolution has taken India by storm. While his movement has widespread support, there are good intentioned people who oppose parts of the Jan Lokpal Bill. As this issue continues to captivate India, as well as Indians abroad, focused India on her biggest challenge - corruption.
</p>
<p>
Resources:
<ul>
<li><a href="http://www.tehelka.com/story_main50.asp?filename=Ws25062011info.asp">Issues at the heart of the Lokpal Bill debate</a></li>
</ul>
</p>
<p>
RTI Activists Killed:
<ul>
<li><a href="http://ibnlive.in.com/news/another-rti-activist-killed-in-maharashtra/116770-3.html">Datta Patil</a>, May 22, 2010</li>
<li><a href="http://www.ndtv.com/article/india/rti-activist-killed-for-campaign-against-bjp-mp-says-family-38770">Amit Jethwa</a>, Jul 21, 2010</li>
<li><a href="http://articles.timesofindia.indiatimes.com/2011-02-14/gurgaon/28542601_1_pension-fraud-village-head-rti">Mahabir Singh</a>, Feb 14, 2011</li>
<li><a href="http://www.indianexpress.com/news/anna-supporter-and-rti-activist-shehla-masood-shot-dead-in-bhopal/832621/">Shehla Masood</a>, Aug 16, 2011</li>
</ul>
</div>
http://prasannapendse.com/2011/07/16/what-is-object-oriented-programmingWhat is Object Oriented Programming?2011-07-16T00:00:00+00:002011-07-16T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>
I find that a lot of people with a lot of experience in "Object Oriented Programming" really struggle to understand what it actually is. I wanted to find an easy way for people to learn Object Oriented Programming.
</p><p>
Here it is: <a href="http://www.purl.org/stefan_ram/pub/doc_kay_oop_en">Dr. Alan Kay on the Meaning of “Object-Oriented Programming”</a>
</p><p>
As you reflect upon what you currently consider "OOP", remember an all-too-common anti-pattern: <a href="http://martinfowler.com/bliki/AnemicDomainModel.html">The Anemic Domain Model</a>.
</p><p>
That's it! Its that easy! Now try to put it into practice and see if <a href="http://www.extremeprogramming.org/rules/testfirst.html">TDD</a> helps you in that quest.
</p><p>
To see how you are doing, here's an easy way to determine whether or not you have taken the first step towards OOP:
<ul><li>Does a single class have setX() and getX() methods?</li><li>If so, then you fail. Its not OOP.</li><li>Please try again.</li></ul>
</p>
</div>
<h2>Comments</h2>
<div class='comments'>
<div class='comment'>
<div class='author'>Saager Mhatre</div>
<div class='content'>
Hear, hear!</div>
</div>
</div>
http://prasannapendse.com/2010/08/08/ruby-and-snow-leopard-upgradeRuby and Snow Leopard upgrade2010-08-08T00:00:00+00:002010-08-08T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>
I finally decided to plonk down $29 and install Mac OS X Snow Leopard. When I tried running Cucumber, I got an error about the Gherkin lexer... "gherkin_lexer_en.bundle: mach-o, but wrong architecture". It turns out this was caused by the upgrade to Snow Leopard.
</p>
<p>
I had to upgrade mac ports, delete all my old gems and reinstall them. I presume vendorized gems will need to add a new 64-bit version.</p>
<p>
Here are some links I found useful in this quest:
<ul><li><a href="http://weblog.rubyonrails.org/2009/8/30/upgrading-to-snow-leopard">Upgrading to Snow Leopard</a></li><li><a href="http://mettadore.com/ruby/ruby-gems-and-snow-leopard/">Ruby gems and Snow Leopard</a></li><li><a href="http://norbauer.com/notebooks/code/notes/snow-leopard-upgrading-for-rails-developers">Snow Leopard Upgrading for Rails Developers</a></li><li><a href="http://trac.macports.org/wiki/Migration">Mac Ports Migration</a></li></ul>
Hope that helps!
</p>
</div>
<h2>Comments</h2>
<div class='comments'>
<div class='comment'>
<div class='author'>Prasanna Pendse</div>
<div class='content'>
Oh yeah, forgot about rvm. Good call!<br /><br />-Prasanna</div>
</div>
<div class='comment'>
<div class='author'>Sudhindra Rao</div>
<div class='content'>
Maybe you should try rvm.<br />beginrescueend.com.<br /><br />You won't need to install native gems anymore<br /><br />-Sudhindra</div>
</div>
</div>
http://prasannapendse.com/2009/12/16/new-relic-is-awesomeNew Relic is awesome!2009-12-16T00:00:00+00:002009-12-16T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>We setup <a href="http://www.newrelic.com/">New Relic</a> in production yesterday. Its awesome! If you're running a rails project of any size, I would say its an indispensable tool.<br /></p><p>Here's a brief review:<br /></p><p>What it has meant to us:<br /><ul><li>Helped us fix 2 new performance problems in 2 hours.</li><li>Helped us identify an intermittent performance problems that we hadn't been able to figure out for the last 3 months (that was mainly because we weren't allowed to increase log level or access apache logs, because of IT bureaucracy. NewRelic allowed us to side-step all of them).</li></ul></p><p>Pros:<br /><ul><li>Easy to setup. All it took was to vendorize a gem and add a yml file.</li><li>The ability to see what action is taking the longest and what partial rendering is taking the longest and what sql is taking the longest is awesome.</li><li>Made for rails</li><li>Pretty graphs. Keeps managers busy for hours. ;-)</li><li>Doesn't seem to make any material impact on the performance of the app.</li></ul></p><p>Cons:<br /><ul><li><strike>No visibility into Java code (we run on JRuby in JBoss and have to access some Java code - which is usually the problem). I wonder if there's a way to instrument it so certain calls are visible to New Relic.</strike> UPDATE: Yeah, there is a way to see what the Java stuff is doing. It works as advertised, but not as automagically as the Rails logging. Also, we weren't able to get it to log to the same "application". Had to give it a new name.</li><li>Rails only as far as I can tell. It won't work for your Java or .NET project. Sorry!</li><li>Have noticed a couple of stack traces with "new_relic" in them. Need to investigate why.</li><li>newrelic.com was down for a few minutes today. That meant we couldn't stare at the pretty graphs for that time period. Will have to see if uptime is good enough for what we're doing over the next month or so</li></ul></p></div>
<h2>Comments</h2>
<div class='comments'>
<div class='comment'>
<div class='author'>William Louth</div>
<div class='content'>
For JRuby or Java production support you would be better going with JXInsight which is thousands of times much more efficient than new relics Ruby/Java offerings. <br /><br />NewRelic's overhead is in milliseconds (2 digits) whereas JXInsight is 1-10 nanoseconds for a non-hotspot method and less than 300 nanoseconds for a metered method.<br /><br />http://williamlouth.wordpress.com/2009/08/05/the-fastest-ruby-profiler-is-a-java-profiler/<br /><br />http://williamlouth.wordpress.com/2009/07/27/one-billion-operations-per-second/</div>
</div>
<div class='comment'>
<div class='author'>Prasanna Pendse</div>
<div class='content'>
Ooops! RTFM! :-) Updated the blog post to reflect that the Java instrumentation works in a JRuby on Rails app.</div>
</div>
<div class='comment'>
<div class='author'>Mike Malloy</div>
<div class='content'>
Actually Prasanna, New Relic does support Java. There is a Java agent which can be used for Java apps. You only need one account, but you can see either Ruby-based or Java-based apps in the same account. Check it out at http://www.newrelic.com.</div>
</div>
<div class='comment'>
<div class='author'>Lew Cirne</div>
<div class='content'>
Hi Prasanna,<br /><br />Thanks very much for your kind words about New Relic! I'm delighted to hear that our product has been helpful for you.<br /><br />Fortunately, I have more good news: in fact, RPM does support Java web applications, running in any of the major web containers. Identical product on the server side, just a different (pure java) agent. Give that a spin and tell us what you think!</div>
</div>
<div class='comment'>
<div class='author'>Bhavin Javia</div>
<div class='content'>
NewRelic has a solution for Java Apps <a href="http://www.newrelic.com/RPMlite-java.html" rel="nofollow"> RPMlite-java </a><br /><br />I had used NewRelic extensively to debug performance issues on my previous Rails project. In fact, we recommended NewRelic to our client on day one and got it into production on day two. That move is paying off handsomely ever since.</div>
</div>
<div class='comment'>
<div class='author'>Bhavin Javia</div>
<div class='content'>
NewRelic has a solution for Java Apps "RPMlite-java":http://www.newrelic.com/RPMlite-java.html<br /><br />I had used NewRelic extensively to debug performance issues on my previous Rails project. In fact, we recommended NewRelic to our client on day one and got it into production on day two. That move is paying off handsomely ever since.</div>
</div>
<div class='comment'>
<div class='author'>Saager Mhatre</div>
<div class='content'>
You could also try running the whole thing on GlassFish v3. It has some kickass monitoring and reporting.</div>
</div>
</div>
http://prasannapendse.com/2009/12/13/on-mavenOn Maven2009-12-13T00:00:00+00:002009-12-13T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>
Maven sucks. It's evil. It makes me want to scream! Why? Three big reasons: it hides problems, it promotes the dysfunctional organization of your team and it stains to your code like blood on cotton.
</p>
<p>
I know, I know, I shouldn't be quick to judge. Any tool can be misused. Maybe if people learned to use the tool better.
</p>
<p>
Uh, no!</p>
<p>
After spending several months working extensively on fixing (or introducing) continuous integration across industries, team sizes, geographies and levels of complexity, I have no doubt in my mind that Maven is the problem. And I swear I went into each engagement with an open mind - even towards Maven.
</p>
<p>
The first thing that hit me is that it hides all kinds of problems. I get a jar from someone else's code. Great! I keep working, everything is great. Now I want him to add a new feature. I need to upgrade to the latest version! Oh no! The two code bases have deviated too much! Lets make a rule. We need things to be backwards compatible. Lets not change API. Lets only add new methods. Oh, and maybe if I depend on a SNAPSHOT of the other person's code. But now, he can't change his code willy-nilly. We need a change manager to coordinate changes between teams.
</p>
<p>
Then the next problem hits. Hey, why are you touching that code? Its my team's code. If you want it to do that, you need to come through the change manager. Lets meet and discuss why you need to upgrade your JDK.
</p>
<p>
Then a consultant comes along and says "WTF?" - you can do all this by not having artificial divisions in teams and code bases. Lets collectively own the code. If different things need to behave differently at different times, then lets refactor the code to meet these needs. But, uh, fixing it within Maven's world is cheaper and takes less time than combining all the code. Oh, and refactor - that sounds risky! Lets just keep going with what works for now even if we're a little less efficient.
</p>
<p>
Little does anyone see that their development velocity is excruciatingly low and the incremental investment in maven over time is a lot larger than following a simpler path. And they are completely missing what they really need to be doing: communicating more, gelling as a team, and getting into a flow.
</p>
<p>
AAARRGGGHHHH!!!!</p>
</div>
<h2>Comments</h2>
<div class='comments'>
<div class='comment'>
<div class='author'>Todd</div>
<div class='content'>
Nothing of what you said has anything to do with Maven.<br /><br />ok, i'm over-generalizing, but i think you are very much off base, as detailed by other commenters.<br /><br />Maven is a tool to force you into an established project and deployment structure. Some teams don't do well with structure, and their product usually shows.</div>
</div>
<div class='comment'>
<div class='author'>Matthew</div>
<div class='content'>
Apart from Maven itself, many of the comments in this post are:<br /><br />1) Problems that I find are pervasive with transitive dependencies via ANY tool that implements them (even ones like macports for simple things like... curl, wget and pandoc)<br /><br />2) Problems that are masked with Ant because transitive dependencies are highly static by the fact they are bundled with source code in the SCC project/repo. We actually pull in 3Ps less frequently, for good or for bad, when we use Ant. This is because the update dance is more of a pain with Ant than with a simple Maven tag change + download over the network. Using Ant (without Ivy), I have to find that project's homepage, then their custom download page, view the sourceforge banner ad, then finally get my updated binary. Save it into my downloads folder, then copy it and possibly rename it when putting it into my lib/ dir.<br /><br />Thinking about the concepts of how to fix some of your issues you list, here are some ideas:<br /><br />1) "Freezable" builds that essentially keep the Convention Over Configuration, but turn it into a static artifact once you want to cut a release. Not something that reaches across the network except during dev cycles.<br /><br />2) Higher quality transitive dependencies with a better battery of unit tests so that teams don't rev as often.<br /><br />3) Treat enabling-3Ps, like log4j, as 3Ps, but internal libraries inside a given project as part of that project's code base -- not as some thing to lock down hard so that everyone can magically reuse it for all eternity.<br /><br />4) Great APIs are stable, but are also hard to come by. We have to figure out the right place for API boundaries. Not everything need to "implements IPervasiveInterface". We do a terrible job of that right now as an industry. Internals should get refactored. Fine. Interfaces should try to stay stable. I'm worried that isn't what I am hearing espoused about interfaces.<br /><br />I don't hear you describing the proper flow you want here in terms of code modules. I'm willing to listen, but for each "sucks" I need an abstract description of the right flow.</div>
</div>
<div class='comment'>
<div class='author'>Jan</div>
<div class='content'>
And those problems don't occure if you use another build tool?</div>
</div>
<div class='comment'>
<div class='author'>David Dossot</div>
<div class='content'>
IMO, the dysfunctions you talk about are to blamed on flakey software engineering practices not a particular build tool.<br /><br />Working with multiple teams producing multiple modules that must integrate together is complex, whatever build tool you decide to use.<br /><br />That's why we use CI, to constantly get feedback on the integration.<br /><br />An, yes, an API is a commitment. If you regularly break the API you establish, you regularly break this commitment. Backwards compatibility is fairness to the others, deprecation allows you to move forward, branches can isolate you for a little while but if API have been evolved carelessly, pain is down the road.<br /><br />A build tool has nothing to do with this.<br /><br />An yes, I have worked with Maven on multi-sites multi-teams multi-modules projects.</div>
</div>
</div>
http://prasannapendse.com/2008/04/05/what-is-educationWhat is education?2008-04-05T00:00:00+00:002008-04-05T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>
Since 1999, I have been volunteering with <a href="http://www.ashanet.org/">Asha for Education</a> - a non-profit focusing on education to wedge disenfranchised communities in India towards socio-economic development.<br /><br />I was listening to <a href="http://www.economist.com/">The Economist</a> (<a href="http://www.economist.com/audioedition/">audio edition</a>) and it brought up the topic of financial education. I had been mulling over this topic and related topics for years and all of a sudden I had an urge to write down my thoughts. So here it goes.<br /><h4>Political Context</h4>To the British, educating Indians was a way to filter the best minds and train them to do the Empire's bidding. Initiative had to be suppressed. Meta-thinking, culturally and locally relevant knowledge had to be discarded in favor of abstract non-contextual, specific subjects. That Gandhi, Tagore and Ramanujam came out of this system might be seen as a testament to the quality of education afforded to them. However, I see it as disservice to the masses whose determination and intellect didn't reach super-human levels.
</p>
<p>
Around the world, there are many examples of explicit and implicit subjugation of inquiry for the sake of dogma. Religious indoctrination, communist propaganda, unquestioning prostrations to capitalism and nationalistic fervor are examples of the same ill - closed mindedness. Since this is exactly what education is supposed to counter, one can see how the influence of political context on education defeats the purpose.</p><h4>Defining Education</h4><p>I divide education into two realms: navigating the world as it is today and open-mindedness. The first must be relevant in your context. The second allows you to adapt with your context, or more importantly change your context as your needs evolve.</p><b><i>Navigating the world as it is today</i></b><p>First, you need to be able to read, write and do arithmetic. The three-Rs. Its so obvious, right? Yet so many people, even in the west, get it oh so wrong. There are two common threads: 1) Minorities and immigrant groups are almost always behind. Eg: Lower castes in India, African-Americans in the US, Turks in Germany, new immigrants in Sweden. 2) Homogenous populations, especially of affluent communities do well.</p><p>That means one thing: people in power set the rules which the outsiders cannot easily navigate. So, even to do something as ‘simple’ as the 3Rs, context is king.</p><p>The solution is two fold: improved techniques and curriculum customized to context.</p><b><i>Improved techniques</i></b><p>A critical phase where teaching techniques need to be improved are in the first six years of a child’s life. Here’s a short list:</p><ul><li>providing a safe environment conducive to exploring,</li><li>proper nutrition and physical activity,</li><li>using pictures and sounds at a very early age,</li><li>teaching words before letters,</li><li>exposure to multiple languages and a diverse group of people.</li></ul><p>None of these are new concepts. See <a href="http://en.wikipedia.org/wiki/Jean_Piaget">Jean Piaget</a>. Yet, somehow, we manage to de-prioritize, sacrifice or otherwise ignore them.</p><i>Custom Curriculum</i><p>The criticism for customizing curriculum circles around differing standards. How can you measure progress across the varying curricula? How do you know if you are providing ‘equal’ education? I say lets worry about that at 10th grade. Until then, the path a child takes could be and should be relevant to the particular environment the child is in. A child in coastal regions should learn how to fish and a child in a desert should learn how to ride a camel. What is important is how well they do in their environment and that isn’t always comparable.</p><p>Specifically, these would make a huge difference:</p><ul><li>Building friendships with people who are different than you and are in your general neighborhood</li><li>Learn local crafts and skills - from where to sail to catch fish to when to sow what to how to make a pot.</li><li>Local language, stories and math in local context</li></ul><p>There are additional aspects that are either ignored today or not universally available. Here’s another list:</p><ul><li>Financial education</li><li>Entrepreneurship</li><li>Self-governance</li><li>Sex education</li><li>Health and sanitation</li></ul><b><i>Open Inquiry</i></b><p>When it comes to contextual learning, <a href="http://en.wikipedia.org/wiki/Lev_Vygotsky">Vygotsky’s work</a> is very pertinent. Given that context plays a huge role in the development of any individual, it is entirely possible to create a compliant society. However, the next challenge lies in rising above it. How do you create a self-correcting, sustainable and peaceful society? That’s where open inquiry comes in.</p><p>To get there, three things need to be nurtured:</p><ul><li>Discovery oriented education</li><li>Initiative</li><li>Meta-cognition</li></ul><p>I remember how I learned as a child. I learned a lot of things by watching others and imitating - cricket, for instance. But I also learned things by discovering them. I discovered sewage treatment plants in the forest. I discovered Mercury (its found in thermometers). I discovered electricity (its found in batteries). I even discovered non-conformism before I ever heard of Thoreau. While following others and doing as you are told are important, the next level of learning takes place through discovery.</p><p>When a child discovers something, it increases self-confidence, it increases curiosity and it increases initiative. I believe discovery oriented education, be it in science, social studies, language or geography, is critical in a child’s intellectual development.</p><p>As self-esteem, joy of learning and initiative are established, it is also important to step outside the Vygotskian trap - that of social context. It is critical that kids are introduced to those on the other side of the tracks. Further, making friendships across caste, ethnic or class boundaries allows one to question one’s own perspectives and biases. It leads to open inquiry and a meta-level understanding of one’s society and self.<br /></p><h4>But why?</h4><p>I don’t buy into too many absolutes. The end-goal isn’t the ideal state defined by any particular ideology. To me, the end-goal is two-fold: graceful adaptability in an ever-changing world and continuous drive to make the world a little better. </p><p>This includes how we react to daily hurdles as well as to tragedies. Lets take tragedies first. There are several things that are tragic. The ones that get me riled up the most though are when people with the capacity to change a tragic situation don’t - either because they don’t want to go against the grain, or because they don’t see the tragedy or even worse they think somebody else should do it. Whether it be Darfur or the Tsunami or Hurricane Katrina. As a people, we can react sooner and more effectively if we (myself included) had a greater empathy, initiative and sense of responsibility. This can be developed as outlined above.</p><p>Day-to-day hurdles, on one hand, are a practice-field for how we react to the big ones. On the other hand, they are much more relevant and have a greater impact on each individual. How do we react to finding ourselves in debt or in a <a href="http://en.wikipedia.org/wiki/Racial_segregation_in_the_United_States">racially segregated city</a> (like Chicago) or in a jealous rage or in the middle of an armed conflict or around a corrupt bureaucracy?</p><p>I believe the answer lies in education as defined above.<br />
</p>
</div>
http://prasannapendse.com/2008/04/04/murderMurder!2008-04-04T00:00:00+00:002008-04-04T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<aside>
<p>
<h2>Books</h2>
Here are the books I mention in this post.
<ul id="goodstuff">
<li><a href="https://www.goodreads.com/book/show/84785.The_Overlook"><img src="/images/book_covers/the_overlook.jpg" /></a></li>
<li><a href="https://www.goodreads.com/book/show/93947.Simple_Genius"><img src="/images/book_covers/simple_genius.jpg" /></a></li>
</ul>
</p>
</aside>
<div class='post'>
<p>
(Spoiler alert: Overlook by Michael Connelly and Simple Genius by David Baldacci)
</p>
<p>
Recently, I read Overlook by Michael Connelly. A few chapters in it was pretty easy to guess who the murderer was. The story kind of dragged into terrorism and that word 'Allah'. It was a cheap attempt at exploiting both America's national fear and leaps in logic based on stereotypes. Pretty early on it was obvious that the wife - Alicia - was one of the murderers. The whole terrorism thing was just a distraction. (The victim was screaming his wife's name when he was shot - hence the sound of "Allah" immediately followed by a gun shot). Well written, good twist at the end, but not a great story, IMO.
</p>
<p>
Soon after, I read Simple Genius by David Baldacci. I liked this book a lot better. The story was good and the surprises were actually unexpected and yet realistic in the context of the story. When it was discovered that one of the murder victims had a love interest in a woman named Alicia, I immediately thought of the Alicia in the Overlook and wondered if this Alicia was a murderer too.</p>
<p>
Sure enough, she was! How weird is that? Two consecutive novels with a murderer named Alicia!</p>
</div>
http://prasannapendse.com/2008/03/22/ctrl-r-in-bashCtrl-R in bash2008-03-22T00:00:00+00:002008-03-22T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>
I started using bash in 1996 when I installed Slackware 3.1 on a Packard Bell 486 SX2 50 MHz machine. Eleven and a half years later, I learn about Ctrl-R to reverse search commands in bash. Granted, I'd been using ksh with vi bindings for six or seven intervening years. But I should have known!<br /><br />Then, I come to find out bash supports all the emacs bindings. Not only that, so does TextMate. <a href="http://www.gnufoo.org/macosx/">As does Cocoa</a>.<br /><br />That is cool! Now I'm gonna have to learn all the <a href="http://www.cs.colostate.edu/helpdocs/emacs-bindings">emacs bindings</a>.
</p>
</div>
http://prasannapendse.com/2007/09/12/branching-for-code-reuseBranching for code-reuse2007-09-12T00:00:00+00:002007-09-12T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>
You wrote some code. Your app works. Now you want to do something slightly different. Timelines are tight. You want to give the new team enough control to get their job done. Yet you want to leverage what you've already done.
</p>
<p>
"Lets create a branch of the same code for the new team", you say, "Once they are through their time crunch, lets integrate the two branches."
</p>
<p>
Sounds simple. But there are three main problems with that:<br /><ol type="i"><br /><li>The time crunch never really ends. There is no time to take a break and merge.</li><br /><li>If you do find the time, you also find that the code has diverged to the point where merging becomes more expensive than maintaining multiple branches.</li><br /><li>Features are added, time goes on and re-use becomes next to impossible.</li><br /></ol><br />You started out thinking that re-use through branching is going to have a multiplier effect to the functionality you deliver. Initially, it is. But soon, it becomes a multiplier on how much you invest into getting simple stuff done.
</p>
<p>
So, what's the right way to do it? How do we avoid this? How do you get out of it? Well, there has been a lot written on code re-use. And I really don't feel like getting into that right now. It maybe a topic for another day. Today, I just wanted to say that if you're looking to branch your source code for re-use, then don't! If you really want to, then don't expect everything to be merged back. If you really really want to merge it back, then its going to cost you!
</p>
</div>
<h2>Comments</h2>
<div class='comments'>
<div class='comment'>
<div class='author'>Vinay Belgaumkar</div>
<div class='content'>
Well, well...good to see your blog ! You need to keep writing often, though. My thoughts on branching - it really depends. If one needs multiple releases of their software to co-exist, its a good idea to branch. Else, it is'nt. The cost involved in merging, re-testing and fixing issues is the price one pays for maintaining multiple versions. A good idea would be to phase out each release and lock branches once they reach certain feature quality standards. Ofcourse, regular merges from the mainline will alleviate the burden of re-testing and re-evaluation.</div>
</div>
</div>
http://prasannapendse.com/2007/07/04/a-girl-named-suhasiniA girl named Suhasini2007-07-04T00:00:00+00:002007-07-04T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>
Her father left their village in northern Karnataka to find work in Bangalore.
He never returned. Three children and the social stigma of being a single mother
were more than Suhasini's mother could handle. That is when Suhasini was sold
for the first time.
</p>
<p>
It was only four years later when she went to school again. But for Suhasini,
a lifetime had passed before she landed at the orphanage. Reading and writing
would get easier once she learned to trust grown-ups again. She missed her
mother. Or at least what she remembered of her.
</p>
<p>
Suhasini was one of the lucky few. She was rescued. Millions of children have
been pushed into a life much more horrifying than hers. Having been involved
with Asha for Education since 1999, I have met dozens and seen hundreds of
children whose life has been altered for the better by organizations fighting
child labor and trafficking. Their eyes twinkle with hope and their beaming
smiles remind us that while we need to find a strategic solution to this
despicable injustice, the tactical solution of taking care of these kids makes
the world of difference to them.
</p>
<p>
This year, Asha for Education is bringing focus to these issues through our
annual online fundraiser, "Work an Hour". Please visit
<a href="http://www.ashanet.org/workanhour">http://www.ashanet.org/workanhour</a>
to engage and to contribute.
</p>
<p>
PS: Details of this story have been modified to protect the privacy of the kids involved.
</p>
</div>
http://prasannapendse.com/2007/06/16/i-m-starting-a-blogI'm starting a blog!2007-06-16T00:00:00+00:002007-06-16T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>
Woohoo! I’m excited! But what am I going to blog about? My intention is to write about two topics, primarily: socio-economic development (especially in India) and the art of software. But I’m sure other topics will creep up. We’ll see how it goes!
</p>
</div>
http://prasannapendse.com/2007/06/16/i-m-starting-a-blogI'm starting a blog!2007-06-16T00:00:00+00:002007-06-16T00:00:00+00:00Prasanna Pendsehttp://prasannapendse.com/
<div class='post'>
<p>
Woohoo! I’m excited! But what am I going to blog about? My intention is to write about two topics, primarily: socio-economic development (especially in India) and the art of software. But I’m sure other topics will creep up. We’ll see how it goes!
</p>
</div>