<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>All Your Base Are Belong To Us : RandomThoughts</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx</link><description>Tags: RandomThoughts</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Using Something You Can't Implement Yourself</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2013/01/30/using-something-you-can-t-implement-yourself.aspx</link><pubDate>Wed, 30 Jan 2013 10:01:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1713728</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=1713728</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2013/01/30/using-something-you-can-t-implement-yourself.aspx#comments</comments><description>I have found that the biggest obstacle I face when adopting a new language, technology, or framework is using something I don&amp;#39;t fully understand how to implement myself. I read hundreds of blog posts every week talking about language extensions to JavaScript, cool new iOS application frameworks, and brand-new SaaS offerings on top of Windows Azure -- just as a small sample. Obviously, just using some piece of technology or adapting a sample to my needs is usually not that hard. The thing is, I can&amp;#39;t bring myself to adding code to my arsenal if I don&amp;#39;t understand how it works and how it has been implemented. It&amp;#39;s somewhat akin to the Not Invented Here syndrome, except I don&amp;#39;t actually write all my own frameworks; I just want to &lt;i&gt;be able&lt;/i&gt; to write them. Here are a few recent examples.
&lt;p&gt;
In late 2011 I started getting my feet wet with Node.js, and in 2012 implemented several personal and commercial projects on top of Node, Express, and many other Node modules. I was very reluctant to start working with Node until I grasped the fundamental concepts -- the event loop and the asynchronous nature of everything -- which gave me the foundation to implement &amp;quot;something like Node&amp;quot; should I want to. There was even a time when I was considering to implement a Node-like HTTP framework with the new C# support for async/await, but gave up because there are many like it, ASP.NET MVC async controllers notwithstanding.
&lt;p&gt;
Next, I always was -- and to some extent, still am -- quite &amp;quot;afraid&amp;quot; of WPF. I can&amp;#39;t say that I love client development in general, but nearly everything feels, on a purely psychological level, like a more appealing target for me than XAML-based frameworks. It&amp;#39;s not that WPF is very hard for me to use: I understand the fundamental concepts such as data binding, styles, resources, and data templates, enough to implement simple desktop applications or sample Windows 8 and Windows Phone apps. It&amp;#39;s the depth and breadth of WPF that always keeps me wondering: Is there a better way to do what I just did? How is this XAML expression working under the hood with this data context and that dependency property? Should I have moved this entire chunk of code into a behavior or a separate control?... I can&amp;#39;t say I haven&amp;#39;t tried: I read at least three books on WPF, with a total of more than 1500 pages, and they had had zero effect on my state of mind. The result, at least for me, is that on a subconscious level I steer clear of XAML-based frameworks, because I am not sure how to implement my own. The funny thing is that I&amp;#39;m fairly comfortable with several &amp;quot;thick&amp;quot; client technologies, including MFC, Windows Forms, Android, and iOS -- but it&amp;#39;s as though XAML, with all its objective advantages, had developed a conditional gag reflex in my mind.
&lt;p&gt;
Moving on to something I am very comfortable with, I always felt at home with Reflection-based approaches to virtually anything, from serialization through validation all the way to code generation. Attributes and Reflection have somehow grown very strong roots in my mind ten years ago, when I was first working on a large .NET application, and have been a very powerful tool for me ever since. I attribute this mostly to the fact that I understand how managed types are laid out in memory, how .NET metadata is organized, and thus how Reflection can provide access, at runtime, to this information. In fact, I immediately feel at home with Reflection in other languages and frameworks as well: for instance, my first instinct when working on the Windows Azure Mobile Services unofficial Android SDK was to write my own JSON serializer in Java instead of relying on a third party library. After the fact, it might not have been the best decision, but it took me less than 2 hours to have a working serializer that supports most of the types WAMS requires.
&lt;p&gt;
As a final example, I have a very big problem adopting new languages, especially if they&amp;#39;re not merely compiled to another language. In other words, I wouldn&amp;#39;t mind using something like TypeScript or CoffeeScript, where I can easily see how the source is compiled down to JavaScript, and how a new piece of syntax is merely a mapping or syntactic sugar on top of existing syntax. But a &amp;quot;brand new&amp;quot; language, such as Objective C, poses huge problems for my mind. It&amp;#39;s not the brackety syntax I have trouble with; it&amp;#39;s the &amp;quot;how&amp;quot; of the language. How are Objective C objects laid out in memory? How are methods dispatched, considering that you can override them and even dispatch them dynamically by name? How does the compiler manage memory automatically (yes, reference counting -- but that&amp;#39;s just a buzzword)? The same applies to a language like Python: I can use Python to write scripts, create modules, and even interact with C-style DLLs, but I don&amp;#39;t have a clear picture of where attributes are stored and how typing works in a dynamically-typed language.
&lt;p&gt;
To conclude, I wish that every tutorial in the world were followed by a &amp;quot;how it works&amp;quot; section that would tell me how I can implement that language, technology, or framework -- on my own. Until such time, I hope this post explains why I tend to over-analyze how stuff works, to the extend of implementing it myself. The root cause of this might be that I&amp;#39;m used to systems, frameworks, and languages that I fully understand; it might have something to do with debugging or performance concerns; but at the end of the day, I &lt;i&gt;need&lt;/i&gt; to know how it works: otherwise, I face a psychological barrier that gets more and more painful to overcome every day.
&lt;p&gt;
&lt;hr /&gt;
&lt;i&gt;I am posting short links and updates on Twitter as well as on this blog. You can follow me: &lt;a href="http://twitter.com/goldshtn"&gt;@goldshtn&lt;/a&gt;&lt;/i&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1713728" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/DEV/default.aspx">DEV</category></item><item><title>Why App Stores Are a Necessary Evil</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2012/10/01/why-app-stores-are-a-necessary-evil.aspx</link><pubDate>Mon, 01 Oct 2012 15:37:05 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1321614</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=1321614</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2012/10/01/why-app-stores-are-a-necessary-evil.aspx#comments</comments><description>&lt;p&gt;I’ve just read an &lt;a href="http://www.idigitaltimes.com/articles/11535/20120930/windows-8-metro-apps-windows-store-windows-8-release-date.htm"&gt;article on International Digital Times&lt;/a&gt; that laments the impossibility of distributing a Windows Store app externally, without using the Windows Store. Setting aside the oxymoron for a moment (distributing a Windows Store app through something that is not the Windows Store :-)), this is not as bad as the author thinks it is.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;In fact, I sometimes get the feeling that people are bashing Windows 8 and the Windows Store not for its merits or disadvantages, but out of a “someone moved my cheese” feeling.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Installation Model&lt;/strong&gt;    &lt;br /&gt;The author doesn’t like the fact that you can’t get your favorite app from download.com, and have to go to the Windows Store instead. Frankly, most users will find it much more convenient to use the consistent Store interface, which requires no additional instruction. No need to download an installer file, run it, make sure you run it elevated, make sure you’re using a suitable version of the operating system, make sure you have whatever dependencies that application needs, and so on and so forth.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/sasha/image_54B54057.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/sasha/image_thumb_3AE39AD9.png" width="557" height="187" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;em&gt;The beauty of the &lt;a href="http://www.rarlab.com/download.htm"&gt;WinRAR download page&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The author also complains that instead of Googling the app name, going to the website, and installing it directly, users will have to open the Store application and enter their Microsoft credentials. This is simply inaccurate. First of all, you can (and should) link Windows and the Windows Store to your Microsoft account. You won’t have to enter your Microsoft credentials again. Moreover, the author is overlooking the way users are going to look for apps. They will not Google the app and then go to its website. They will look up the app in the Store interface, which makes it dead easy to find, review, buy, and install any app you want.&lt;/p&gt;  &lt;p&gt;Another objection could be that users aren’t used to installing apps through the Store, and will feel more comfortable with Google as the search interface. This may be true of users who have been living under a rock for the past 5 years, but not for anyone with an iPhone, Android phone, or Windows Phone. I’d say most users would be surprised that they have to go to a website to obtain an app instead of the consistent, trusted interface of an application store.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Monetization Opportunities     &lt;br /&gt;&lt;/strong&gt;Users don’t have to know about it, but app developers have a much better monetization story with the Windows Store than with other distribution mechanisms. You have a built-in trial licensing mode which can expire automatically or limit the app’s functionality until it is purchased. You can embed ads in your apps from a number of provides. You can provide in-app purchases of game levels, periodic magazine subscriptions, and many other kinds of virtual goods. And of course, Microsoft takes care of the payment processing, in exchange for the 30% or 20% fee.&lt;/p&gt;  &lt;p&gt;Compare this to commercial desktop software. Developers need to worry about trial licensing, application piracy, payment processing, subscriptions, additional purchases – and none of this is covered by any standard framework.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Update Model     &lt;br /&gt;&lt;/strong&gt;Consider Chrome, Firefox, Adobe Reader, iTunes – large applications that needs some means of automatic updating. The method of choice for these applications is to ship with a special service that runs in the background, checks for updates, and perhaps even installs them automatically. I can tell you with complete honesty that I’ve seen the Adobe Reader and iTunes auto-updaters more frequently than the respective applications. This is not an advantage of out-of-store distribution. This is a huge disadvantage that bloats the users’ PCs with a bunch of background services, which often run with elevated security privileges, consume battery power unnecessarily and expose the system to additional risks.&lt;/p&gt;  &lt;p&gt;While we’re at it, the author seems to think that pushing an update to the application’s website is somehow better than pushing the update through the Windows Store. One thing is certain: passing the certification process for the update in the Store will take more time than pushing an exe file to your website. However, getting the update to your application’s users is definitely going to take much longer if you just push the exe to your website. You can’t seriously expect users to periodically check for updates. And if you pop a huge message in their face saying that the app needs updating and they have to go to the website, how is this any better than using the Store’s automatic update mechanism?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;In Conclusion     &lt;br /&gt;&lt;/strong&gt;If you feel so bad about your cheese being moved, go ahead an install desktop applications on your Windows 8 machine. I know I did. I spend most of my time on the desktop, with a choice of desktop apps like Visual Studio, Outlook, Word, Chrome, Internet Explorer, Windows Live Writer, Evernote, OneNote, and many others. In fact, I don’t even particularly like the built-in Windows 8 apps right now – the Mail app is crippled, the People app is slow, the Messaging app has limited support for my favorite chat services. But for me, that’s part of the value Windows 8 brings to the table. It is still a desktop operating system, with another face. A face that might – just might – become the bread and butter of Windows developers for years to come.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;I am posting short updates and links on Twitter as well as on this blog. You can follow me: &lt;/em&gt;&lt;a href="http://twitter.com/goldshtn"&gt;&lt;em&gt;@goldshtn&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1321614" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/Windows8/default.aspx">Windows8</category></item><item><title>Why Asking Google-able Questions at Interviews Is Just Fine, Really</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2012/09/13/why-asking-google-able-questions-at-interviews-is-just-fine-really.aspx</link><pubDate>Thu, 13 Sep 2012 20:17:12 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1281624</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=1281624</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2012/09/13/why-asking-google-able-questions-at-interviews-is-just-fine-really.aspx#comments</comments><description>&lt;p&gt;I’ve recently encountered the position that it is bad form to ask interview questions which can be answered easily by using Google. Some examples include traversing a linked list, naming some important API, or describing the architecture of a popular framework.&lt;/p&gt;  &lt;p&gt;I could not disagree more. The litmus test for interview questions should not be whether you can find the answer by researching the subject online. If that were the criteria, interviews would be ten hours long and consist of very difficult algorithmic questions – and of course you’d have to come up with these questions yourself!&lt;/p&gt;  &lt;p&gt;There are perfectly legitimate reasons for asking questions that can be answered by researching online. Here are some examples:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Traversing/reversing/otherwise manipulating a linked list demonstrates basic understanding of data structures, runtime complexity, and in unmanaged languages – pointers, which are misunderstood by too many developers, not only on the junior level.&lt;/li&gt;    &lt;li&gt;Naming important API demonstrates that you are working with it on a daily basis, and that you really know what you’re talking about. If you are a C# developer and cannot write a C# program that reads a few lines from a text file, you’re probably embraced too tightly by a framework (or three) and need to go back to basics once in a while.&lt;/li&gt;    &lt;li&gt;Describing the architecture or design of a particular framework you’re using illustrates that you don’t accept things at face value, and are willing to invest the time to understand a subject in depth.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Yes, these things can be researched online, and I don’t care. I will ask you for the answers, and I won’t let you Google while answering. This is not about the fact we all use Google, StackOverflow, and a myriad of other online resources in our day jobs all the time. This is not about being able to research a topic online and come up with a great implementation. This is about being a Developer, and not mashing up pieces of code with no understanding what they do.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;I am posting short updates and links on Twitter as well as on this blog. You can follow me: &lt;/em&gt;&lt;a href="http://twitter.com/goldshtn"&gt;&lt;em&gt;@goldshtn&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1281624" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category></item><item><title>Honored to be Renominated as Microsoft MVP for 2012</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2012/04/04/honored-to-be-renominated-as-microsoft-mvp-for-2012.aspx</link><pubDate>Wed, 04 Apr 2012 14:34:30 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1053970</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=1053970</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2012/04/04/honored-to-be-renominated-as-microsoft-mvp-for-2012.aspx#comments</comments><description>&lt;p&gt;On April 1 (yes, it has the potential of being an April Fool’s every time!) I received the renomination letter—I am honored to receive the &lt;a href="http://www.microsoft.com/communities/mvp/mvp.mspx"&gt;Microsoft MVP Award&lt;/a&gt; in Visual C# for 2012.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/sasha/image_466B9FE4.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px 10px 10px 0px;padding-left:0px;padding-right:0px;display:inline;float:left;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" align="left" src="http://blogs.microsoft.co.il/blogs/sasha/image_thumb_0E8935F4.png" width="110" height="173" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As I wrote a year ago, 2011 was an exciting year for C#—I had several opportunities to talk about async methods and the parallelism revolution last year, and 2012—the year of Windows 8—promises to be even more interesting for C# as we tackle the development of Metro-style apps.&lt;/p&gt;  &lt;p&gt;I wouldn’t be writing this post if it weren’t for the help and support of my colleagues, friends, and managers at SELA and our business partners and friends at Microsoft Israel. Specifically, David Bassa and Ishai Ram are still the best managers and friends a tech professional can have, and Guy Burstein of Microsoft DPE continuously amazes me by shaping the Israeli developer community with MSDN events and user group meetings.&lt;/p&gt;  &lt;p&gt;Thanks for reading—I am looking forward for the rest of 2012 and hope to continue providing you with interesting information on gory CLR internals and debugging problems :-)&lt;/p&gt;  &lt;hr /&gt; &lt;em&gt;I am posting short updates and links on Twitter as well as on this blog. You can follow me: &lt;/em&gt;&lt;a href="http://twitter.com/goldshtn"&gt;&lt;em&gt;@goldshtn&lt;/em&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1053970" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category></item><item><title>Analysis of a Mobile Redirection Framework and Obfuscated Regular Expressions</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/31/analysis-of-a-mobile-redirection-framework-and-obfuscated-regular-expressions.aspx</link><pubDate>Tue, 31 Jan 2012 14:17:48 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1003089</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=1003089</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/31/analysis-of-a-mobile-redirection-framework-and-obfuscated-regular-expressions.aspx#comments</comments><description>&lt;p&gt;I don’t often read &lt;a href="http://www.haaretz.co.il"&gt;Haaretz&lt;/a&gt;, but there are from time to time articles that friends share on Facebook or come up in search results – and I find myself on the Haaretz website. Often enough, it happens on my mobile phone – and every time I find myself redirected to a very primitive version of the website. Compare for yourself:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/sasha/image_7AD7154F.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/sasha/image_thumb_223DBBED.png" width="352" height="294" /&gt;&lt;/a&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/sasha/image_4CC976FD.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/sasha/image_thumb_79AEB40B.png" width="152" height="294" /&gt;&lt;/a&gt;    &lt;br /&gt;&lt;em&gt;(Screenshot on the right obtained by &lt;a href="https://plus.google.com/113127438179392830442/posts/946NsUZLGs7"&gt;changing the user agent in the Chrome Canary build&lt;/a&gt;. Very nice built-in feature.)&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;I was curious what were the criteria used by the Haaretz website to do this redirect, and started sniffing around the traffic with &lt;a href="http://www.fiddler2.com"&gt;Fiddler&lt;/a&gt;. After most of the Haaretz front page has been downloaded, the browser suddenly issued a request for &lt;em&gt;g.watap.net/w2w/haaretz&lt;/em&gt;, which issues not one, but two 302 redirects and eventually lands on the crippled mobile version.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/sasha/image_530027BE.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/sasha/image_thumb_1AFE33DB.png" width="527" height="539" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Interestingly, I’ve tried more than one mobile user agent, and the resulting mobile website was pretty much &lt;u&gt;the same&lt;/u&gt; (so I am getting the same experience with an iPhone, Android, or a feature-phone). I believe this is a poor choice on Haaretz’s behalf, so I started investigating a little.&lt;/p&gt;  &lt;p&gt;I started by running a &lt;a href="http://who.is/whois/watap.net/"&gt;whois query on watap.net&lt;/a&gt;, and found that it’s registered through Go Daddy for PassCall Advanced Technologies. Then I turned my attention to PassCall, and found on their website that they are providing a &lt;a href="http://www.passcall.com/desktop/en/technology.html"&gt;platform that adapts existing websites to mobile browsing&lt;/a&gt;. Indeed, I find Haaretz in their &lt;a href="http://www.passcall.com/desktop/en/clients.html"&gt;list of customers&lt;/a&gt;. From what I could tell, all the customers are Israeli companies, and the &lt;em&gt;g.watap.net&lt;/em&gt; host resolves to an Israeli IP address, probably hosted by NetVision, a major Israeli ISP.&lt;/p&gt;  &lt;p&gt;What is the precise process used by PassCall to determine whether or not to redirect my browser to the dumbed-down mobile version? I was brave enough to start reading through the ~8500 lines of HTML and script that is the Haaretz front page. Very close to the beginning there’s a copyright notice by PassCall with a minified script. I won’t paste the whole thing, but here’s a start:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;var passcall_pcmdt={i$i:function(){try{eval(function(p,a,c,k,e,d){e=function(c){return(c&amp;lt;a?&amp;#39;&amp;#39;:e(parseInt(c/a)))+((c=c%a)&amp;gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&amp;#39;&amp;#39;.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return&amp;#39;\\w+&amp;#39;};c=1};while(c--){if(k[c]){p=p.replace(new RegExp(&amp;#39;\\b&amp;#39;+e(c)+&amp;#39;\\b&amp;#39;,&amp;#39;g&amp;#39;),k[c])}}return p}(&amp;#39;3 f=D(p,q,o,2,e){4(6.7.a(\&amp;#39;5=0\&amp;#39;)&amp;gt;-1)m;3 b=s r();b.t(b.n()+B);3 d=s r();d.t(d.n()+1);4(9.c.a(\&amp;#39;y=1\&amp;#39;)&amp;gt;-1){6.7=\&amp;#39;5=0; j=/; i=\&amp;#39;+d.l();m}E 4(9.c.a(\&amp;#39;G=1\&amp;#39;)&amp;gt;-1){6.7=\&amp;#39;5=0; j=/; i=\&amp;#39;+b.l();m}3 8=6.7.a(\&amp;#39;5=1\&amp;#39;)&amp;gt;-1;4(!8){3 v=p.h(k.g);3 x=q.h(k.g);3 u=!o.h(k.g);8=(v||x)&amp;amp;&amp;amp;u;6.7=\&amp;#39;5=\&amp;#39;+F(I(8))+&amp;quot;; j=/; i=&amp;quot;+b.l()}4(8){2=9.c.w(9.H,2);4(C e!=\&amp;#39;z\&amp;#39;&amp;amp;&amp;amp;e.A){2+=2.a(\&amp;#39;?\&amp;#39;)&amp;gt;-1?\&amp;#39;&amp;amp;\&amp;#39;:\&amp;#39;?\&amp;#39;;2=2.w(\&amp;#39;?&amp;amp;\&amp;#39;,\&amp;#39;?\&amp;#39;);2+=e}9.c=2}}&amp;#39;,45,45,&amp;#39;||r\x65\x64\x69rt\x6f|\x76\x61r|\x69\x66|___\x70\x63\x6d\x64\x74___|\x64\x6f\x63\x75men\x74|\x63\x6f\x6f\x6b\x69\x65|\x72\x65\x64\x69\x72|l\x6f\x63\x61ti\x6fn|\x69n\x64\x65x\x4ff||\x68\x72\x65\x66|\x62\x62|p\x61r\x61ms||u\x73\x65rAge\x6e\x74|\x74\x65\x73\x74|\x65\x78\x70\x69\x72\x65\x73|\x70a\x74h|\x6e\x61\x76\x69\x67\x61t\x6fr|toU\x54\x43S\x74\x72in\x67|\x72e\x74\x75\x72\x6e|g\x65\x74D\x61te|\x723|\x721|r2|\x44\x61\x74\x65|\x6e\x65\x77|\x73\x65\x74D\x61\x…&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I took this beauty to &lt;a href="http://jsbeautifier.org/"&gt;jsbeautifier.org&lt;/a&gt; where it got a much prettier shape. Here’s the first part, beautified:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;var passcall_pcmdt = {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; i$i: function () {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; eval(function (p, a, c, k, e, d) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; e = function (c) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (c &amp;lt; a ? &amp;#39;&amp;#39; : e(parseInt(c / a))) + ((c = c % a) &amp;gt; 35 ? String.fromCharCode(c + 29) : c.toString(36))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!&amp;#39;&amp;#39;.replace(/^/, String)) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (c--) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; d[e(c)] = k[c] || e(c)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; k = [function (e) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return d[e]      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; e = function () {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return &amp;#39;\\w+&amp;#39;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c = 1      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (c--) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (k[c]) {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p = p.replace(new RegExp(&amp;#39;\\b&amp;#39; + e(c) + &amp;#39;\\b&amp;#39;, &amp;#39;g&amp;#39;), k[c])      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return p      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }(…&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Okay, this is obviously an unpacker – it even says &lt;em&gt;function (p, a, c, k, e, d)&lt;/em&gt; right there. Thanks for the hint. So the first part is a slightly minified unpacker, and the hex-encoded strings (not shown here) are probably the actual code. Instead of trying to run the unpacking algorithm with a pen and paper, I simply put a breakpoint in the beginning of the script and started stepping in and out until I got this beautiful function, called &lt;em&gt;f&lt;/em&gt;, which does the interesting part:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;var f = function(r1, r2, r3, redirto, params) {     &lt;br /&gt;&amp;#160; if (document.cookie.indexOf(&amp;#39;___pcmdt___=0&amp;#39;) &amp;gt; -1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return;      &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;var b = new Date();     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;b.setDate(b.getDate() + 360);     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;var bb = new Date();     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;bb.setDate(bb.getDate() + 1);     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;if (location.href.indexOf(&amp;#39;snopcmdt=1&amp;#39;) &amp;gt; -1) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;document.cookie = &amp;#39;___pcmdt___=0; path=/; expires=&amp;#39; + bb.toUTCString();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;return     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;} else if (location.href.indexOf(&amp;#39;nopcmdt=1&amp;#39;) &amp;gt; -1) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;document.cookie = &amp;#39;___pcmdt___=0; path=/; expires=&amp;#39; + b.toUTCString();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;return     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;}     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;var redir = document.cookie.indexOf(&amp;#39;___pcmdt___=1&amp;#39;) &amp;gt; -1;     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;if (!redir) {     &lt;br /&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;var b1 = r1.test(navigator.userAgent);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;var b2 = r2.test(navigator.userAgent);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;var b3 = !r3.test(navigator.userAgent);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;redir = (b1 || b2) &amp;amp;&amp;amp; b3;&lt;/strong&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;document.cookie = &amp;#39;___pcmdt___=&amp;#39; + parseInt(Number(redir)) + &amp;quot;; path=/; expires=&amp;quot; + b.toUTCString()     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;}     &lt;br /&gt;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;if (redir) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;redirto = location.href.replace(location.host, redirto);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;if (typeof params != &amp;#39;undefined&amp;#39; &amp;amp;&amp;amp; params.length) {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;redirto += redirto.indexOf(&amp;#39;?&amp;#39;) &amp;gt; -1 ? &amp;#39;&amp;amp;&amp;#39; : &amp;#39;?&amp;#39;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;redirto = redirto.replace(&amp;#39;?&amp;amp;&amp;#39;, &amp;#39;?&amp;#39;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Consolas"&gt;redirto += params     &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&amp;#160; &lt;strong&gt;location.href = redirto&lt;/strong&gt;      &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&amp;#160; }     &lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Note how this is no longer obfuscated, and perfectly readable. The script starts by checking if there is a cookie instructing it whether to do the mobile redirect or not. Marked in bold are the interesting parts – this is what we get if we have to make a new decision – and then the redirect itself is simply replacing &lt;em&gt;location.href&lt;/em&gt; with a new location. The whole redirect-or-not logic boils down to three regular expressions (&lt;em&gt;r1&lt;/em&gt;, &lt;em&gt;r2&lt;/em&gt;, &lt;em&gt;r3&lt;/em&gt;). Let’s take a look at these regular expressions. Here is &lt;em&gt;r1&lt;/em&gt;:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;^(((A|3|Q)l(v|5|c)a(t|3|2)e(l|3|x))|((X|6|E)Z(O|2|j)S)|((9|H|6)D(q|2|h)_(h|3|T))|((H|7|1)D_m(i|0|j)n)|((9|I|6)C(v|1|o)p(q|8|p)i(q|e|j)d(v|8|F)r(v|o|q)m(4|P|9)a(s|2|0)s(c|4|X)a(v|7|l)l(q|7|C)o(q|6|d)e(j|4|0)h(a|6|0)a(r|0|q)e(t|5|x)z)|((v|8|L)G(E|7|3)?[-/_])|((0|M|6)a(u|3|Q)i B(r|7|x)o(w|4|0)s(q|6|e)r)|((P|0|h)C(L|2|q)[4-6][4-6])|((q|6|S)E(h|C|Q)-)|((v|S|j)G(H|2|3)-)|((S|0|2)I(E|X|h)-)|((j|4|S)K_)|((q|6|S)O(j|4|N)I(M|x|q))|((8|S|4)e(0|n|4)d(j|o|Q))|((j|8|T)e(j|l|X)i(4|t|6))|((h|p|q)o(q|r|5)t(q|a|h)l(q|m|v)m(h|8|m)))&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Looks like a bad-ass regular expression? Not at all. In fact, this is just a light attempt at obfuscating the regular expression without changing its meaning too much. Note that the whole thing is just a big disjunction over a bunch of strings. Here’s the first component:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;((A|3|Q)l(v|5|c)a(t|3|2)e(l|3|x))&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;What could it possibly be? Obviously, it’s “Alcatel”:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;((&lt;font style="background-color:#ffff00;"&gt;A&lt;/font&gt;|3|Q)&lt;font style="background-color:#ffff00;"&gt;l&lt;/font&gt;(v|5|&lt;font style="background-color:#ffff00;"&gt;c&lt;/font&gt;)&lt;font style="background-color:#ffff00;"&gt;a&lt;/font&gt;(&lt;font style="background-color:#ffff00;"&gt;t&lt;/font&gt;|3|2)&lt;font style="background-color:#ffff00;"&gt;e&lt;/font&gt;(&lt;font style="background-color:#ffff00;"&gt;l&lt;/font&gt;|3|x))&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;How about this guy?&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;((h|p|q)o(q|r|5)t(q|a|h)l(q|m|v)m(h|8|m))&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This one is “portalmmm”, which apparently is a mobile user agent used by &lt;a href="http://en.wikipedia.org/wiki/I-mode"&gt;i-mode&lt;/a&gt; mobile browsers. Finally, what is this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;((9|I|6)C(v|1|o)p(q|8|p)i(q|e|j)d(v|8|F)r(v|o|q)m(4|P|9)a(s|2|0)s(c|4|X)a(v|7|l)l(q|7|C)o(q|6|d)e(j|4|0)h(a|6|0)a(r|0|q)e(t|5|x)z)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Fairly long to be a mobile user agent. Indeed, it becomes ICopiedFromPasscallCode?haaretz – which is a rudimentary copy-protection mechanism.&lt;/p&gt;  &lt;p&gt;I can tell you right away that &lt;em&gt;r2&lt;/em&gt; is no different:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;((a|3|Q)n(v|5|d)r(o|3|2)i(d|3|x))|((X|6|b)l(a|2|j)c(k|X|q)B(4|e|8)r(r|Q|0)y)|((G|x|h)T-P(v|9|1)0(q|0|x)0)|((H|7|Q)T(q|6|C))|((Q|6|H)u(6|a|5)w(X|5|e)i[u/-])|((i|1|0)p(h|5|a)d)|((q|i|v)p(h|9|0)o(h|6|n)e)|((j|2|m)o(5|t|8)o(4|r|8)o(l|2|q)a)|((4|M|7)O(T|7|0)[-_])|((8|n|6)o(k|3|x)i(h|2|a))|((s|Q|1)o(x|4|n)y(x|8|e)r(q|8|i)c(s|5|Q)s(o|3|Q)n)|((h|6|s)a(4|m|5)s(h|u|x)n(g|6|3))|((j|3|P)a(l|X|h)m)|((x|5|p)h(h|7|i)l(i|7|2)p(3|s|5))|((v|U|Q)P.(v|6|B)r(o|0|j)w(s|7|Q)e(r|3|q))|((w|5|2)i(7|n|5)d(q|3|o)w(6|s|4) (((9|p|5)h(o|X|q)n(e|x|q))|((h|c|q)e)))|((8|I|7)E(X|8|M)o(h|5|b)i(h|6|l)e)|((9|V|7)o(d|Q|j)a(f|8|Q)o(X|4|n)e)|((X|9|o)p(q|e|j)r(h|a|j) (v|m|q)o(v|b|x)i)|((4|o|5)p(e|0|2)r(v|4|a) (2|m|5)i(v|9|n)i)|((q|7|s)y(q|m|0)b(q|6|i)a(n|0|q))|((X|8|1)o(o|X|0)m)|( P(q|r|h)e[/])&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This yields stuff like “android”, “ipad”, “iphone”, “windows phone”, “Xoom”, and many others. And then there’s &lt;em&gt;r3&lt;/em&gt;, which will &lt;u&gt;disqualify&lt;/u&gt; a user agent from redirecting to the mobile site:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;((i|3|Q)p(v|5|a)d)|((q|9|V)i(7|e|8)w(j|P|X)a(Q|8|d))|((M|7|Q)Z(q|6|9)0(1|X|q))|((q|8|G)T-P(q|2|1)0(3|0|8)0)|((q|6|G)T-P(v|7|Q)5(v|8|0)0)|((j|5|X)o(3|o|5)m)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;…and here we have “ipad” and “Xoom” &lt;u&gt;again&lt;/u&gt;, which is quite silly because we just saw them in &lt;em&gt;r2&lt;/em&gt;. Probably the obfuscation layer makes it hard for the PassCall developers to make changes :-)&lt;/p&gt;  &lt;p&gt;All in all, here is a (partial) set of user agents that PassCall will redirect to the mobile website and a (partial) set of user agents that they won’t (the list is based on what I’ve seen on Haaretz’s website on January 31, 2012):&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Will redirect if starts with&lt;/strong&gt;: Alcatel, ICopiedFromPasscallCode?haaretz, LGE-, Maui Browser, SEC-, SGH-, SIE-, SK-, SONIM-, Sendo-, Telit-, portalmmm&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Will redirect if contains&lt;/strong&gt;: android, blackBerry, GTP-?, HTC, Huawei, ipad, iphone, motorola, MOT-, nokia, sonyericcson, samsung, Palm, philips, UP.Browser, windows phone, windows ce, IEMobile, Vodafone, opera mobi, opera mini, symbian, Xoom, Pre&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Will not redirect if contains&lt;/strong&gt;: ipad, ViewPad, MZ601, Xoom&lt;/p&gt;  &lt;p&gt;I am curious about other tablets, such as the Samsung Galaxy Tab, meeting the criteria for a mobile device. Indeed, with the Galaxy Tab user agent (“&lt;em&gt;Mozilla/5.0 (Linux; U; Android 3.0; xx-xx; GT-P7100 Build/HRI83) AppleWebkit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13&lt;/em&gt;”) we are getting the mobile version. And the most annoying thing? I don’t see a way on the mobile version to switch back to the desktop version if I’d like. And that’s the number one fallback you should have if you’re using blunt regular expressions to determine which website to show me.&lt;/p&gt;  &lt;p&gt;To summarize:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Haaretz is using PassCall Advanced Technologies to redirect its mobile visitors to a crippled mobile version of the website&lt;/li&gt;    &lt;li&gt;PassCall is using a set of regular expressions to determine whether a user’s user agent represents a mobile device and performs an unconditional redirect&lt;/li&gt;    &lt;li&gt;PassCall provides the same mobile experience for a 2011 iPhone 4S and a 2005 Nokia feature-phone&lt;/li&gt;    &lt;li&gt;There doesn’t seem to be a way to get back to the desktop version from the dumbed-down mobile one&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I would greatly appreciate any comments and corrections. This research has been performed for personal purposes and does not represent the position of my employer.&lt;/p&gt;  &lt;hr /&gt; &lt;em&gt;I am posting short updates and links on Twitter as well as on this blog. You can follow me: &lt;/em&gt;&lt;a href="http://twitter.com/goldshtn"&gt;&lt;em&gt;@goldshtn&lt;/em&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1003089" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category></item><item><title>Things Learned in 2011 and Plans for 2012</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/01/things-learned-in-2011-and-plans-for-2012.aspx</link><pubDate>Sun, 01 Jan 2012 15:22:03 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:975379</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=975379</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/01/things-learned-in-2011-and-plans-for-2012.aspx#comments</comments><description>&lt;p&gt;I keep telling junior software developers that the only way to maintain their expertise and to become better developers is a &lt;em&gt;&lt;strong&gt;continuous learning&lt;/strong&gt;&lt;/em&gt; process. 2011 has been a very productive year for me (and many others at &lt;a href="http://www.selagroup.com/"&gt;SELA&lt;/a&gt;!), and I am looking forward to 2012, the year of Windows 8, in eager anticipation. Below are some of the things I learned in 2011 and some of the things planned for 2012.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;Learned in 2011&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Most of Q1 2011 I was working on the brand-new &lt;strong&gt;&lt;a href="http://sela.co.il/syl/syllabus.aspx?CourseCode=DNParallel&amp;amp;CategoryID=165"&gt;Parallel Programming in .NET 4.0&lt;/a&gt;&lt;/strong&gt; course with &lt;a href="http://blogs.microsoft.co.il/blogs/bnaya/"&gt;Bnaya Eshet&lt;/a&gt;. I’ve been using the TPL for a while before that, but writing slide decks, labs, and demos – culminating in actually teaching the course – is definitely the best way to learn a subject of this magnitude.&lt;/p&gt;  &lt;p&gt;Later during the year I updated the &lt;strong&gt;&lt;a href="http://sela.co.il/syl/syllabus.aspx?CourseCode=Win32_64_Con&amp;amp;CategoryID=165"&gt;Windows Concurrent Programming&lt;/a&gt;&lt;/strong&gt; course (for C++/Win32 developers), including brand new content on ConcRT, synchronization and threading internals, and a bunch of new hands-on labs.&lt;/p&gt;  &lt;p&gt;Back in 2010 I delivered a user group presentation on &lt;strong&gt;C++0x&lt;/strong&gt;, which emerged as a final standard in late September. At the &lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2011/12/09/sdp-december-2011-everything-new-in-c.aspx"&gt;December SDP&lt;/a&gt;, &lt;a href="http://blogs.microsoft.co.il/blogs/noams/"&gt;Noam Sheffer&lt;/a&gt; and I delivered a whole day on the new &lt;strong&gt;C++11&lt;/strong&gt; language standard and standard library, which involved getting all the nitty-gritty details of the new language syntax (such as perfect forwarding, which I find the hardest “feature” to teach).&lt;/p&gt;  &lt;p&gt;Next up is &lt;strong&gt;JavaScript&lt;/strong&gt;. Yes, seriously. If you ever talked to me for more than a few minutes you know that I hate UI development in general, and Web development in particular. However, this was a gaping hole in my understanding of Web-related performance problems and bugs, and a gaping hole in the “general education” of any software developer. So I forced myself to relearn HTML, CSS, and JavaScript, and used the opportunity to learn the new HTML5 JavaScript APIs, jQuery, and even &lt;a href="http://nodejs.org"&gt;node.js&lt;/a&gt; (which should be the subject of another post).&lt;/p&gt;  &lt;p&gt;Another thing I was always very interested in but rarely had the time to invest in professionally is &lt;strong&gt;security research&lt;/strong&gt;. Although my day job usually does not involve any serious security research, I like to keep my general knowledge up to date by subscribing to vulnerability disclosure lists, following notorious security researchers, practicing simple exploitation and reverse-engineering scenarios with modern tools, and so on. In 2011 I invested in my reverse engineering skills and some modern exploitation techniques such as &lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2011/12/22/return-oriented-programming.aspx"&gt;ROP&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Any list summarizing 2011 will be woefully incomplete without mentioning &lt;strong&gt;Windows 8&lt;/strong&gt;. At //build we saw a &lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/14/windows-8-announcement-executive-summary.aspx"&gt;glimpse of what’s to come in 2012&lt;/a&gt;, but the Windows 8 Developer Preview is already an exciting consumer experience and an exciting target for software development. I wrote an article on Windows 8 security aspects [&lt;a href="http://www.digitalwhisper.co.il/files/Zines/0x1A/DW26-2-Win8news.pdf"&gt;pdf&lt;/a&gt;, Hebrew] and presented &lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2011/12/10/sdp-december-2011-introducing-windows-8-keynote.aspx"&gt;Windows 8 at the December SDP keynote&lt;/a&gt;, but there’s obviously much more to learn here, and I’ll leave it to 2012.&lt;/p&gt;  &lt;p&gt;Finally, here’s a grocery list of some smaller things I learned in 2011 (some of which I don’t understand yet in a professional capacity):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Windows Phone&lt;/li&gt;    &lt;li&gt;GPGPU, specifically C++ AMP&lt;/li&gt;    &lt;li&gt;Fundamentals of hardware architecture&lt;/li&gt;    &lt;li&gt;Refreshment of Windows Internals for Windows 7&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2011/05/02/dbx-vs-visual-studio-and-windbg-part-2d-conditional-breakpoints.aspx"&gt;DBX debugger on Solaris&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2011/07/19/clr-stack-explorer-preview.aspx"&gt;CLR Debugging API&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;Planned for 2012&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;2012 is going to be remembered as the year of &lt;strong&gt;Windows 8&lt;/strong&gt;. With a sharp turn to a new runtime, development framework, UI style, and form factors – it’s inevitably going to take quite a while to learn and practice. From what I’ve seen so far, it will be fun :-)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;General-purpose GPU computing&lt;/strong&gt; (GPGPU) is becoming mainstream, especially with an awesome framework like C++ AMP behind it. In 2012, I hope to find opportunities to use C++ AMP in a real project, and expand my understanding of the underlying GPU concepts.&lt;/p&gt;  &lt;p&gt;Finally, on a less professional level, I plan to expand my horizons in &lt;strong&gt;Web application security&lt;/strong&gt;, specifically &lt;a href="http://lcamtuf.coredump.cx/postxss/"&gt;new advances in HTML injection&lt;/a&gt;, smart XSS attacks, crypto weaknesses, and similar topics.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Now, if I had to guess in 2010 whether I will be spending time on Solaris or JavaScript in 2011, there’s no way I’d say yes. I’m really looking forward to January 1, 2013 to see what actually happens in 2012 :-)&lt;/em&gt;&lt;/p&gt;  &lt;hr /&gt;&lt;em&gt;I am posting short updates and links on Twitter as well as on this blog. You can follow me: &lt;/em&gt;&lt;a href="http://twitter.com/goldshtn"&gt;&lt;em&gt;@goldshtn&lt;/em&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=975379" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category></item><item><title>Tracking Engagement Time Using 302-Moved Temporarily Redirects</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/11/06/tracking-engagement-time-using-302-moved-temporarily-redirects.aspx</link><pubDate>Sun, 06 Nov 2011 13:31:14 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:926736</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=926736</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/11/06/tracking-engagement-time-using-302-moved-temporarily-redirects.aspx#comments</comments><description>&lt;p&gt;Suppose you are sending mass emails (legitimately, no doubt) and want to know which % of recipients actually viewed the email. The standard trick here is to embed a 1x1 image into your email’s HTML source, with the &lt;em&gt;&amp;lt;img src=&lt;/em&gt; pointing to a location on your Web server with part of the URL unique to the user (e.g., &lt;em&gt;&amp;lt;img src=&amp;quot;http://example.com/track/12345&amp;quot; /&amp;gt;&lt;/em&gt; where your mailing system knows that 12345 is associated with john@example.org). When the user opens your email, most email clients will send your server a request for that image&lt;strong&gt;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;/strong&gt;, and voila—you know that the recipient opened it. It’s also quite easy to determine which operating system + mail client combination was used to open the email, by inspecting the HTTP request headers.&lt;/p&gt;  &lt;p&gt;But what if you want to track engagement time, i.e. the time the user actually spent reading your email&lt;strong&gt;&lt;font color="#ff0000"&gt;*&lt;strong&gt;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;? This is a valuable metric that can tell you how your messages are working across different groups of users and how engagement times are translated into monetized actions.&lt;/p&gt;  &lt;p&gt;This sounds more scary—but here’s another simple trick I’ve seen as recently as yesterday. Embed the same 1x1 image into your HTML source, but this time your Web server needs to be somewhat smarter. When it receives a request for the image, it should return a 302—Moved Temporarily response, with a new URL for the image. When the browser hits that new URL, your Web server returns yet another 302 with yet another URL. This continues until the client gives up—which is usually when the user closes your email.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;&lt;strong&gt;Client (browser, email client)&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top"&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;GET /track/12345&lt;/td&gt;        &lt;td valign="top"&gt;302 Moved Temporarily         &lt;br /&gt;Location: …/track/12345?n=1&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;GET /track/12345?n=1&lt;/td&gt;        &lt;td valign="top"&gt;302 Moved Temporarily         &lt;br /&gt;Location: …/track/12345?n=2&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;GET /track/12345?n=2&lt;/td&gt;        &lt;td valign="top"&gt;302 Moved Temporarily         &lt;br /&gt;Location: …/track/12345?n=3&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;…you get the idea…&lt;/td&gt;        &lt;td valign="top"&gt;&amp;nbsp;&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;The server, on its end, knows the exact times of the requests received from the client and can track not only the fact that the email was opened, but also the engagement time, as defined above.&lt;/p&gt;  &lt;p&gt;Is this a legitimate tracking mechanism? In the era of persistent cookies, cookies that stay with you &lt;a href="http://www.skynews.com.au/tech/article.aspx?id=668393&amp;amp;vId="&gt;even if you’re logged off&lt;/a&gt; the website, tracking that &lt;a href="http://samy.pl/evercookie/"&gt;relies on ETags&lt;/a&gt; even if you have turned of all cookies and cleared your Flash and HTML5 local storage—it is probably a little naïve to talk about whether a simple image embedded in an email is a legitimate tracking technique, from a morality standpoint.&lt;/p&gt;  &lt;p&gt;However, I think it makes sense to discuss the cost of this mechanism, from the client’s perspective. Unless the Web server throttles the request rate by delaying the response as much as possible, the client will issue requests as quickly as it can. Suppose that the RTT is 300ms, and suppose that each request-response exchange takes 1.5KB. That’s a transfer rate of 4.5KB/s, or 270KB per minute. Over a broadband connection at home this is not something to worry about. However, over a GPRS data connection with a limited data plan, or—heavens forbid—a roaming connection, this is a non-negligible amount of data.&lt;/p&gt;  &lt;p&gt;Other considerations that come to mind are the CPU and network utilization from a power management perspective. When the email client keeps issuing requests, the network card is probably unable to enter a low power state even if everything else on the system is idle. On mobile devices, tablets, or laptops this may have an effect on battery life (although not as bad as playing Angry Birds :-)).&lt;/p&gt;  &lt;p&gt;   &lt;hr /&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;* &lt;/font&gt;&lt;/strong&gt;Well, actually many email clients have a setting that blocks remote images. And of course there are plain-text email clients that don’t render HTML emails at all. But let’s focus on the users you can track.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;*&lt;strong&gt;&lt;font color="#ff0000"&gt;* &lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/strong&gt;To be accurate, we will see how to determine the time elapsed from the moment the user opened your email to the moment she closed it or switched to another email. Tracking the time the user was actually reading the email requires more sophistication—perhaps eye-movement tracking through Webcam?—that is left as an exercise :-)&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=926736" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/Performance/default.aspx">Performance</category><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/Security/default.aspx">Security</category></item><item><title>9/11</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/11/9-11.aspx</link><pubDate>Sun, 11 Sep 2011 12:46:52 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:898816</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=898816</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/11/9-11.aspx#comments</comments><description>&lt;p&gt;A couple of days ago I got a phone call from my dad at 7:30AM. He asked “Are you guys OK?” and immediately scenarios of terrorist acts or missile launches started running through my head. It scared me – this unnatural but immediate reaction to an innocent question.&lt;/p&gt;  &lt;p&gt;The reality of living in Israel during the last 20 years has conditioned all of us to think in terms of surviving yesterday’s bombing or tomorrow’s war, and the periods of relative peace sometimes spanning months in a row aren’t enough to wipe away the instincts and fears.&lt;/p&gt;  &lt;p&gt;Whenever I use public transportation, I “evaluate” all the passengers for terrorist threats and examine every new face boarding the car. Whenever I hear the siren of an ambulance I wonder if it’s someone having a heart attack or a bombing in the middle of a shopping center. I know from conversations with my friends and family that they are wired that way, too.&lt;/p&gt;  &lt;p&gt;Ten years ago it was 3:45PM in Israel and I was watching a show on TV with a friend. A few minutes later, every news channel was broadcasting the unbelievable images of the burning twin towers, and my friend had difficulty believing that it wasn’t footage from a poorly-executed action flick.&lt;/p&gt;  &lt;p&gt;We will never forget 9/11. But ten years later, today more than ever, with the very real threat of terror engrained deeply into our instincts, we should &lt;strong&gt;refuse to be terrorized&lt;/strong&gt;.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=898816" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category></item><item><title>Dear Team Lead, You Are Not Doing Agile If…</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/08/30/dear-team-lead-you-are-not-doing-agile-if.aspx</link><pubDate>Tue, 30 Aug 2011 18:05:54 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:890850</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=890850</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/08/30/dear-team-lead-you-are-not-doing-agile-if.aspx#comments</comments><description>&lt;p&gt;…Your sprint planning meeting begins with a condescending description of what &lt;strong&gt;&lt;em&gt;The Methodology&lt;/em&gt;&lt;/strong&gt; looks like, and ends with “meet me here at 4PM – you will be assigned tasks and pairs”.&lt;/p&gt;  &lt;p&gt;…You switch task management tools every week, never failing to surprise your developers and upper management. (Hint: more tools is not necessarily better. Bugs on the whiteboard, tasks in Excel, projects in TFS, and resource scheduling in a custom tool is &lt;strong&gt;&lt;em&gt;confusing&lt;/em&gt;&lt;/strong&gt;.)&lt;/p&gt;  &lt;p&gt;…You have a heterogeneous team with young developers and you don’t do code reviews. (And still, you find the audacity to complain about bugs introduced due to lack of experience.)&lt;/p&gt;  &lt;p&gt;…You do testing in production. (Oh, I &lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2011/08/24/code-smells-and-other-problems.aspx"&gt;mentioned this one before&lt;/a&gt;.)&lt;/p&gt;  &lt;p&gt;…You have continuous integration and nightly builds, but the nightly builds never run and the CI build always fails. (“Only these 200 tests keep failing every time” – not an excuse. Commenting out failing tests – not an excuse.)&lt;/p&gt;  &lt;p&gt;What do you say, dear readers? What are your favorite “You are not doing agile if…” moments?&lt;/p&gt;  &lt;hr /&gt;&lt;em&gt;&lt;img style="display:inline;float:right;" align="right" src="https://si0.twimg.com/a/1314637676/images/logos/twitter_newbird_blue.png" width="52" height="52" alt="" /&gt;I have been recently posting short updates and links on Twitter as well as on this blog. You can follow me: &lt;/em&gt;&lt;a href="http://twitter.com/goldshtn"&gt;&lt;em&gt;@goldshtn&lt;/em&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=890850" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category></item><item><title>Dropbox, Instapaper, and the Cloud: Entrusting Your Data</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/07/12/dropbox-instapaper-and-the-cloud-entrusting-your-data.aspx</link><pubDate>Tue, 12 Jul 2011 20:59:16 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:857795</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=857795</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/07/12/dropbox-instapaper-and-the-cloud-entrusting-your-data.aspx#comments</comments><description>&lt;p&gt;I don&amp;#39;t typically rant about security or &amp;quot;The Cloud&amp;quot;, but as an avid Dropbox and Instapaper user I&amp;#39;ve had some comments building up inside for the past few weeks.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dropbox.com"&gt;Dropbox&lt;/a&gt; is a simple private file sharing service which gives you access to your files from a variety of devices (I use it on my Windows laptop, Windows desktop, MacBook Air, iPhone, and iPad). &lt;a href="http://www.instapaper.com"&gt;Instapaper&lt;/a&gt; is a tool for saving web pages for later viewing – when I don&amp;#39;t have time to read a long blog post or interesting article, I click a bookmark in my browser and the text gets saved to my Instapaper archive (I use it on all my PCs, iPhone, iPad, and Kindle).&lt;/p&gt;  &lt;p&gt;Recently both services have hit the headlines with unfortunate security-related stories. A brief recap of what I&amp;#39;m referring to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Dropbox rolled out an update that enabled you to log in without the correct password. This update was live for over four hours until it was detected and fixed. (The obvious question of &amp;quot;how on earth does this happen&amp;quot; is left as an exercise for the reader.)&lt;/li&gt;    &lt;li&gt;Instapaper&amp;#39;s database server was captured by the FBI in a raid on Instapaper&amp;#39;s Web hosting provider. It was later discovered that the FBI did not target the specific server, and did not capture the hard disk which was stored in a separate enclosure. The server was subsequently returned.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;These two seemingly-unrelated stories finally made me understand that I trust service providers with my data, having not much more than anecdotal information about how the data is stored, how it is secured, and what happens to it along the way. In fact, I have no idea where in the world my Dropbox files and Instapaper bookmarks are stored, how employee access to them is regulated, which governments can capture them given a court order, and what backups are in place in case the whole datacenter goes up in flames.&lt;/p&gt;  &lt;p&gt;Am I supposed to perform this investigation every time I entrust my data to a service provider? What do &lt;strong&gt;&lt;u&gt;you&lt;/u&gt;&lt;/strong&gt; do?&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=857795" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/Security/default.aspx">Security</category><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/Cloud/default.aspx">Cloud</category></item><item><title>Microsoft MVP, Third Time’s a Charm</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/04/01/microsoft-mvp-third-time-s-a-charm.aspx</link><pubDate>Sat, 02 Apr 2011 02:56:31 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:815731</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=815731</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2011/04/01/microsoft-mvp-third-time-s-a-charm.aspx#comments</comments><description>&lt;p&gt;I just received my renomination letter for the &lt;a href="http://www.microsoft.com/communities/mvp/mvp.mspx"&gt;Microsoft MVP award&lt;/a&gt; for Visual C#, 2011. This is the third year in a row, and what a blast these years have been!&lt;/p&gt;  &lt;p&gt;I firmly believe that 2011 could be an amazing year for C#; what with the introduction of &lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2011/03/21/sdp-2011-wrapping-up-and-session-materials.aspx"&gt;async methods in C# 5&lt;/a&gt;, which is a clear demonstration of how frameworks and fluent interfaces pale in comparison to the convenience and power of language keywords.&lt;/p&gt;  &lt;p&gt;This time I am humbly receiving the MVP award as the CTO of &lt;a href="http://selagroup.com/"&gt;Sela Group&lt;/a&gt;, where I am constantly amazed by the number and talent of technical folks who are taking us to new challenges in Israel and abroad. So in conclusion, I’d like to thank some good friends and colleagues:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;David Bassa and Ishai Ram, my managers and friends at Sela, who work with me at easy times and hard, and let me pursue whatever direction I consider important at the time;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bursteg"&gt;Guy Burstein&lt;/a&gt;, who leads the local Microsoft community by example and continues to be, after a few years with DPE, a role model of a technical evangelist;&lt;/li&gt;    &lt;li&gt;My colleagues, &lt;a href="http://www.sela.co.il/s/sdp/_new/speakers.html"&gt;Sela’s top technical experts&lt;/a&gt;—too numerous to list here, who never fail to surprise with yet another area of expertise and yet another great answer.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Finally, to my readers—thanks, and stay tuned for 2011, 2012, and many more years to come :-)&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=815731" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category></item><item><title>I’m a Microsoft MVP (again)!</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2010/04/01/i-m-a-microsoft-mvp-again.aspx</link><pubDate>Thu, 01 Apr 2010 22:24:04 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:571927</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=571927</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2010/04/01/i-m-a-microsoft-mvp-again.aspx#comments</comments><description>&lt;p&gt;I just received a letter notifying me that I was awarded the &lt;a href="http://www.microsoft.com/communities/mvp/mvp.mspx"&gt;Microsoft MVP&lt;/a&gt; award for Visual C# for 2010. I’m very honored to receive the award (&lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2009/04/01/i-m-a-microsoft-mvp.aspx"&gt;the second time&lt;/a&gt;). Here’s to hoping that 2010 will be a good year for C# and anything else technological that I’ve been talking about on this blog, in online communities, at UG meetings, and at various conferences!&lt;/p&gt;  &lt;p&gt;I would never have made it without the help and support of several people I would like to call out here, as well as many friends and colleagues not listed here:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;David Bassa, Erez Fliess, and Ishai Ram, my managers and friends at Sela whose endless patience, support, and willingness to cooperate with my craziness have been vital to my overall happiness and my technical achievements;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/alon"&gt;Alon Fliess&lt;/a&gt;, who continues to be my role model as a technical leader, CTO, well-rounded guru, and good friend;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/bursteg"&gt;Guy Burstein&lt;/a&gt;, a good friend from Microsoft who kept the Israeli developer community alive and kicking during the past few (difficult) years, and who is constantly coming up with great new ways to involve more and more developers in online and offline activities.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And last but not least, thank you, dear readers, for following me during the last year and for your emails and comments.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=571927" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category></item><item><title>Beware of Evil Wizards</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2010/01/09/beware-of-evil-wizards.aspx</link><pubDate>Sat, 09 Jan 2010 23:18:37 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:491561</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=491561</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2010/01/09/beware-of-evil-wizards.aspx#comments</comments><description>&lt;p&gt;Ten years ago, Andrew Hunt and David Thomas published the incredible book, &lt;a href="http://pragprog.com/the-pragmatic-programmer"&gt;“The Pragmatic Programmer: From Journeyman to Master”&lt;/a&gt;. It’s not that I like this book because it has taught me so many things; I mainly like this book because of what it has &lt;em&gt;not&lt;/em&gt; taught me.&lt;/p&gt;  &lt;p&gt;And one thing this book has &lt;em&gt;not&lt;/em&gt; taught me is to use Add New Item –&amp;gt; “Some Amazing Technology” Class Template and then just adjust the grid on the control ever so slightly, and bam – there’s your user interface in all its glory.&lt;/p&gt;  &lt;p&gt;Here’s what “The Pragmatic Programmer” has to say about it:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[…] Tool makers and infrastructure vendors have come up with a magic bullet, the wizard. Wizards are great. […] But using a wizard designed by a guru does not automatically make Joe developer equally expert. […] Don’t Use Wizard Code You Don’t Fully Understand.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Why is that that we developers should not rely on wizard-generated code, but it’s OK for us to rely on the operating system’s code or on the .NET Framework’s code?&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[…] We’d feel the same about wizards if they were simply a set of library calls […] that developers could rely on. But they’re not. Wizards generate code that becomes an integral part of Joe’s application. […] Eventually, it stops being the wizard’s code and starts being Joe’s.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It’s funny how these words never ceased to be true. Despite the ten-year-old warning against Evil Wizards, code generation inside the development environment has become an increasingly popular technique, and not just for spiffy user interface generation. Here are two wizards I use all the time, in Visual Studio:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Adding a WCF service reference generates a whole bunch of proxy code into your project, and not just the bare minimum service contracts and data contracts that you would otherwise write by hand; &lt;/li&gt;    &lt;li&gt;Dragging a table across a LINQ to SQL design surface generates a strongly-typed data context, an entity class for each table, relationships between entities, identity constraints and whatnot. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ten years after “The Pragmatic Programmer”, I’m not saying that you should stop using the Visual Studio wizards to generate code for you. But if you don’t understand the code generated by the wizard even though you’re using and adapting it to your needs, you’re in for some great trouble. (Unfortunately, presenters at conferences and class teachers are often guilty of spreading the trouble.&lt;strong&gt;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;/strong&gt;)&lt;/p&gt;  &lt;p&gt;The telling sign is this: &lt;strong&gt;If a technology were easy enough so that you didn’t have to thoroughly learn it before applying it, why would there be a wizard for generating code associated with that technology?&lt;/strong&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;*&lt;/font&gt; &lt;/strong&gt;The most unfortunate thing is that sometimes even we, the public speakers who show other people the power of those Evil Wizards, don’t fully understand the code being generated by them. I had the chance to witness, time and again, a presenter showing a bunch of code effected by a simple click of a button, and when something goes wrong the only resort seems to be to regenerate the whole code from scratch. Is this something you would recommend to your fellow developers?&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=491561" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category></item><item><title>What Gets Me Through the PDC: Conference Gear</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2009/11/18/what-gets-me-through-the-pdc-conference-gear.aspx</link><pubDate>Wed, 18 Nov 2009 07:30:43 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:447181</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=447181</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2009/11/18/what-gets-me-through-the-pdc-conference-gear.aspx#comments</comments><description>&lt;p&gt;What does every geek need to get through the PDC, or any technological conference for that matter? I have the simple answer that works for me and that you might be interested in :-)&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" border="0" align="left" src="http://www.rcbestseller.com/catalog/images/Dell/Latitude/LatitudeXT/LatitudeXT_01.jpg" width="98" height="82" alt="" /&gt;First and foremost, I need a laptop. It has to be lightweight but usable, so a high-end netbook could do it but a mid-range notebook does a better job. My choice for this conference was the &lt;a href="http://www.google.com/url?q=http://www.dell.com/us/en/business/notebooks/latit_xt/pd.aspx%3Frefid%3Dlatit_xt%26cs%3D04%26s%3Dbsd&amp;amp;ei=-T8DS63XDpSCswPrxuDNDg&amp;amp;sa=X&amp;amp;oi=nshc&amp;amp;resnum=1&amp;amp;ct=result&amp;amp;cd=1&amp;amp;ved=0CB4QzgQoAA&amp;amp;usg=AFQjCNFmIYLj7Gc7ew7A5--Fd_HYCOCTsg"&gt;Dell Latitude XT&lt;/a&gt;, a multitouch 12.1” laptop that served me well for Windows 7 courses and demos in the past. It has a decent form factor, isn’t too heavy, and its battery can last the few hours if I lose the occasional fight-for-an-outlet.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" border="0" align="left" src="http://bixnet.net/images/Bat-BP133-BiX.jpg" width="81" height="63" alt="" /&gt;Next, if I have to get through an entire day without a charge, I need an external battery. Laptop replacement batteries are OK but you need to hibernate which takes a lot of time, and you need to carry them around and charge them inside the laptop. Instead, I use an external battery (the EL1901) that weights just under 0.8kg, and provides my notebook with well over 8 additional hours of battery time.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/sasha/image_5A842458.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="image" border="0" alt="image" align="left" src="http://blogs.microsoft.co.il/blogs/sasha/image_thumb_124642AF.png" width="40" height="63" /&gt;&lt;/a&gt; I couldn’t imagine walking around with the laptop and external battery and the laptop charger and all the other tools without a decent trolley. For the PDC, the trolley question was easily solved – my company, &lt;a href="http://www.selagroup.com"&gt;Sela&lt;/a&gt;, provided custom-tailored trolleys for the group of experts that are attending the PDC.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" border="0" align="left" src="http://ecx.images-amazon.com/images/I/51PkiYu3miL._AA260_.jpg" width="53" height="53" alt="" /&gt;When you’re coordinating a group of almost twenty experts in four rental cars, you really need the proper means of communication. Sela bought prepaid cell phones from various wireless providers so that we can all talk to each other and coordinate our activities. (A lesson learned from last year’s PDC, when there was a much smaller group of us around – and yet it was extremely difficult to keep everyone informed.)&lt;/p&gt;  &lt;p&gt;Other than that, there are the obvious: business cards, USB flash drive, a couple of USB cables, an extra charger, a power adapter, a jacket for the air-conditioned conference halls, etc.&lt;/p&gt;  &lt;p&gt;What do you carry around at conferences?&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=447181" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/PDC/default.aspx">PDC</category></item><item><title>Learning from Feedback as a Public Speaker</title><link>http://blogs.microsoft.co.il/blogs/sasha/archive/2009/10/01/learning-from-feedback-as-a-public-speaker.aspx</link><pubDate>Fri, 02 Oct 2009 02:26:37 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:416069</guid><dc:creator>Sasha Goldshtein</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/sasha/rsscomments.aspx?PostID=416069</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/sasha/archive/2009/10/01/learning-from-feedback-as-a-public-speaker.aspx#comments</comments><description>&lt;p&gt;Over the last three years, I’ve had lots of experiences as a speaker at conferences, courses, private presentations and other opportunities. Among them, I had the chance to present at the Microsoft Developers Academy, TechEd and IDCC; I taught 54 courses for Sela, including Windows Internals, .NET Debugging, .NET Performance, C++/CLI and many others; and I lectured at short half-day MSDN events on Windows 7, Windows Server 2008, performance, debugging and concurrency.&lt;/p&gt;  &lt;p&gt;Almost every training session, every course, every conference concluded with audience feedback. (If you ever filled an evaluation form for my presentation or course, thank you for your time and feedback!) I’ve been meticulously collecting this feedback for the past three years, and figured that now would be a good time to look back and share with you how you think I’ve been doing, and what I’ve been doing with this information.&lt;/p&gt;  &lt;p&gt;They say that positive feedback is all very similar; negative feedback is varied and interesting. Here are some of the things I’ve noticed during the past three years.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;“Less Code, More Theory”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is something I’ve been hearing for a long time during the first couple of years, and always wanted to work on. I guess from a certain perspective it’s just that much easier for me to focus on what I’m really good at—showing deep technical demos, writing lots of code on the stage, typing commands into the debugger, and so on. It was much harder for me to talk when I didn’t have any code or live demo to back me up.&lt;/p&gt;  &lt;p&gt;During the last year, I focused more and more on subjects such as design for concurrency, performance testing methodology and case studies, architecture of distributed system and other topics that often can’t be accompanied by a simple code demo and must be explained using hand-waving. This is certainly not my comfort zone but I’m pretty happy with the results so far, and will keep trying to get better at it.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;“Way Over My Head”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Almost every one of my conference presentations, courses, half-day sessions has been tagged level-400. Often enough it was even more hardcore than many other level-400 sessions at the same conference. So it shouldn’t be a big surprise to my audience that my lectures often require deep technical knowledge, lots of practical experience and the ability to focus on small details as well as the big pictures for a couple of hours straight (which I know is not easy—I always find it exceptionally difficult to keep myself focused on the speaker when sitting in the audience at a conference).&lt;/p&gt;  &lt;p&gt;Nonetheless, often enough I get feedback indicating that I was talking too fast, or going over too many details, or diving deep into a piece of technology and assuming it’s just familiar to everyone. This is something I do way too often. Over time I managed to create a certain distance from the subject matter of my lectures, and through this distance I understand how the audience is absorbing my presentation. Still, predicting how easy or hard it’s going to be for other people to take in a particular piece of information is something I need to work on. And after all, everyone would be much better off if I simply cut the material in half but presented it thoroughly and slowly rather than lose half of the audience half-way through the session.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;“Introduction Too Long”, or “There Wasn’t Enough Time to Talk about X”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is a piece of feedback I’ve been getting recently, and I suspect it has something to do with the way I’m handling “Less Code, More Theory”. As I gain familiarity with a subject and observe it from different angles, there’s obviously more for me to rant about in the introductory part of my sessions. For example, when speaking about concurrency and parallelism I can often find myself thirty minutes in without even mentioning a specific technology yet—I can just go on and on talking about how parallelism is vital to modern applications.&lt;/p&gt;  &lt;p&gt;On the other hand, if I make the introductions too short I’m pretty sure we’ll be getting back to “Way Over My Head” and “Less Code, More Theory”. I’ll have to see how I can incorporate this piece of feedback into my shorter presentations, where there’s little time to spend on a stretched introduction.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;“More Code / Demos, Less Slides”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I never believed I’d see this feedback on a session of mine, but apparently my efforts to get out of the live coding comfort zone might have gone a little over the edge for some folks. I know for certain that seeing 30 slides in the row is the most boring thing known to mankind, and I profoundly apologize if my storytelling skills are not up to par with the boredom-inflicting nature of a demo-less presentation. However, I also feel that sometimes &lt;em&gt;not&lt;/em&gt; focusing on a particular technology and &lt;em&gt;not&lt;/em&gt; driving the point home with a demo is more beneficial if there’s a general-purpose message to deliver.&lt;/p&gt;  &lt;p&gt;I can’t promise you that my future presentations are going to have more slides or more pictures, less code or less live demos—but I can tell you this: I greatly appreciate your feedback over these years, and I’m striving to improve with every bit of it.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=416069" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/Teaching/default.aspx">Teaching</category><category domain="http://blogs.microsoft.co.il/blogs/sasha/archive/tags/RandomThoughts/default.aspx">RandomThoughts</category></item></channel></rss>