<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>jtaby.com</title>
 
 <link href="http://jtaby.com/" />
 <updated>2012-09-11T09:23:04-07:00</updated>
 <id>http://jtaby.com/</id>
 <author>
   <name>Majd Taby</name>
   <email>mtabye@me.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/majd-taby" /><feedburner:info uri="majd-taby" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>Conquering Defeat</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/HGzciblA1y4/conquering-defeat.html" />
   <updated>2012-06-28T00:00:00-07:00</updated>
   <id>http://jtaby.com/2012/06/28/conquering-defeat</id>
   <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;introspection&lt;/strong&gt; |ˌintrəˈspekSHən|: the examination or observation of one&amp;#8217;s own mental and emotional processes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sometimes I feel like I need to limit my time interacting with technology to just the times I need to get my job done. I go through this phase every now and then where I realize that my dependency on technology may not be as strictly beneficial for me as I make myself believe.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve long held the belief that any technology is good technology. Technology is inherently good, even if it&amp;#8217;s used for bad purposes.&lt;/p&gt;
&lt;p&gt;Every now and then though, something happens that triggers a realization that life extends past the computer. It&amp;#8217;s almost sad to need to realize that, but such is the reality of dedicating your life to your work and passion. Such is also the blessing and the curse of what we do. It&amp;#8217;s kind of an ironic cycle: I am passionate about my work, so I spend a lot of time doing it, which makes me less passionate about it in the long run (burn out). For me to avoid the burn out, which is the worst outcome of passion, I have to remind myself explicitly to step aside and metaphorically (sometimes literally), and smell the roses.&lt;/p&gt;
&lt;p&gt;It might be a trip home to see your family, your parents coming to visit you, some personal issues, or some external issues. It can be a combination of those, but the end result is introspection. Introspection can be a scary and frightening thing. A lot of people spend a lot of time running away from introspection. I can relate to &lt;a href="http://www.smbc-comics.com/?id=2225"&gt;this comic&lt;/a&gt; and have referenced it a lot since first seeing it (in my work&amp;#8217;s bathroom stall):&lt;/p&gt;
&lt;p&gt;I think that comic captures something essential about our use of technology. Whenever technology becomes not a tool to get a job done, not a toy to play with, and not a passion to feed, but an excuse to run away from introspection, then it&amp;#8217;s time to re-evaluate it. Taking a long walk at night alone, sitting along on the beach, going on a solo bike ride. Solitude does not imply loneliness nor boredom. Solitude can be a time of reflection. Running away from hard decisions and tough problems doesn&amp;#8217;t solve them. In fact, it can worsen them.&lt;/p&gt;
&lt;p&gt;Part of me wants to turn this into one of my month-long goals: No Twitter or non-work-Facebook for a month. No internet for a month, etc. But I don&amp;#8217;t think that&amp;#8217;s the problem nor do I think I would get anything from it. The problem isn&amp;#8217;t technology, the problem is using technology to run away from thought.&lt;/p&gt;
&lt;p&gt;Flow (this is the third time I reference that book now) describes this in the second half of the book. People who conquer solitude, emotion, and thought are the proverbial &amp;#8220;Masters of their domain&amp;#8221;. I&amp;#8217;m only 24, I&amp;#8217;m a baby in the grand scheme of things, but I&amp;#8217;m old enough now to draw conclusions from my experiences, and one of those conclusions is: The brain can be either your biggest liability or your biggest asset. It can bring you down, and it can lift you up. The difference in my opinion is introspection. Being able to understand that what you&amp;#8217;re feeling is not reasonable. that you&amp;#8217;re emotion is unjustifiable, that you&amp;#8217;re confusion is incomprehensible is actually a really powerful concept.&lt;/p&gt;
&lt;p&gt;One of the other conclusions I&amp;#8217;ve reached is not to dwell. The instant a negative outcome is irreversible, any mental capacity spent not deconstructing it and learning from it is a wasted brain cycle. Nothing is sadder than a wasted brain cycle. This has been my indispensable tool for dealing with negative outcomes: Not getting into a college I wanted, not getting a job offer I wanted, not getting a raise I wanted, or any other life circumstance.&lt;/p&gt;
&lt;p&gt;Once you truly isolate yourself from your reality and can look at it objectively and from a third person perspective, things click and become clearer. Think about all the situations where a friend has been able to help you figure out something hard. The difference is they&amp;#8217;re isolated from the incident. Being able to do it on your own means you can do it for all the situations that are too personal to share, and at your own pace.&lt;/p&gt;
&lt;p&gt;You obviously can&amp;#8217;t control your emotions. You can&amp;#8217;t stop yourself from being happy, sad, angry, or bored. What you control is your reaction to that scenario. If you learn to tame and control your emotion, you become in control of your happiness.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/HGzciblA1y4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2012/06/28/conquering-defeat.html</feedburner:origLink></entry>
 
 <entry>
   <title>A Tale of Ten Hobbies</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/Wlx6ruDmEk4/tale-of-ten-hobbies.html" />
   <updated>2012-05-02T00:00:00-07:00</updated>
   <id>http://jtaby.com/2012/05/02/tale-of-ten-hobbies</id>
   <content type="html">&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Over the past two years, I&amp;#8217;ve been picking up hobbies left and right. I decide I want to &amp;#8220;Get into X&amp;#8221;, then buy all the gear necessary to exercise that hobby. Six weeks later, I move on and the hobby becomes a memory. Sometimes I cycle back to old hobbies, hoping to pick up a forgotten skill. As of today, the cycle includes: Figure Drawing, Cartooning, Watercoloring, Tailoring, Piano, Writing, Running, Cycling, Reading, Cooking, and Photography.&lt;/p&gt;
&lt;p&gt;When I first noticed this tendency to drop hobbies shortly after picking them up, I dismissed it as a natural consequence of my desire to diversify my life&amp;#8217;s experiences, and thus wasn&amp;#8217;t something worth fixing. The point was to keep my mind sharp and active, not to get good at a certain hobby.&lt;/p&gt;
&lt;p&gt;As I&amp;#8217;ve matured though, I&amp;#8217;ve realized that that line of logic was a cop-out I used to justify giving up. I never started a hobby expecting to drop it soon afterwards. When I do drop it, I usually do it out of boredom or frustration. Why is that? Why can&amp;#8217;t I pick something up and stick to it long-term? Is that even feasible? How would I even fit time into my day for all these hobbies? How good do I really want to get?&lt;/p&gt;
&lt;p&gt;After mulling those questions over in my head, I decided that the next time a cycle came about naturally, I&amp;#8217;ll ride it through, and I&amp;#8217;ll try to take note of what was going through my mind.&lt;/p&gt;
&lt;p&gt;Soon after, I picked up photography: Bought the camera and a lens, started shooting, and sure enough 6 weeks later, it hasn&amp;#8217;t left my desk in a week. I think I&amp;#8217;ve figured out why I drop hobbies, and I have a hunch on how to fix it.&lt;/p&gt;
&lt;h2&gt;The Realization&lt;/h2&gt;
&lt;p&gt;Given a creative activity where the output is subjective, judging progress is difficult. Compared to a non-creative activity where the result is clear and progress is obvious, it becomes much harder to find motivation to continue investing time and effort when you don&amp;#8217;t see that effort rewarded. For example, you either finish a 50 mile bike ride or you don&amp;#8217;t, you either win a game of basketball or you don&amp;#8217;t. Contrast that with judging a painting: When are you &amp;#8220;finished&amp;#8221;? How do you judge its quality?&lt;/p&gt;
&lt;p&gt;&amp;#8220;Beauty is in the eye of the beholder&amp;#8221; is another way of saying that creative works are judged against a personal criteria of taste, quality, and style. As your skill and your exposure to a domain grow, your expectations grow and your tastes develop, but your skill may not grow at the same rate. That&amp;#8217;s the case with me. Inevitably, I compare myself to the professionals who have had years of practice, and judge my amateur work against theirs.&lt;/p&gt;
&lt;p&gt;Therein lies the problem. When I started photography, merely using a high quality camera with a shallow depth-of-field was enough to meet my expectation of a &amp;#8220;good photograph&amp;#8221;. However, as I interacted with more photographers, read about photo techniques, had my work critiqued, and refined my taste in photography, I realized that my ability to execute had lagged far behind my expectation. Every photograph became a failure, every photo walk a chore.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/hobbies.jpg)"&gt;&lt;img src="/resources/hobbies.jpg"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Every hobby I&amp;#8217;ve picked up has a similar story, except for reading, writing and cycling. I think the feedback loop is so tight in those activities, that any input of effort, has a clear and obvious impact on the output.&lt;/p&gt;
&lt;p&gt;This concept isn&amp;#8217;t new. In fact, the realization came mostly from reading &amp;#8220;Flow&amp;#8221;, which I already wrote about in &lt;a href="http://jtaby.com/2012/02/02/a-moment-of-clarity.html"&gt;A Moment of Clarity in the Pursuit of Happiness&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The question remains though, what can be done to fix it?&lt;/p&gt;
&lt;h2&gt;The Solution&lt;/h2&gt;
&lt;p&gt;I don&amp;#8217;t think I can reduce my expectations. I can&amp;#8217;t unlearn what makes a good photo, painting, garment, or meal. What I can do however, is set quantifiable and achievable goals. I love cycling because I can measure my performance and compare it against my peers. The competitive challenge drives me and the data-tracking gives me feedback on my progress. Feedback is essential since it justifies my investment of time. Without the feedback, frustration and boredom kick in and I move on&lt;/p&gt;
&lt;p&gt;I can set personal challenges that let me operate at the limits of my skill for any of my hobbies. For example, instead of trying to &amp;#8220;make a good photo&amp;#8221;, I can take an existing photo that I like, and reproduce it. I can set myself a goal of reading a certain number of &amp;#8220;favorites&amp;#8221; on Flickr. I can decide that I want to make some money from my tailoring.&lt;/p&gt;
&lt;p&gt;Those are clear goals that I can work towards. Achieving a goal gives me the positive feedback I need, and increasing the challenge as my skill grow will close off the loop. Eventually, the skill will grow enough with practice to close the gap with my expectations. Until then, I need to put my expectations aside and work towards an achievable goal.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve ever struggled with the same problem, I hope this works for you, it&amp;#8217;s certainly working for me.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/Wlx6ruDmEk4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2012/05/02/tale-of-ten-hobbies.html</feedburner:origLink></entry>
 
 <entry>
   <title>Modern Web Development</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/9DjeKvNFW0I/modern-web-development-part-1.html" />
   <updated>2012-04-23T00:00:00-07:00</updated>
   <id>http://jtaby.com/2012/04/23/modern-web-development-part-1</id>
   <content type="html">&lt;p&gt;&lt;del&gt;&lt;em&gt;The blog post is the first in a series of posts that attempts to outline what a modern web development toolchain looks like and how to use the best-of-breed tools for efficient, effective development. Part two will outline how to use to set up your Terminal, zsh, and vim&lt;/em&gt;&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;The mobile landscape today is all but monopolized by WebKit, as a result, most of the tooling and infrastructure to support mobile web development on the frontend is taking place in the WebKit Inspector, so I&amp;#8217;ll focus on it, and take a deep dive into its entire feature-set and how and when to use it.&lt;/p&gt;
&lt;p&gt;Google and the Chrome team have been pumping a ton of resources into the WebKit Inspector. The changes have enabled a whole new class of complex and ambitious applications that would have otherwise collapsed on their own weight. This is great news, of course, but as I talk to more and more web developers about their process and tooling, it became clear to me that many of them haven&amp;#8217;t caught up with the changes or aren&amp;#8217;t making effective use of the tooling available. This blog post attempts to remedy that, not only by walking you through the inspector&amp;#8217;s feature set, but also highlighting certain techniques for bug hunting and feature development that I&amp;#8217;ve found to be indispensable. The post is meant to be scannable and shareable. &lt;strong&gt;You can click on any header to share a &lt;span class="caps"&gt;URL&lt;/span&gt; to a specific tip/technique or feature to your friends.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="#Before%20We%20Start%20"&gt;&lt;h2 id="Before%20We%20Start%20"&gt;Before We Start &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before we start, I want to make it clear that I don&amp;#8217;t claim to have infallible knowledge on tooling and process. If you find any of this information to be incorrect, out-of-date, or inefficient, please &lt;a href="mailto:mtaby@me.com"&gt;reach out to me&lt;/a&gt; and let me know, I&amp;#8217;d love to hear your thoughts.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re new to the inspector or have a passing knowledge of it, do me a favor and play with it as you read this post. Trying things out are the best ways to learn it! &amp;#8220;But Majd, I don&amp;#8217;t want to keep creating new files and loading them and editing them to test these things out! I have kids to feed!&amp;#8221; I hear you, and I agree with you, that&amp;#8217;s where the data: &lt;span class="caps"&gt;URL&lt;/span&gt; scheme comes in! &lt;br /&gt;
Try it out: Open a new tab of Chrome, and paste this into the address bar and hit enter:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;data:text/html,&amp;lt;b&amp;gt;ZOMG I AM BOLD!?!!?&amp;lt;/b&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;This is one of the easiest ways to get some &lt;span class="caps"&gt;HTML&lt;/span&gt; into the page and start inspecting it and playing around/investing ideas. Anything after the comma is interpreted as html and once loaded, you can open up the inspector and start playing with it!&lt;/p&gt;
&lt;p&gt;&lt;a href="#One%20Inspector%20to%20Rule%20Them%20All%20"&gt;&lt;h2 id="One%20Inspector%20to%20Rule%20Them%20All%20"&gt;One Inspector to Rule Them All &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There isn&amp;#8217;t a single WebKit Inspector. In fact, there are 5 at any given time that you can use:&lt;/p&gt;

	&lt;ol&gt;
		&lt;li&gt;Safari Stable&lt;/li&gt;
		&lt;li&gt;Chrome Stable&lt;/li&gt;
		&lt;li&gt;WebKit Nightlies&lt;/li&gt;
		&lt;li&gt;Chromium&lt;/li&gt;
		&lt;li&gt;Chrome Canary&lt;/li&gt;
	&lt;/ol&gt;&lt;p&gt;I&amp;#8217;ve tried to sort them from oldest to newest. Chrome Canary gets updated with new features all the time. After they bake for a while with the early adopters, they make their way slowly to Chromium, WebKit Nightlies, Chrome, then Safari. At any given time, Safari&amp;#8217;s Inspector is about a year&amp;#8217;s worth of development behind Chrome Canary. That is to say, use &lt;a href="http://tools.google.com/dlpage/chromesxs"&gt;Chrome Canary&lt;/a&gt; for your development.&lt;/p&gt;
&lt;p&gt;&lt;a href="#Getting%20Set%20Up%20"&gt;&lt;h2 id="Getting%20Set%20Up%20"&gt;Getting Set Up &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Awesomesauce. You&amp;#8217;ve downloaded Chrome Canary, you have it open, you have your site up, you&amp;#8217;ve cracked your knuckles and rolled up your sleeves. Hit CMD+J to open up the Inspector or right click on a specific element and click &amp;#8220;Inspect Element&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Now let&amp;#8217;s set up the environment so you&amp;#8217;re comfortable. The first thing to do is familiarize yourself with the UI. Take a minute to click on every button you see, hover over it to see the tooltip, and find out what everything does.&lt;/p&gt;
&lt;p&gt;&lt;a href="#Dock%20to%20Right%20"&gt;&lt;h4 id="Dock%20to%20Right%20"&gt;Dock to Right &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The first thing you&amp;#8217;ll want to do is click on the gear icon in the bottom right to bring up the settings. Ignoring the horrendously ugly &lt;span class="caps"&gt;HUD&lt;/span&gt; display, I highly recommend checking the &amp;#8220;Dock to Right&amp;#8221; setting. What this does is stick the inspector to the right side of your window, but keeps it attached. If you decide to pop it out into its own window, then opening multiple inspectors at the same time can become confusing. If you dock it to the bottom, you get a lot of horizontal space, but vertically you&amp;#8217;re very constricted. Docking to the right is the best of both worlds. Here&amp;#8217;s what it should look like:&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/dock_right.png)"&gt;&lt;img src="/resources/dev_techniques/dock_right.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="#Emulate%20Touch%20Events%20"&gt;&lt;h4 id="Emulate%20Touch%20Events%20"&gt;Emulate Touch Events &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re working on a mobile application, this setting (in the settings &lt;span class="caps"&gt;HUD&lt;/span&gt;) is essential.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Google, if you&amp;#8217;re listening:&lt;/strong&gt; Default the docked setting to &amp;#8220;Dock to Right&amp;#8221;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="#Keyboard%20Shortcuts%20"&gt;&lt;h4 id="Keyboard%20Shortcuts%20"&gt;Keyboard Shortcuts &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another quick tip to help speed up your work with the inspector is to get very familiar with the keyboard shortcuts. Go to the Elements Panel (some of the other panels eat the keystroke), and type &amp;#8220;?&amp;#8221;. This should bring up another horrendously ugly &lt;span class="caps"&gt;HUD&lt;/span&gt; display that contains a list of keyboard shortcuts. The most helpful shortcuts are the ones to navigate the Scripts panel, which we&amp;#8217;ll talk about in a bit.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/keyboard_shortcuts.png)"&gt;&lt;img src="/resources/dev_techniques/keyboard_shortcuts.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Google, if you&amp;#8217;re listening:&lt;/strong&gt; Make the keyboard shortcuts accessible from the settings panel. Most people don&amp;#8217;t know the secret key. While we&amp;#8217;re on the topic, why does the &lt;span class="caps"&gt;HUD&lt;/span&gt; have a different light source than the rest of the UI? Why is the border radius so big? Why is the &amp;#8220;X&amp;#8221; button not vertically centered in the header? Why are some of the shortcuts so small you can&amp;#8217;t see them?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="#Inspecting%20an%20iFrame%20"&gt;&lt;h4 id="Inspecting%20an%20iFrame%20"&gt;Inspecting an iFrame &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Debugging iFrames has long eluded web developers. NO &lt;span class="caps"&gt;MORE&lt;/span&gt;! You can now set which iframe the inspector is inspecting through the popup in the bottom center of the inspector that says &amp;#8220;&lt;top frame&gt;&amp;#8221;. This panel is interestingly only visible when you have the console expanded (hit escape from any panel).&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/iframes.png)"&gt;&lt;img src="/resources/dev_techniques/iframes.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Google, if you&amp;#8217;re listening:&lt;/strong&gt; Make the iframe drop down accessible everywhere.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="#The%20Console%20"&gt;&lt;h2 id="The%20Console%20"&gt;The Console &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sweetums. You&amp;#8217;re all set up, you&amp;#8217;ve cranked up your music, and you&amp;#8217;re hacking your heart away. Now you need to actually do something: Run a command, check the output of a function, check for the existence of a method, or see any logs/errors/warnings. This is where console comes in to help. The console is such a badass, in fact, it not only gets its own panel, it&amp;#8217;s also accessible from any other panel by hitting the &amp;#8220;&amp;gt;=&amp;#8221; icon in the bottom left, or by hitting the Escape key.&lt;/p&gt;
&lt;p&gt;It also happens to be one of the more intuitive features: Type something, hit enter, see the output of the expression. Any logs are visible chronologically, click the file name on the right and get taken there in the Scripts panel. What you may not have known though, is that you can type multi-line expressions in the console by hitting &amp;#8220;shift + enter&amp;#8221;. This is really helpful for writing out long commands that involve anonymous functions or complex statements. You can also type &amp;#8220;ctrl + L&amp;#8221; to clear the console when the logs get overwhelming.&lt;/p&gt;
&lt;p&gt;From a &lt;span class="caps"&gt;DOM&lt;/span&gt;-debugging perspective, one of the cooler features of the console is its integration with the Elements panel (which we&amp;#8217;ll discuss in the next section). Any element that&amp;#8217;s selected in the Elements panel can be quickly accessed using &amp;#8220;$0&amp;#8221;. That will reference the element and allow you to interact with it. Inversely, whenever you see a &lt;span class="caps"&gt;DOM&lt;/span&gt; node printed in the console, you can right click on it and click &amp;#8220;Reveal in Elements Panel&amp;#8221; to quickly find it in the &lt;span class="caps"&gt;DOM&lt;/span&gt;.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/reveal_in_panel.png)"&gt;&lt;img src="/resources/dev_techniques/reveal_in_panel.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Google, if you&amp;#8217;re listening:&lt;/strong&gt; Add syntax highlighting to the console command, it&amp;#8217;ll help simple parse errors. It wouldn&amp;#8217;t hurt to auto-insert braces and parenthesis and quotes, too.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="#The%20Elements%20Panel%20"&gt;&lt;h2 id="The%20Elements%20Panel%20"&gt;The Elements Panel &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So you got you&amp;#8217;re all set up and ready to start building your application. The first step is to get your &lt;span class="caps"&gt;HTML&lt;/span&gt; and your &lt;span class="caps"&gt;CSS&lt;/span&gt; looking right (Or JavaScript, depending on your workflow). That&amp;#8217;s where the Elements Panel comes in.&lt;/p&gt;
&lt;p&gt;&lt;a href="#DOM%20Manipulation%20"&gt;&lt;h4 id="DOM%20Manipulation%20"&gt;&lt;span class="caps"&gt;DOM&lt;/span&gt; Manipulation &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Elements Panel comes into play whenever you are modifying/debugging &lt;span class="caps"&gt;CSS&lt;/span&gt; or the &lt;span class="caps"&gt;DOM&lt;/span&gt;. The main area of the Elements panel is your live &lt;span class="caps"&gt;DOM&lt;/span&gt; hierarchy. As you make changes through JavaScript, you see them reflected live in the Elements Panel. You can use the arrow keys to navigate the hierarchy, and double click on any attribute to edit either the name or the value. You can also click-drag any node in the &lt;span class="caps"&gt;DOM&lt;/span&gt; to reorder it and change its position.&lt;/p&gt;
&lt;p&gt;Because its live, I find myself doing a lot of experimentation in this panel. Drag this node here, does it fix that z-index ordering issue? That div is invisible, is it being hidden by another layer?&lt;/p&gt;
&lt;p&gt;At the bottom of the inspector, you&amp;#8217;ll find a magnifying glass. When you click [that, you can hover over your application itself and it will highlight the node you have selected. This comes in handy when you need a quick way to go to a deeply-nested element.&lt;/p&gt;
&lt;p&gt;While you&amp;#8217;re playing around with the Elements panel, try right clicking on one of the nodes and see the options that come up. One of these of note, is the &amp;#8220;Break on Subtree Modifications&amp;#8221; option. When you enable that, any changes that you make to the &lt;span class="caps"&gt;DOM&lt;/span&gt; hierarchy under that node, it will automatically pause, and let you debug it.&lt;/p&gt;
&lt;p&gt;&lt;a href="#CSS%20Editing%20"&gt;&lt;h4 id="CSS%20Editing%20"&gt;&lt;span class="caps"&gt;CSS&lt;/span&gt; Editing &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Moving on to the right, the &lt;span class="caps"&gt;CSS&lt;/span&gt; editor is up-there in the list of most-helpful features of the inspector. Superficially, it allows you to live-edit your &lt;span class="caps"&gt;CSS&lt;/span&gt;. However, it reduces the barrier to experimentation so much, I find myself moving things around and playing around with ideas I normally would&amp;#8217;ve dismissed as stupid, which is a good thing, as Bret Victor &lt;a href="http://vimeo.com/36579366"&gt;says&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The first thing in the list you see is the &amp;#8220;Computed Style&amp;#8221; section. Check the &amp;#8220;Show inherited&amp;#8221; checkbox, and you will see a list of every single style property and its corresponding value that&amp;#8217;s applied to the selected node. Even if you didn&amp;#8217;t explicitly set a property, it will show you the inherited default. This helps you not only understand what is making up the styling of the node, but it also helps you find out what properties you can set yourself to modify it. Take a quick look at it and see if there are any &lt;span class="caps"&gt;CSS&lt;/span&gt; properties you didn&amp;#8217;t know about, then try them out and see what they do!&lt;/p&gt;
&lt;p&gt;Next in the list is the &amp;#8220;Styles&amp;#8221; section. This shows you the list of properties, grouped by selector, that have been applied to the node. The first sub-section here says &amp;#8220;element.style&amp;#8221;. This shows the properties set through the style=&amp;quot;&amp;quot; attribute in the &lt;span class="caps"&gt;HTML&lt;/span&gt;. The next section titled &amp;#8220;Matched &lt;span class="caps"&gt;CSS&lt;/span&gt; Rules&amp;#8221; shows you the selectors that matched the selected node, their properties, and their values, along with the file name and the line number on the right.&lt;/p&gt;
&lt;p&gt;To add a new selector, click the &amp;#8220;+&amp;#8221; button to the right of the &amp;#8220;Styles&amp;#8221; header, here you can define the selector, hit tab, then start writing properties and values. You&amp;#8217;ll notice Chrome offer auto-complete suggestions (this is another great way to investigate which properties you can set). The version of Canary as of this writing requires you to hit the right arrow key to fill in the autocompletion, then you can hit tab to set the value. Hitting tab again will let you set the next property. If you wanted to set a new property to an existing selector, click once on the closing bracket. Clicking on the button to the right of the &amp;#8220;+&amp;#8221; new selector button will allow you to specify a pseudo selector. Handy!&lt;/p&gt;
&lt;p&gt;Colors behave slightly differently. Clicking once on a color value will toggle through a list of representations (hex, rgb, rgba, etc), and clicking on the little colored square will open up the color picker.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/css.png)"&gt;&lt;img src="/resources/dev_techniques/css.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;All this is great, but let&amp;#8217;s say you&amp;#8217;ve just spent 10 minutes editing &lt;span class="caps"&gt;CSS&lt;/span&gt;. Now what? How do you save those changes? To do that, click on the file name of the selector (or go to the file yourself in the Resources panel), then right click on the file (which will be updated to reflect those changes), and you can right click to &amp;#8220;Save As&amp;#8221; and overwrite your existing files. Personally, I find selecting the text and pasting it into my editor to be faster and less error-prone.&lt;/p&gt;
&lt;p&gt;One final node on &lt;span class="caps"&gt;CSS&lt;/span&gt; Editing: If you write a new selector (by hitting the &amp;#8220;+&amp;#8221; key), it won&amp;#8217;t persist into a file because it doesn&amp;#8217;t know which &lt;span class="caps"&gt;CSS&lt;/span&gt; file to put the selector in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Google, if you&amp;#8217;re listening:&lt;/strong&gt; Prompt me which file to put a new selector in when I create one. Also, make &amp;#8220;tab&amp;#8221; fill in the selected auto-completion. Finally, find a way to make persisting changes in &lt;span class="caps"&gt;CSS&lt;/span&gt; to my code easier. This last one is more of a high-level wish, I don&amp;#8217;t really know whether or not it&amp;#8217;s possible nor how it would work, I just want the process streamlined :P.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="#Metrics%20"&gt;&lt;h4 id="Metrics%20"&gt;Metrics &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Phew, that was a handful! Take a minute to play with all this. When you&amp;#8217;re done, let&amp;#8217;s move down to the next item in the list: Metrics. If you&amp;#8217;re not familiar with the &lt;span class="caps"&gt;CSS&lt;/span&gt; Box Model, take a minute to read &lt;a href="https://developer.mozilla.org/en/CSS/box_model"&gt;this awesome guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Metrics section basically shows you how the browser is rendering a node from the perspective of content size, padding, border, and margin. Use this tool to debug positioning/dimension problems.&lt;/p&gt;
&lt;p&gt;A nice companion tip to the Metrics panel, is that the semi-transparent blue box that overlays the selected node will actually show you the padding and the margin, so you can understand how a box is affecting the &lt;a href="http://www.brainjar.com/css/positioning/default.asp"&gt;flow&lt;/a&gt;&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/metrics.png)"&gt;&lt;img src="/resources/dev_techniques/metrics.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Blue is for content, green is for padding, and orange is for margin.&lt;/p&gt;
&lt;p&gt;&lt;a href="#Event%20Listeners%20"&gt;&lt;h4 id="Event%20Listeners%20"&gt;Event Listeners &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ll skip Properties and &lt;span class="caps"&gt;DOM&lt;/span&gt; Breakpoints for now. I haven&amp;#8217;t found a use for the Properties section yet, and &lt;span class="caps"&gt;DOM&lt;/span&gt; Breakpoints shows you any &amp;#8220;Break on &amp;#8230;&amp;#8221; actions you&amp;#8217;ve taken by right clicking on a node. The last section we&amp;#8217;ll talk about in the Elements panel is the Event Listeners section.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve attached any event listeners on your node (either using JavaScript or using the attribute in &lt;span class="caps"&gt;HTML&lt;/span&gt;), you&amp;#8217;ll find those listeners listed here. This comes in handy when you want to debug whether or not a listener has been properly attached to a node, and what will happen when it gets invoked.&lt;/p&gt;
&lt;p&gt;Clicking on the little funnel icon on the right allows you to see either the listeners on the selected node or in the document. This comes in handy if you have listeners attached on things you can&amp;#8217;t select in the main list (like window, document, etc).&lt;/p&gt;
&lt;p&gt;&lt;a href="#The%20Resources%20Panel%20"&gt;&lt;h2 id="The%20Resources%20Panel%20"&gt;The Resources Panel &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Your &lt;span class="caps"&gt;HTML&lt;/span&gt; and &lt;span class="caps"&gt;CSS&lt;/span&gt; are looking good, and you&amp;#8217;ve got a fair bit of JavaScript written to use either the FileSystem &lt;span class="caps"&gt;API&lt;/span&gt;, IndexedDB, LocalStorage, App Cache, or Cookies. The Resources panel is where you go to inspect and debug all these storage resources. Most of them do more or less the the same thing and are pretty self-explanatory: Click a resources, see a list of items, and dig through to navigate your data.&lt;/p&gt;
&lt;p&gt;Of note is the first item in the list called &amp;#8220;Frames&amp;#8221;. It includes a sub-item for every frame in your application, and groups resources such as Images, Scripts, and Stylesheets. Really the only reasons I&amp;#8217;ve found to dig through this list is to find a Stylesheet file I edited so I can copy its content and paste it into my editor to save.&lt;/p&gt;
&lt;p&gt;&lt;a href="#The%20Network%20Panel%20"&gt;&lt;h2 id="The%20Network%20Panel%20"&gt;The Network Panel &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Network Panel comes in handy when you&amp;#8217;re debugging, well, network issues. Is your image asset not updating? The network panel will tell you whether or not it&amp;#8217;s being served from a cache. Is your &lt;span class="caps"&gt;XHR&lt;/span&gt; not responding? The network panel will tell you if it&amp;#8217;s stuck or error-ing out.&lt;/p&gt;
&lt;p&gt;Clicking the &amp;#8220;Record&amp;#8221; button (the black circle) will maintain a Network session across reloads, handy if you want to see how a change in your codebase affects the network performance.&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/waterfall.png)"&gt;&lt;img src="/resources/dev_techniques/waterfall.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you find yourself debugging performance issues, the Network Panel is also very helpful. On the right, you see a &amp;#8220;cascading waterfall&amp;#8221; of your network requests. If your page is taking a really long time to load, your first step in debugging it would be to look at the waterfall. The blue and red vertical lines show you when the DOMContentLoaded event fired, which means that before then, your use is sitting around waiting for something to happen. You want to reduce that time as much as you can.&lt;/p&gt;
&lt;p&gt;&lt;a href="#The%20Waterfall%20"&gt;&lt;h4 id="The%20Waterfall%20"&gt;The Waterfall &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Why do I keep calling it a waterfall, you ask? Well, it looks like one, but more importantly, the reason it looks like a waterfall is because every network interaction takes time both in network latency, and in download time, and the browser can parallelize only so many of them. If your waterfall is wide, you need to go out of your way to cut &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests.&lt;/p&gt;
&lt;p&gt;By the way, you can click on the &amp;#8220;Timeline&amp;#8221; header and you get a drop down (!) to change the sort order. Particularly interesting is the &amp;#8220;Latency&amp;#8221; sorting, which shows you which of your requests took the longest to establish.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/latency.png)"&gt;&lt;img src="/resources/dev_techniques/latency.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The half-transparent left-side of the capsule shows the latency, and the dark part on the right shows the download time.&lt;/p&gt;
&lt;p&gt;&lt;a href="#The%20Request%20Details%20"&gt;&lt;h4 id="The%20Request%20Details%20"&gt;The Request Details &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On the bottom of the Network panel, click &amp;#8220;&lt;span class="caps"&gt;XHR&lt;/span&gt;&amp;#8221; to filter the network connections just to XMLHttpRequests. Then click one of them. You see that the right side now changes to show details of that specific request. The first tab shows you all the &lt;span class="caps"&gt;HTTP&lt;/span&gt; Headers sent with the request, and those of the response. This helps when debugging server bugs or &lt;span class="caps"&gt;CORS&lt;/span&gt; bugs.&lt;/p&gt;
&lt;p&gt;Preview is a pretty-formatted version of Response. If you&amp;#8217;re getting back a lot of &lt;span class="caps"&gt;JSON&lt;/span&gt;, the Preview tab will format it into a collapsable list for you, whereas the Response tab will show it in plain text.&lt;/p&gt;
&lt;p&gt;Cookies show you the cookies that were sent as part of the request, and Timing shows more details regarding the time profile of the request. Again, helpful if you have requests taking a long time.&lt;/p&gt;
&lt;p&gt;&lt;a href="#The%20Scripts%20Panel%20"&gt;&lt;h2 id="The%20Scripts%20Panel%20"&gt;The Scripts Panel &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m a full-time JavaScript developer, which implies that I spend most of my day in the Scripts Panel. It has also seen some of the biggest changes recently.&lt;/p&gt;
&lt;p&gt;Looking around, two buttons worth mentioning are the &amp;#8220;Pretty Print&amp;#8221; button (looks like a pair of curly braces), which will properly format a minified file. This comes in handy if you get a bug in a third-party minified package and you want to have an even remote chance of figuring out what is going on.&lt;/p&gt;
&lt;p&gt;The other button worth mentioning is the &amp;#8220;Break on Exception&amp;#8221; button (Looks like a pause button). When gray, it&amp;#8217;s disabled. Clicking it once will cause your script to pause if it hits any thrown exception. Clicking it again puts it in the &amp;#8220;Break on Uncaught Exception&amp;#8221; mode, which only pauses your script if you (or something else you use), throw an exception that doesn&amp;#8217;t get caught. This is indispensable when you want to track an exception that&amp;#8217;s being thrown, since it preserves the call stack and the current state of the application.&lt;/p&gt;
&lt;p&gt;&lt;a href="#File%20navigation%20"&gt;&lt;h4 id="File%20navigation%20"&gt;File navigation &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The addition of tabs in the main workspace and a full file browser, scoped by origin has dramatically improved the efficiency of moving around your project.&lt;/p&gt;
&lt;p&gt;To open the file browser, click the weird icon in the top left (it looks like two folders with a right angle between them). By default, the file browser will &amp;#8220;float&amp;#8221; on top of your workspace, so click the weird icon on the top right of the browser (it looks like a half-white, half-black rectangle) to dock it. Try typing while you&amp;#8217;re in the file inspector, it will do a fuzzy-match of the files in your project!&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/file_browser.png)"&gt;&lt;img src="/resources/dev_techniques/file_browser.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;While we&amp;#8217;re on the topic of moving around your project, try hitting &amp;#8220;CMD+O&amp;#8221;, this will open up a TextMate-style &amp;#8220;Go-to-File&amp;#8221; popover that lets you quickly jump to a file. &amp;#8220;&lt;span class="caps"&gt;CMD&lt;/span&gt; + Shift+ O&amp;#8221; will open up a &amp;#8220;Go-to-Symbol&amp;#8221; popover that lets you quickly jump to a symbol in the current file, and &amp;#8220;&lt;span class="caps"&gt;CMD&lt;/span&gt; + L&amp;#8221; will let you jump to a specific line.&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/gotofile.png)"&gt;&lt;img src="/resources/dev_techniques/gotofile.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Google, if you&amp;#8217;re listening:&lt;/strong&gt; Add the path to the file in the Go-to-File popover, in case there are duplicates.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="#Breakpoints%20"&gt;&lt;h4 id="Breakpoints%20"&gt;Breakpoints &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clicking on a line number in the gutter will insert a breakpoint. If your application hits that line during execution, it&amp;#8217;ll pause, bring up the Scripts panel, and highlight that line. Then you can inspect the call stack, the scope variables, and inspect/modify your objects. This is the main workflow when debugging issues with your JavaScript.&lt;/p&gt;
&lt;p&gt;Occasionally, you&amp;#8217;ll want to debug a problem in hot code (code that gets run over and over). Putting a breakpoint here becomes tedious, since you&amp;#8217;d have to hit &amp;#8220;Continue&amp;#8221; over and over. What I usually do in that situation is wrap the function call I want to debug with &amp;#8220;window.foo = true&amp;#8221; and &amp;#8220;window.foo = false&amp;#8221;, then right click on the breakpoint, click on &amp;#8220;Edit Breakpoint&amp;#8221;, then in the textfield I type &amp;#8220;window.foo&amp;#8221;. What this tells the inspector is that unless window.foo evaluates to true, don&amp;#8217;t stop.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/edit_breakpoint.png)"&gt;&lt;img src="/resources/dev_techniques/edit_breakpoint.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So, you&amp;#8217;ve added a breakpoint, you refreshed the page, and now your script is paused. Now, the fun begins.&lt;/p&gt;
&lt;p&gt;The first thing of interest in the sidebar is &amp;#8220;Watched Expressions&amp;#8221;. If you care about the value of some expression (Say &amp;#8220;MyApp.someController.property === &amp;#8216;some value&amp;#8217;&amp;#8221;), then adding that as a watch expression will let you keep an eye on it without having to type it over and over in the console.&lt;/p&gt;
&lt;p&gt;Below that, the &amp;#8220;Call Stack&amp;#8221; section shows you every function call that the system went through to end up where it did. You can navigate this list using &amp;#8220;&lt;span class="caps"&gt;CTRL&lt;/span&gt; + .&amp;#8221; to go down and &amp;#8220;&lt;span class="caps"&gt;CTRL&lt;/span&gt; + ,&amp;#8221; to go up in the stack. I usually navigate this list when I care about how a variable came to have its value and how it traveled through the system.&lt;/p&gt;
&lt;p&gt;Next, &amp;#8220;Scope Variables&amp;#8221; lists the local variables and their variables. If you&amp;#8217;re using closures to close over variables, then those will be grouped together. The &amp;#8220;Global&amp;#8221; group shows you every variable on the &amp;#8220;window&amp;#8221; object (a huge list). As you move through a function, this list gets updated automatically.&lt;/p&gt;
&lt;p&gt;Now that you&amp;#8217;ve inspected the state of the app on a breakpoint, you&amp;#8217;ll probably want to move around. &amp;#8220;Continue&amp;#8221;, &amp;#8220;Step Over&amp;#8221;, &amp;#8220;Step Into&amp;#8221;, and &amp;#8220;Step Out&amp;#8221; are your friends here. In fact, you&amp;#8217;ll be using them so frequently, it&amp;#8217;s worth bringing up the keyboard shortcut list again and learning the shortcuts for them. It&amp;#8217;s much more efficient to navigate through the list with the keyboard than the mouse. If you&amp;#8217;ve used a debugger before, these terms are already familiar to you. For the web developer though, these are new concepts that we didn&amp;#8217;t have before.&lt;/p&gt;
&lt;p&gt;Continue resumes the execution of the program. If execution hits the same breakpoint again, it&amp;#8217;ll pause again. Step over will skip function invocations and stay within the current function. Step into will enter the new function if it&amp;#8217;s being called. If you&amp;#8217;re calling multiple functions in the same line, you can step into, and out of each one in order. Step Out will leave the current function and go back up one level in the call stack.&lt;/p&gt;
&lt;p&gt;These tools are essential in walking through your code and pin-pointing a bug, or finding out which path through your codebase is being followed.&lt;/p&gt;
&lt;p&gt;Another handy tool lives under the &amp;#8220;&lt;span class="caps"&gt;XHR&lt;/span&gt; Breakpoints&amp;#8221; section. As the name suggests, it sets up breakpoints related to XMLHttpRequest objects. The way you specify the breakpoint, is by typing in a substring of the &lt;span class="caps"&gt;URL&lt;/span&gt; you want to inspect. Handy!&lt;/p&gt;
&lt;p&gt;By the way, in the &amp;#8220;Scope Variables&amp;#8221; section, you can right click on a function and choose &amp;#8220;Jump to Definition&amp;#8221; to jump to the part of the file that defines that function.&lt;/p&gt;
&lt;p&gt;&lt;a href="#The%20Timeline%20Panel%20"&gt;&lt;h2 id="The%20Timeline%20Panel%20"&gt;The Timeline Panel &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Next in the list is the Timeline Panel. As you might have observed, each panel is designed to help debug a certain class of problems: Elements Panel for &lt;span class="caps"&gt;DOM&lt;/span&gt; and &lt;span class="caps"&gt;CSS&lt;/span&gt;, Resources for local storage and assets, Network for &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests, Scripts for Javascript, and Timeline is for browser performance.&lt;/p&gt;
&lt;p&gt;What do I mean by &amp;#8220;browser performance&amp;#8221;? I&amp;#8217;m referring to things that are generally out of your control, but which affect the performance of your application. Understanding what&amp;#8217;s happening under the hood is essential to supporting the growing complexity of an application.&lt;/p&gt;
&lt;p&gt;&lt;a href="#Timelines%20"&gt;&lt;h4 id="Timelines%20"&gt;Timelines &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The first section of interest is the Timelines section. To activate it, hit the Record button (the black circle in the bottom left of the panel). When it&amp;#8217;s glowing red, perform a task in your application you like to inspect. If you&amp;#8217;re wondering why your scrolling performance is slow, you would try a short scroll. If you&amp;#8217;re wondering why loading a modal panel is slow, you would do that. Don&amp;#8217;t worry about doing too much and getting overloaded by data in the panel, there are tools to help!&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/timelines.png)"&gt;&lt;img src="/resources/dev_techniques/timelines.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So, you&amp;#8217;ve managed to get a nice little timeline of what&amp;#8217;s happening, but you&amp;#8217;re only interested in a little section of the data. To &amp;#8220;Zoom in&amp;#8221;, you can click and drag on the timeline graph. You&amp;#8217;ll see a couple of draggable thumbs so you can adjust the visible section. Moving down into the waterfall graph, you&amp;#8217;ll notice little arrows next to some of the orange capsules. Expand those, and what you&amp;#8217;ll see is the function invocation that triggered the browser to do work. In the example below, we can see that a scroll event had fired, invoked a handler, which caused a &amp;#8220;Recalculate Style&amp;#8221; to fire. If you hover over the item in the sidebar, you see even more detail.&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/inspect_timeline.png)"&gt;&lt;img src="/resources/dev_techniques/inspect_timeline.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;You may be wondering at this point &amp;#8220;What are these purple events that are taking up time? Repaint, Recalculate Style, and Layout?&amp;#8221;. These are browser-events that are usually invoked by in response to visual changes. For example, If your resize or scroll, the browser needs to do a bunch of work to make sure everything looks as you&amp;#8217;d expect it to. You could also invoke these events yourself, so it&amp;#8217;s worth understanding what the inspector is telling you and not taking &lt;span class="caps"&gt;DOM&lt;/span&gt; changes for granted.&lt;/p&gt;
&lt;p&gt;&lt;a href="#Recalculate%20Style%20"&gt;&lt;h4 id="Recalculate%20Style%20"&gt;Recalculate Style &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/recalc_style.png)"&gt;&lt;img src="/resources/dev_techniques/recalc_style.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This occurs when you modify &lt;span class="caps"&gt;CSS&lt;/span&gt; properties. In the above screenshot, you see I&amp;#8217;m running the same command twice, but seeing different results. The first time I run it, the browser has to Recalculate Style, Layout, and Paint. The next time, it just has to Recalculate style. What&amp;#8217;s happening?&lt;/p&gt;
&lt;p&gt;Because this is on a fresh page load with nothing visible, giving an unstyle div a height causes its contents to change layout (Layout), causes the visual display to change (Paint), and invalidates the styles (Recalculate Style). The next time I run the same command with the same value, it gets to skip the Paint and the Layout, since they didn&amp;#8217;t change. Notice the order: Recalculate Style informs the later processes whether or not they need to get triggered.&lt;/p&gt;
&lt;p&gt;&lt;a href="#Repaint%20"&gt;&lt;h4 id="Repaint%20"&gt;Repaint &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Back to our empty page, let&amp;#8217;s give our div a width, height, and background color so it actually changes visibly on the screen:&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/repaint.png)"&gt;&lt;img src="/resources/dev_techniques/repaint.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Now, it has to repaint both times, but it only needs to calculate layout once. That&amp;#8217;s because the Recalculate Style step found that the positioning/dimensions haven&amp;#8217;t changed, but the background has, so it skipped that step. Anything that cause a visual change, causes a repaint.&lt;/p&gt;
&lt;p&gt;&lt;a href="#Layout%20"&gt;&lt;h4 id="Layout%20"&gt;Layout &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Often referred to as &amp;#8220;Reflows&amp;#8221;, a Layout event causes the browser to recalculate the position of elements. For example, say you have a picture that&amp;#8217;s floated, so the text wraps around it. If you remove the float, the browser has to &amp;#8220;re-flow&amp;#8221; the text around it. Paul Irish has a &lt;a href="http://paulirish.com/2011/dom-html5-css3-performance/"&gt;great video&lt;/a&gt; where he describes reflows and how to avoid them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Google, if you&amp;#8217;re listening:&lt;/strong&gt; Please fix the resize behavior. On small Macbook Air screen, it&amp;#8217;s common to hit multiple UI bugs when you arrange the inspector/application side by side.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/layout.png)"&gt;&lt;img src="/resources/dev_techniques/layout.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For more detail on how this works under the hood, refer to this &lt;a href="http://www.phpied.com/rendering-repaint-reflowrelayout-restyle/"&gt;blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="#Memory%20"&gt;&lt;h4 id="Memory%20"&gt;Memory &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now we&amp;#8217;ve looked at the timeline, optimized it, but the application is still crashing every now and then after you use it for a while, sometimes it slows down, and it stutters a lot. You&amp;#8217;ve seen a few &amp;#8220;GC&amp;#8221; (Stands for Garbage Collection, which runs every now and then to clean up unused objects) events in your timeline, the Memory tool helps you debug those issues.&lt;/p&gt;
&lt;p&gt;Tony Gentilcore has a great &lt;a href="http://gent.ilcore.com/2011/08/finding-memory-leaks.html"&gt;writeup&lt;/a&gt; on finding and fixing memory leaks, you should definitely give it a read. I&amp;#8217;ll give you a quick overview here.&lt;/p&gt;
&lt;p&gt;Click on Memory in the sidebar, then click record. Perform a task in your app, and observe the memory profile. Here&amp;#8217;s the memory profile for an app that simply creates an object and throws it away every mousemove event:&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/memory.png)"&gt;&lt;img src="/resources/dev_techniques/memory.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;A typical javascript memory graph looks like a sawtooth function: You keep accumulating memory until the garbage collector runs and cleans up unused memory. A few cycles through GC runs, and your memory profile should be flat. If it&amp;#8217;s constantly going up in between GC cycles, then you have a memory leak. As your application gobbles up memory, the app will slow down, and certain browsers (MobileSafari) will actually kill it.&lt;/p&gt;
&lt;p&gt;Below the graph you&amp;#8217;ll see some more useful metrics to track the number of &lt;span class="caps"&gt;DOM&lt;/span&gt; nodes, and event listeners, they&amp;#8217;re pretty self-explanatory.&lt;/p&gt;
&lt;p&gt;Finally, let&amp;#8217;s say you deployed your app in production, you found a bug in production, located it in the inspector. How do you tell your coworker/developer? Well, instead of taking a static screenshot, you can actually right click on &amp;#8220;Timelines&amp;#8221; and &amp;#8220;Memory&amp;#8221;, and save your session so that you can share the actual debug data! Handy when you&amp;#8217;re working as part of a team.&lt;/p&gt;
&lt;p&gt;&lt;a href="#The%20Profiles%20Panel%20"&gt;&lt;h2 id="The%20Profiles%20Panel%20"&gt;The Profiles Panel &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, you&amp;#8217;re now at a point in your application&amp;#8217;s development where it looks the way you want it to look, &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests are minimized, and you&amp;#8217;re causing the browser to do more work than it needs to. Something&amp;#8217;s not right though. Everything seems to be snappy, except for one small part. You&amp;#8217;ve tried debugging it with the Timeline panel, but it doesn&amp;#8217;t give you enough depth and detail. It&amp;#8217;s not the browser that&amp;#8217;s slow, it&amp;#8217;s your own code.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s where the Profiles panel comes in.&lt;/p&gt;
&lt;p&gt;&lt;a href="#JavaScript%20CPU%20Profiler%20"&gt;&lt;h4 id="JavaScript%20CPU%20Profiler%20"&gt;JavaScript &lt;span class="caps"&gt;CPU&lt;/span&gt; Profiler &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The first type of profiling you can do is JS &lt;span class="caps"&gt;CPU&lt;/span&gt; profile. The description outlines at a high level what it measures: What functions your app spends the most time in.&lt;/p&gt;
&lt;p&gt;Select it, then click &amp;#8220;Start&amp;#8221;. Every action you take now, will be logged until you hit the glowing red &amp;#8220;Record&amp;#8221; button to stop recording (Or click on the &amp;#8220;Stop&amp;#8221; button). Once stopped, the profiler will show you an ordered list of all the functions that had executed, and the time it spent in each. You&amp;#8217;ll probably see something like &amp;#8220;(program)&amp;#8221; at the top of your list. That&amp;#8217;s webkit taking time to do stuff. You can&amp;#8217;t inspect it, and you can&amp;#8217;t do much about it (but the Timelines tab should help locate some of those bugs!). Apart from that, here&amp;#8217;s what a typical profile looks like:&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/cpu_profile.png)"&gt;&lt;img src="/resources/dev_techniques/cpu_profile.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This is the profile for my blog when I open the photo portfolio and open/close a photo a few times. Looks like the most expensive part of that interaction is setting the curtain&amp;#8217;s opacity and retrieving the bounding client rect. Just the info I needed to optimize that part of my app.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Google, if you&amp;#8217;re listening:&lt;/strong&gt; There&amp;#8217;s a lot of work you can do here to surface useful information and hide useless information. I often get stuck in infinitely-deep lists, or 99.99% of my time spent in (Program), distorting everything else.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="#CSS%20Selector%20Profiler%20"&gt;&lt;h4 id="CSS%20Selector%20Profiler%20"&gt;&lt;span class="caps"&gt;CSS&lt;/span&gt; Selector Profiler &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;CSS&lt;/span&gt; doesn&amp;#8217;t come for free. Complex stylesheets take time to parse, calculate, and apply. The &lt;span class="caps"&gt;CSS&lt;/span&gt; Selector profiler shows you how many times each selector was matched to a &lt;span class="caps"&gt;DOM&lt;/span&gt; node, and how long the browser spends applying those selectors. In a complex application with many divs of the same type, applying styles to them might take a substantial amount of your app&amp;#8217;s startup time.&lt;/p&gt;
&lt;p&gt;&lt;a href="#Heap%20Snapshot%20"&gt;&lt;h4 id="Heap%20Snapshot%20"&gt;Heap Snapshot &lt;/h4&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is one of the most obtuse views in the inspector. So much so, I haven&amp;#8217;t actually found it useful. Take this for example:&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/dev_techniques/heap_snapshot.png)"&gt;&lt;img src="/resources/dev_techniques/heap_snapshot.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The amount of useful information there as far as I can discern is zero. I&amp;#8217;ll defer once more to Tony Gentilcore&amp;#8217;s &lt;a href="http://gent.ilcore.com/2011/08/finding-memory-leaks.html"&gt;writeup&lt;/a&gt;, may he light your way.&lt;/p&gt;
&lt;p&gt;&lt;a href="#The%20Audits%20Panel%20"&gt;&lt;h2 id="The%20Audits%20Panel%20"&gt;The Audits Panel &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re almost there! The last panel is the Audits Panel, and it&amp;#8217;s basically the last sanity-check of performance you do before going to production. Essentially, it will inspect the resources and the &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests and suggests improvements based on current industry best practices. For example, while writing this, running the Audits panel told me that I should specify the image dimensions in the &lt;span class="caps"&gt;HTML&lt;/span&gt; to make layout faster. Good to know!&lt;/p&gt;
&lt;p&gt;All the tips here are well-documented, and you should at least take a quick look through them.&lt;/p&gt;
&lt;p&gt;&lt;a href="#Conclusion%20"&gt;&lt;h2 id="Conclusion%20"&gt;Conclusion &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I hope you&amp;#8217;ve found at least some of this information useful. I&amp;#8217;ve been writing complex web applications on the desktop and mobile for 2 years now, and I&amp;#8217;ve had to use each of these panels to solve a different class of problems.&lt;/p&gt;
&lt;p&gt;If I&amp;#8217;ve mis-interpreted something, missed something, or made any errors, please let me know.&lt;/p&gt;
&lt;p&gt;&lt;a href="#Further%20Reading%20"&gt;&lt;h2 id="Further%20Reading%20"&gt;Further Reading &lt;/h2&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/"&gt;How Browsers Work&lt;/a&gt; – A Fantastic, and in-depth look at the processes and plumbing that we build on.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.mozilla.org/en/docs"&gt;The Mozilla Developer Network Documentation&lt;/a&gt; – The most authoritative and up-to-date reference and guided documentation &lt;span class="caps"&gt;HTML&lt;/span&gt;, &lt;span class="caps"&gt;CSS&lt;/span&gt;, and JavaScript. Ignore &lt;a href="http://w3fools.com/"&gt;w3schools&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/9DjeKvNFW0I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2012/04/23/modern-web-development-part-1.html</feedburner:origLink></entry>
 
 <entry>
   <title>Perfect</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/BRRXrvR-LKw/perfect.html" />
   <updated>2012-04-21T00:00:00-07:00</updated>
   <id>http://jtaby.com/2012/04/21/perfect</id>
   <content type="html">&lt;p&gt;I&amp;#8217;ve been having a recurring thought recently.&lt;/p&gt;
&lt;p&gt;The first time was while I was watching A Clockwork Orange when this panning shot came up:&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/perfect/clockwork.png)"&gt;&lt;img src="/resources/perfect/clockwork.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The music, visuals, the characters and storyline came together so well, and everything in the storyline was working together so well, it gave me goosebumps.&lt;/p&gt;
&lt;p&gt;The next time that happened was while watching 2001: A Space Odyssey. This shot captured the same feeling:&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/perfect/odyssey.jpeg)"&gt;&lt;img src="/resources/perfect/odyssey.jpeg"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;More recently, a string quartet was playing in the lobby at work. Four musicians moving in perfect synchronicity playing the same thing. It was beautiful.&lt;/p&gt;
&lt;p&gt;Above the individual performance though, whether it was a piece of art, a movie, or a musical performance, I realized that what I was admiring wasn&amp;#8217;t the piece itself, but everything that must have gone on behind the scenes to bring it all together. Everything complementing everything else, and everything working together. Nothing is superfluous, and everything is there to serve a purpose.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s beautiful, and it&amp;#8217;s what I try to do with my work.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s not easy though, it takes a ton of hard work and practice. It takes patience and perseverance and a self-critical eye to judge your work as you would just other people&amp;#8217;s work. To those who have achieved that kind of refinement in their work, I applaud you, and hope to meet you there at some point.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/BRRXrvR-LKw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2012/04/21/perfect.html</feedburner:origLink></entry>
 
 <entry>
   <title>A Moment of Clarity in the Pursuit of Happiness</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/MqCos564JMo/a-moment-of-clarity.html" />
   <updated>2012-02-02T00:00:00-08:00</updated>
   <id>http://jtaby.com/2012/02/02/a-moment-of-clarity</id>
   <content type="html">&lt;p&gt;My eyes squinted, my lips puckered. My palms sweaty and my heartbeat faster. The adrenaline started in my back, tingled my brain, then tickled my toes. It was a moment of clarity: A moment where something obscure suddenly made sense, a moment where the future was laid out for me, waiting for me to realize it. The most recent moment of clarity triggered this blog post.&lt;/p&gt;
&lt;p&gt;The realization is that my happiness is something that is in my control to create control, something that I can create for myself and manage. What it means and how it works, are still a little hazy for me, but the idea is there, I feel it in my bones.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve recently started reading &lt;a href="http://www.amazon.com/Flow-Psychology-Experience-Mihaly-Csikszentmihalyi/dp/0061339202"&gt;Flow&lt;/a&gt; by Mihaly Csikszentmihalyi, a book which analyzes years of research into happiness. Here&amp;#8217;s the quote that captures the thesis:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What I “discovered” was that happiness is not something that happens. It is not the result of good fortune or random chance. It is not something that money can buy or power command. It does not depend on outside events, but, rather, on how we interpret them. Happiness, in fact, is a condition that must be prepared for, cultivated, and defended privately by each person. People who learn to control inner experience will be able to determine the quality of their lives, which is as close as any of us can come to being happy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The implication being, the quality of your live (and thus, your happiness), is a choice. It&amp;#8217;s something that you decide you want, and something you create for yourself.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s another quote from an article I just recently read called &lt;a href="http://www.guardian.co.uk/lifeandstyle/2012/feb/01/top-five-regrets-of-the-dying?cat=lifeandstyle&amp;amp;type=article"&gt;Top five regrets of the dying&lt;/a&gt; that supported the same argument:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Many did not realise until the end that happiness is a choice. They had stayed stuck in old patterns and habits. The so-called &amp;#8216;comfort&amp;#8217; of familiarity overflowed into their emotions, as well as their physical lives. Fear of change had them pretending to others, and to their selves, that they were content, when deep within, they longed to laugh properly and have silliness in their life again.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Steve Jobs also shared a similar sentiment during his famed Stanford speech:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And since then, for the past 33 years, I have looked in the mirror every morning and asked myself, if today were the last day of my life, would I want to do what I am about to do today?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;#8217;m trying to internalize this concept and make it a part of who I am. My identity and my thoughts are my own to have, control, and share. Happiness is a mindset for me to create. I find this newfound control over my life comforting since it means I can stop passing the buck and sulking in any form of unhappiness.&lt;/p&gt;
&lt;p&gt;A final thought: On average, you have 78 years total to live. The first 18-20 are spent learning, which leaves 58. Spending 2 years doing something you don&amp;#8217;t enjoy is a full 3.4% of your life. What are you getting back for that investment? Money? What are you going to do with that money that will be worth the non-refundable 3.4% of your life? An extra room in your house?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/MqCos564JMo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2012/02/02/a-moment-of-clarity.html</feedburner:origLink></entry>
 
 <entry>
   <title>How Much Skill Can I Gain in 20 Hours?</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/p9UK7UyEs9o/how-much-skill-can-you-gain-in-20-hours.html" />
   <updated>2012-01-19T00:00:00-08:00</updated>
   <id>http://jtaby.com/2012/01/19/how-much-skill-can-you-gain-in-20-hours</id>
   <content type="html">&lt;p&gt;tl;dr: Try doing something you&amp;#8217;ve always wanted to do for a month. If you like it, you&amp;#8217;ll keep doing it, if not, you don&amp;#8217;t have to do it for very long.&lt;/p&gt;
&lt;h2&gt;Play a song, Tailor a pair or shorts&lt;/h2&gt;
&lt;p&gt;Starting Monday, January 23rd, and until February 24th, I will spend one hour each day either learning to play a piano piece or working on constructing a pair of shorts. I&amp;#8217;m thinking three nights on Piano, two on Tailoring.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the song I will try to learn to play:&lt;/p&gt;
&lt;center&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/oGHMfssQTEE" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;And here&amp;#8217;s the fabric I will use for the shorts:&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/skill/fabric.jpg)"&gt;&lt;img src="/resources/skill/fabric.jpg"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I took some piano lessons when I was 10, but I forgot most of what I learned. I still know the very basics of reading music, but I don&amp;#8217;t know how to apply them. I know the basics of garment construction, but I still can&amp;#8217;t put them together all the way to a final piece. I don&amp;#8217;t know if I&amp;#8217;ll be able to hit my goal, but it doesn&amp;#8217;t matter quite as much as the act of practicing something outside my core competency. If I find that I&amp;#8217;m improving, I don&amp;#8217;t have to stop in a month. A month is the minimum, not the maximum.&lt;/p&gt;
&lt;h2&gt;Why?&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;ve worked in tech in Silicon Valley for one-and-a-half years. The work is hard, the deadlines are aggressive, and the days are long. I love the challenge, I love the work, and I love the culture, but after a while, I started feeling like parts of my brain were going dormant.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m surrounded by people who excel at everything in life from unicycling to writing novels. I draw inspiration from these individuals, and I have a laundry list of activities and hobbies that I would like to be good at, but never found the time or motivation to actually follow through.&lt;/p&gt;
&lt;h2&gt;The Book&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;m reading &lt;a href="http://www.amazon.com/Talent-Code-Greatness-Born-Grown/dp/055380684X"&gt;The Talent Code&lt;/a&gt; Where the author describes the conditions and type of intentional, &amp;#8220;deep practice&amp;#8221; that breeds greatness. Here are a couple of quotes from the book:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;The trick is to choose a goal just beyond your present abilities; to target the struggle. Thrashing blindly doesn&amp;#8217;t help. Reaching does.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;People at most of the hotbeds [of talent] I visited practiced less than three hours a day. The younger Spartak kids (ages six to eight) practiced a mere three to five hours each week.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;5 hours a week, one hour each weekday, for a month. The experiment is to find out whether one hour a day is enough to meaningfully gain knowledge and skill in an area of interest.&lt;/p&gt;
&lt;p&gt;The book has jolted me into a state of restlessness and I want to capitalize on it. I&amp;#8217;ll try to describe this &amp;#8220;Do something for 30 days&amp;#8221; idea, how it has worked for me, and why you should do it as well.&lt;/p&gt;
&lt;h2&gt;The Epiphany&lt;/h2&gt;
&lt;p&gt;When I came out to San Francisco in June of 2010, I weighed 240 pounds, and lived a sedentary lifestyle. One of my coworkers convinced me to go running with him one morning. Then he got my ass out of bed early to go for another run later that week, and a couple of weeks later, I found myself looking forward for that morning run. A short conversation and a $50 wager later, I decided to commit to running 2 miles in the morning before work every day for a month.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the Nike+ graph of that month:&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/skill/runs.png)"&gt;&lt;img src="/resources/skill/runs.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class="subtext"&gt;I skipped a few days to rest, and I missed a 5 day stretch because of a trip to &lt;span class="caps"&gt;NYC&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The epiphany came after the month was done: I kept on running, increased my mileage and eventually participated in a 10 mile run during which I weighed 185 pounds.&lt;/p&gt;
&lt;p&gt;I did a similar thing a few months later: I really wanted to read. I felt like there was a lot of knowledge buried in books that I was not exposed to because of my aversion to reading. By the time 2011 was done, I had &lt;a href="http://www.goodreads.com/review/list/6454382-majd-taby?shelf=read"&gt;read 11 books&lt;/a&gt;. As I continued reading, my speed got faster, and my vocabulary grew (and I learned a lot!).&lt;/p&gt;
&lt;p&gt;The reason I&amp;#8217;m recounting this isn&amp;#8217;t to pat myself on the back, it&amp;#8217;s to highlight the fact that people are in control of their lifestyle and it&amp;#8217;s in their power and capability to completely change it. The key is to truly want to do it for yourself. If you decide to do it out of peer pressure, you&amp;#8217;re almost certain to fail. I was haggled to lose weight by my family for years, and it wasn&amp;#8217;t until I personally wanted to do it, that it happened.&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;Why a Month is the Perfect Amount of Time&lt;/h2&gt;
&lt;p&gt;This idea isn&amp;#8217;t unique, I can&amp;#8217;t remember hearing about it before I did it, but since then, I&amp;#8217;ve come across a bunch of people advocating the same thing. Here&amp;#8217;s Matt Cutts talking about the &lt;em&gt;exact&lt;/em&gt; same idea:&lt;/p&gt;
&lt;center&gt;&lt;object width="526" height="374"&gt;&lt;br /&gt;
&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;br /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;&lt;br /&gt;
&lt;param name="allowScriptAccess" value="always"/&gt;&lt;br /&gt;
&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;br /&gt;
&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt;&lt;br /&gt;
&lt;param name="flashvars" value="vu=http://video.ted.com/talk/stream/2011U/Blank/MattCutts_2011U-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/MattCutts-2011U.embed_thumbnail.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=1183&amp;lang=&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=matt_cutts_try_something_new_for_30_days;year=2011;theme=how_we_learn;event=TED2011;tag=Culture;tag=success;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;br /&gt;
&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="526" height="374" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2011U/Blank/MattCutts_2011U-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/MattCutts-2011U.embed_thumbnail.jpg&amp;vw=512&amp;vh=288&amp;ap=0&amp;ti=1183&amp;lang=&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=matt_cutts_try_something_new_for_30_days;year=2011;theme=how_we_learn;event=TED2011;tag=Culture;tag=success;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;/object&gt;&lt;/center&gt;
&lt;p&gt;He approached it from a therapeutic perspective. In hindsight, when I started my month challenges, I had just moved to a new city, was still trying to build a social circle, and was feeling a little detached. These challenges fill up your free time, give you a purpose and a goal.&lt;/p&gt;
&lt;p&gt;A month is the perfect amount of time for a couple of reasons: First, it&amp;#8217;s short enough that if you decide the challenge you embarked on is not fun, you don&amp;#8217;t have to do it for long. Secondly, it&amp;#8217;s long enough, that if you stick to it, it would form a habit.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re thinking about doing this, the rules are: It has to be something you genuinely want for yourself, and it has to be something sustainable&lt;/p&gt;
&lt;p&gt;What do you think? Has there been something you&amp;#8217;ve always wanted to do and be good at? What is it? What are you waiting for? Why aren&amp;#8217;t you doing it &lt;em&gt;today&lt;/em&gt;?&lt;/p&gt;
&lt;p class="inline-img no-highlight"&gt;&lt;img src="/resources/yc.gif" alt="" /&gt; &lt;a href="http://news.ycombinator.com/item?id=3486461"&gt;Please comment on the Hacker News thread.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/p9UK7UyEs9o" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2012/01/19/how-much-skill-can-you-gain-in-20-hours.html</feedburner:origLink></entry>
 
 <entry>
   <title>Confidence of the Mobile Web</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/nj_nY9Ay0vQ/mobile-web-confidence.html" />
   <updated>2012-01-04T00:00:00-08:00</updated>
   <id>http://jtaby.com/2012/01/04/mobile-web-confidence</id>
   <content type="html">&lt;p&gt;There seems to be a seeping Napoleon Complex among mobile web devs, it&amp;#8217;s almost like they don&amp;#8217;t want me to use their web app. I&amp;#8217;m sure a lot of developer effort went into building these comfortable, mobile-friendly alternatives to the full desktop experience, so why ruin it by putting up speed bumps between me and the content? (I&amp;#8217;ve put example of this below the text.)&lt;/p&gt;
&lt;p&gt;If I&amp;#8217;m using your mobile web app, it&amp;#8217;s because:&lt;/p&gt;

	&lt;ol&gt;
		&lt;li&gt;I&amp;#8217;m not on my own phone, and I&amp;#8217;m using a friends&amp;#8217; phone&lt;/li&gt;
		&lt;li&gt;I tapped on a link in an app&lt;/li&gt;
		&lt;li&gt;I don&amp;#8217;t want to download your app and have it take up a spot on my phone&lt;/li&gt;
		&lt;li&gt;I didn&amp;#8217;t know you had an app and I went to your website by default&lt;/li&gt;
	&lt;/ol&gt;&lt;p&gt;The first three use-cases imply that I don&amp;#8217;t have an interest in your native app, and the last use-case doesn&amp;#8217;t justify trampling on the other three. A simple banner would do. Even better, wait until a user takes an action that&amp;#8217;s only available on the native app (like uploading a photo), and &lt;em&gt;then&lt;/em&gt; prompt them to download the native app. All around, I see examples of this:&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/confidence/add_to_home.png)"&gt;&lt;img src="/resources/confidence/add_to_home.png"&gt;&lt;/div&gt;&lt;div class="image-container" style="background-image:url(/resources/confidence/download_app.png)"&gt;&lt;img src="/resources/confidence/download_app.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;As an alternative, I really like what Instagram does: A simple link that takes you to the App Store. Simple, effective, and unobtrusive.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/confidence/instagram.png)"&gt;&lt;img src="/resources/confidence/instagram.png"&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/nj_nY9Ay0vQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2012/01/04/mobile-web-confidence.html</feedburner:origLink></entry>
 
 <entry>
   <title>John Siracusa on Hypercriticism</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/f8aU3l_HPWY/hypercritical.html" />
   <updated>2012-01-03T00:00:00-08:00</updated>
   <id>http://jtaby.com/2012/01/03/hypercritical</id>
   <content type="html">&lt;p&gt;I came across a 2009 post by John Siracusa called &lt;a href="http://arstechnica.com/staff/fatbits/2009/05/hypercritical.ars"&gt;Hypercritical&lt;/a&gt; and it inspired me to share some thoughts on the subject. I, like Siracusa, live in perpetual displeasure with my work. I&amp;#8217;ve come to attribute this displeasure to the disparity between what my brain wants to create and what my hands can output. I&amp;#8217;ve heard Ira Glass tell us that the antidote is practice, so practice I do.&lt;/p&gt;
&lt;p&gt;There is a flip side of course, and it was recently summarized  by &lt;a href="http://twitter.com/can"&gt;@can&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote class="twitter-tweet tw-align-center"&gt;&lt;p&gt;It is sad that hyper-criticism passes for attention to detail and hyper-cynicism for wisdom.&lt;/p&gt;&lt;p&gt;&amp;mdash; Can Duruk (@can) &lt;a href="https://twitter.com/can/status/144331530779635712" data-datetime="2011-12-07T08:24:53+00:00"&gt;December 7, 2011&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;script src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Seems to me, the only bad criticism is one that is personal and inflammatory. Hyper-criticism is an unapologetic quality, and has a tangible impact on the final product, when channeled properly.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know how justifiable my criticism is. Is there a threshold of external validation one must meet before their opinion matters? I don&amp;#8217;t think so, and I think the more I can constructively criticize – that is, back my criticism with logical analysis – the better I become at judging my own work.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not about to compare my criticism to Steve Jobs&amp;#8217; secret-sauce of sucess (much to my ego&amp;#8217;s dismay), but I think the general idea that the key to success is being critical of one&amp;#8217;s own work and &amp;quot; being in a position to demand that it be fixed before a product sees the light of day&amp;quot; is, in fact, a key to Apple&amp;#8217;s success and an indication of the failure of many competitors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Choice quotes from the Siracusa article:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This touches on the idea of practicing even in the face of self-doubt.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But much worse than that, it means that everything you ever create appears to you as an accumulation of defeats. &amp;#8220;Here&amp;#8217;s where I gave up trying to get that part right and moved on to the next part.&amp;#8221; Because at every turn, it&amp;#8217;s apparent to you exactly how poorly executed your work-in-progress is, and how far short it will inevitably fall when completed. But surrender you must, at each step of the process, because the alternative is to never complete anything—or to never start at all.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I like what this quote has to say about using criticism to understand not just what sucks, but &lt;em&gt;why&lt;/em&gt; it sucks.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And true to form, there was plenty of recursive self-analysis. Do I dislike these new tabs only because they&amp;#8217;re different? Are my old habits blinding me to the benefits of this new design? People really dove deep on this thing: generalizing, trying to find the underlying patterns, and changing their positions based on new analyses.&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/f8aU3l_HPWY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2012/01/03/hypercritical.html</feedburner:origLink></entry>
 
 <entry>
   <title>From the Junk Drawer: The Broken Pixel Theory</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/mUFb3d5tNBU/the-broken-pixel-theory.html" />
   <updated>2011-12-25T00:00:00-08:00</updated>
   <id>http://jtaby.com/2011/12/25/the-broken-pixel-theory</id>
   <content type="html">&lt;h3&gt;Prologue&lt;/h3&gt;
&lt;center&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/baCJFAGEuJM" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;Over the past few months, I&amp;#8217;ve started writing blog posts and stopped half-way through, or even worse, I finished them, but thought they weren&amp;#8217;t good enough to be posted. Sometimes it&amp;#8217;s because I felt like there wasn&amp;#8217;t a real call-to-action to the post, other times it&amp;#8217;s because I didn&amp;#8217;t think the point was well-made. Recently though, I realized that this was causing a writer&amp;#8217;s block and the way to unblock myself was to keep writing, regardless of my perception of its quality. &amp;#8220;Done is Better than Perfect&amp;#8221; and all that. So in the spirit of Ira Glass (See video above), I&amp;#8217;ve decided to practice practice practice, and this is the first in a series  of posts titled &amp;#8220;From The Junk Drawer&amp;#8221;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 style="vertical-align:middle;"&gt;The Broken Pixel Theory&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Broken_windows_theory"&gt;The Broken Window Theory&lt;/a&gt; is a fairly well-known criminology theory that correlates the well-maintenance of neighborhoods with lower crime rates. The idea is that a building with a broken window will lower the guilt barrier of breaking another window, which snowballs into a higher crime rate. I stipulate that the theory applies both to application UIs, as well as the code that runs them. A UI with a broken pixel will lower the guilt barrier of breaking another pixel. If unchecked, these broken pixels can snowball to a culture of qualitative indifference.&lt;/p&gt;
&lt;p&gt;There are many examples of The Broken Window Theory in daily life. For example, a clean desk tends to stay clean until a piece of paper stays on it for a couple of days. Similarly, I&amp;#8217;m much less likely to care about a 2-3 pixel UI bug when the whole UI is a mess. Nobody would care about my bug, and even if they did, they probably won&amp;#8217;t notice my bug among the swarm of other bugs.&lt;/p&gt;
&lt;p&gt;Sweating the details is important not only from an aesthetic perspective, but also from a cultural perspective. A company&amp;#8217;s culture is one of its greatest assets, and its products are a reflexion of it. Apple&amp;#8217;s products are polished and smooth, Google&amp;#8217;s products are fast and technical, Amazon&amp;#8217;s products are simple and frugal. The Broken Window Theory applies not just to the user facing products, but everything internal as well, from the letter head to the internal websites, and all the energy put into maintaining a high level of polish is a worthy investment.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you thought this blog post was interesting, you may also enjoy Braden Kowitz&amp;#8217;s &lt;a href="http://www.designstaff.org/articles/design-details-2011-11-29.html"&gt;Why you should move that button 3px to the left&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/mUFb3d5tNBU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/12/25/the-broken-pixel-theory.html</feedburner:origLink></entry>
 
 <entry>
   <title>Reflexions on my 24th Year</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/e4M10s7lVCw/reflextions-on-my-24th-year.html" />
   <updated>2011-12-10T00:00:00-08:00</updated>
   <id>http://jtaby.com/2011/12/10/reflextions-on-my-24th-year</id>
   <content type="html">&lt;p&gt;&lt;em&gt;This post is written by me, to my future me, in a public way. Hopefully I won&amp;#8217;t regret this decision. This will include an unhealthy amount of self-praise and recollection/introspection. Feel free to ignore at will.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Recap&lt;/h3&gt;
&lt;p&gt;Last year I wrote one of these and in retrospect, it was too personal. I think at the time, I didn&amp;#8217;t expect more than 10 people max to read it. Even though the post makes me feel a bit exposed, it has had a positive effect on me that encouraged me to keep it posted and write another one.&lt;/p&gt;
&lt;p&gt;It was around June when I started thinking about where my career was heading and where I was going. I felt like 2010 was such a crazy year, with so much personal and career development, that had I left 2011 as I entered it, I would have wasted a year. I seriously considered what this blog post would say had I stayed where I was. I thought the blog post would be boring and uneventfull, a reflection of what my life would have been. This idea scared me, and made me itch for change.&lt;/p&gt;
&lt;p&gt;Coincidentally, a couple of opportunities presented themselves to me at that time, and I considered both heavily. Finally, I decided to &lt;a href="http://jtaby.com/2011/06/16/why-i-joined-strobe.html"&gt;join Strobe Inc.&lt;/a&gt;. This was my second job out of college, and the freedom that came with working in a startup amazed me, in stark contrast to Apple. On my first day at the job, I was &lt;a href="http://daringfireball.net/linked/2011/05/31/taby-chrome"&gt;linked to by Gruber&lt;/a&gt; (A bucket-list item of mine). Later, five of my blogs posts would make it to the front page of Hacker News (Another bucket-list item), and within 4 months, I released a &lt;a href="https://github.com/jtaby/waldo"&gt;few&lt;/a&gt;  &lt;a href="https://github.com/sproutcore/TransformJS"&gt;open&lt;/a&gt; &lt;a href="https://github.com/sproutcore/sproutcore-touch"&gt;source&lt;/a&gt; projects. The rush of seeing people use my software and the rush of public-speaking was addictive.&lt;/p&gt;
&lt;p&gt;I recommend working at an early-stage startup to any engineer without hesitation. The breadth of knowledge you need to have and the intensity of the work is intoxication. You become a master of your own destiny, your peers become your family. and your work becomes your best friend. Moreover, you end up learning about a topics you wouldn&amp;#8217;t otherwise explore: Financing, business developement, operations, etc. – All essential lesson to learn, and all lessons I&amp;#8217;m glad I learned.&lt;/p&gt;
&lt;p&gt;Fast forward a few months, and I&amp;#8217;m now at Facebook. Truth be told, had I been in the open recruiting market, Facebook wouldn&amp;#8217;t be the first company I&amp;#8217;d reach out to. In hindsight though, I&amp;#8217;m etremely grateful for the chance to work here. Regardless of the work itself, I&amp;#8217;ve learned a lot about how a large company can operate and how teams can be managed. Again, invaluable life lessons I am grateful to learn.&lt;/p&gt;
&lt;p&gt;I now sit in a room with some of the brightest and most accomplished names in Web Development, working on the most popular web destination, on tough problems. My old goal of always being the stupidest person in the room has been handsomely fullfilled.&lt;/p&gt;
&lt;h3&gt;Life Lessons&lt;/h3&gt;
&lt;p&gt;Shifting gears to big life lessons learnt, I&amp;#8217;d say the biggest lesson is to slow down. I&amp;#8217;ve been operating under the time pressure of a race. I felt like every day that didn&amp;#8217;t mark a notable improvement in my career was a wasted day. I&amp;#8217;ve always been a futurist. I dream about the future, I talk about the future, and I build the future. I couldn&amp;#8217;t justify a lack of change, so I enduced change. I&amp;#8217;ve come to decide that that was a terrible way to live, and the lesson is that building the future takes time, adjustments, perseverence, and hard work.&lt;/p&gt;
&lt;p&gt;Another main lesson I learned it: Fixing what&amp;#8217;s broken can be as rewarding as starting over. I&amp;#8217;ve always beena &amp;#8220;grass is greener on the other side&amp;#8221; sort of person, and treat obstacles with dread.&lt;/p&gt;
&lt;p&gt;As I enter my mid-20s, I think I&amp;#8217;m going to slow down. I want to have a few, but deep and impactful outcomes this year, not a lot of smaller ones. It&amp;#8217;s time for me to stop being a student and a consumer and start creating my own world and future.&lt;/p&gt;
&lt;h3&gt;Socially&lt;/h3&gt;
&lt;p&gt;I&amp;#8217;ve met most my SF friends for over two-and-a-half years now. These people have been with me through my weight loss, my job transitions, and my growth over the past couple of years, and they&amp;#8217;ve handled all my whining and bad jokes, and I love them for it.&lt;/p&gt;
&lt;p&gt;I now live with two of my best friends, in an amazing how in an amazing neighborhood in an amazing city with an amazing job, and an amazing life. I&amp;#8217;m extremely grateful and take none of it for granted. As I grow, I want what I have to work for me more than I&amp;#8217;ve given it a chance to do in the past. This year will have fewer changes, but bigger outcomes.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m excited.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/e4M10s7lVCw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/12/10/reflextions-on-my-24th-year.html</feedburner:origLink></entry>
 
 <entry>
   <title>Eulogy for Steve Jobs</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/EBU-R3rYdbw/eulogy-for-steve-jobs.html" />
   <updated>2011-10-05T00:00:00-07:00</updated>
   <id>http://jtaby.com/2011/10/05/eulogy-for-steve-jobs</id>
   <content type="html">&lt;center&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/4oAB83Z1ydE" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;I was screaming in the car. I was ecstatic; it was the one thing in the world that I wanted more than anything. I had just come home, my brother had gotten it for me, it was waiting for me on the dinner table. In the packaging, and on the side, it said in a big Myriad Set font: iPhone.&lt;/p&gt;
&lt;center&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/GwHLmTCJcJ4" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;Steve Jobs is more than just a visionary. He is an idea, a philosophy, a way of thinking about life and technology that transcends the technical, and ventures into the creative. He gave a voice to those of us who were voiceless. We all knew things sucked; everything sucked. People hated using technology and we didn&amp;#8217;t really know why. Hindsight is 20/20 and we can now clearly see what was wrong and laugh about it, but physical keyboards were cool, and styluses were in, cartoons were for kids, and computers were for scientists, but all that has changed.&lt;/p&gt;
&lt;center&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/OYecfV3ubP8" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;Steve Jobs was my first boss, he created a company that I admired and tried hard to work for. I tried to get an internship at Apple three times, and I failed twice. Failure was never an option for Steve, and I never let it be a failure. Coming in second is reason to try harder, reason to improve, it&amp;#8217;s a great motivator.&lt;/p&gt;
&lt;center&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/KuNQgln6TL0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;Steve knew early on what it takes to make a good product, he assembled a team to work with him that understood that. The team extended beyond just the senior vice presidency. All the employees who work at Apple understand the Jobsian ethos, if not explicitly, then implicitly. Before the first iPod was sold, Jony Ive knew that they were designing an icon.&lt;/p&gt;
&lt;center&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/BCYhrt_PF7Q" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;The closest I ever came to talking to Steve Jobs was brushing shoulders with him at the cafeteria, but his presense was always felt, was a visionary, a legend, and a thought leader. You will be missed Steve, you meant the world to us.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/EBU-R3rYdbw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/10/05/eulogy-for-steve-jobs.html</feedburner:origLink></entry>
 
 <entry>
   <title>Thoughts on the Kindle Fire</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/TWit0WceCPc/thoughts-on-the-kindle-fire.html" />
   <updated>2011-09-28T00:00:00-07:00</updated>
   <id>http://jtaby.com/2011/09/28/thoughts-on-the-kindle-fire</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Update: Added section headers&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I love Amazon, they&amp;#8217;re one of the few companies who like Apple, understand that for a consumer product  like a phone/tablet to succeed, it needs an ecosystem to back it, not just the hardware/software to run it. Amazon is also in a unique position of being in charge of one of the biggest ecosystems for media on the planet.&lt;/p&gt;
&lt;h2&gt;The Good&lt;/h2&gt;
&lt;p&gt;The focus of the Fire on media consumption through Amazon&amp;#8217;s ecosystem is brilliant. The price point (my wild guess is that they&amp;#8217;re selling it at a $1-200 loss per sale) is the razor-blade/printer equivalent of tablets. My assumption is that the play that Amazon is trying to earn most of the money on content sales rather than hardware. Assuming a 2 year lifetime, $1-200 is easy to spend on content (especially $10 books and $3-4 movie rentals).&lt;/p&gt;
&lt;p&gt;They also cleverly designed the UI to play to the strengths of the Fire. As opposed to the iPad (whose strength is the Apple store) which features apps on the home screen, the Fire features content on the home screen. These sorts of UI decisions influence how people use and perceive the product, and Amazon wants people to know that this is a media consumption device.&lt;/p&gt;
&lt;p&gt;The iPad 2 weighs 21.28 ounces, the Kindle Fire weighs 14.6 ounces, this will make a big difference when holding it up for elongated periods of time for reading. I just bought one of the new Kindles (the most basic one) for the sole intended purpose of reading. I&amp;#8217;ve never been able to read books on my iPad. The combination of a backlight, the weight, and the screen resolution is a deal-breaker for me. I haven&amp;#8217;t played with a Fire, so I don&amp;#8217;t know whether or not it suffers from the same resolution/backlighting problems of the iPad for reading, but the weight will help a lot.&lt;/p&gt;
&lt;h2&gt;The Bad&lt;/h2&gt;
&lt;p&gt;The 7&amp;quot; form-factor is an aspect which doesn&amp;#8217;t sit well with me. One of the pleasures of using an iPad is the size of the display. Multi-touch gestures are extremely natural and comfortable on the iPad, web content designed for large computer displays feels natural at 10&amp;quot;. The Galaxy Tab 7&amp;quot; is the only 7 inch tablet I&amp;#8217;ve played with, and it felt smack-dab in the middle of being big enough to be comfortable, and small enough to be portable. The difference between the Tab and the Fire though is the same as the difference between the iPad and the Fire: The Fire is intended for serving a smaller subset of use-cases which are less interactive: Reading books, watching movies, listening to music, etc. so it may be less of an issue.&lt;/p&gt;
&lt;p&gt;Overall, I think it is a well-rounded product with a string backing ecosystem, I can&amp;#8217;t see why this product won&amp;#8217;t be a runaway hit. However, I don&amp;#8217;t think anyone seriously considering an iPad would opt for a Kindle Fire instead. My hypothesis is that people who were on the edge about spending $500 on a tablet will be much more inclined to buy a Kindle Tablet, which will increase the size of the market, but won&amp;#8217;t cannibalize the sales of the iPad.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/TWit0WceCPc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/09/28/thoughts-on-the-kindle-fire.html</feedburner:origLink></entry>
 
 <entry>
   <title>Web or Native? A SXSW Panel Proposal</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/m7d9oDGw82Y/sxsw-panel-picker.html" />
   <updated>2011-08-16T00:00:00-07:00</updated>
   <id>http://jtaby.com/2011/08/16/sxsw-panel-picker</id>
   <content type="html">&lt;p&gt;If you&amp;#8217;ve taken interest in this blog, chances are you&amp;#8217;re at least intrigued by the mobile web and its possibilities and how it fits into our ecosystem. We&amp;#8217;re still in the nascent days of the mobile web, and it&amp;#8217;s still establishing itself as a powerful application development environment. As a result, a lot of companies and developers find themselves wondering whether a new project they&amp;#8217;re starting ought to be built on top of ubiquitous web platform, or the performant native one.&lt;/p&gt;
&lt;p&gt;In order to answer some of these questions, and to engage in a level-headed conversation,  &lt;a href="http://tomdale.net"&gt;Tom Dale&lt;/a&gt;, &lt;a href="http://log.scifihifi.com/"&gt;Buzz Anderson&lt;/a&gt;, &lt;a href="http://mrgan.tumblr.com/"&gt;Neven Mrgan&lt;/a&gt;, &lt;a href="http://lianapolitano.com/"&gt;Lia Napolitano&lt;/a&gt; and I have submitted a &lt;span class="caps"&gt;SXSW&lt;/span&gt; panel proposal trying to address the &amp;#8220;Web or Native?&amp;#8221; question from a UI, UX, and engineering perspective.&lt;/p&gt;
&lt;p&gt;Some of the questions we will answer:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;What advantages do native apps have over web apps, and vice versa?&lt;/li&gt;
	&lt;li&gt;How does good mobile web design differ from good native app design?&lt;/li&gt;
	&lt;li&gt;How does the native development process differ from the web?&lt;/li&gt;
	&lt;li&gt;Which kinds of applications are best suited to mobile web, and which are best suited to native?&lt;/li&gt;
	&lt;li&gt;Can both mobile web and native apps have a place in your mobile product strategy?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="http://panelpicker.sxsw.com/ideas/view/10838"&gt;Please vote for our panel proposal here.&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We hope to see you in Austin!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/m7d9oDGw82Y" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/08/16/sxsw-panel-picker.html</feedburner:origLink></entry>
 
 <entry>
   <title>Design for the Mobile Web's Ubiquity</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/QcMC53NV4-Q/mobile-web-ubiquity.html" />
   <updated>2011-08-11T00:00:00-07:00</updated>
   <id>http://jtaby.com/2011/08/11/mobile-web-ubiquity</id>
   <content type="html">&lt;h2&gt;A Lengthy Introduction&lt;/h2&gt;
&lt;p&gt;I was casually browsing my Twitter stream the other day, and someone posted a link to a blog post on &lt;a href="http://doctyper.com/"&gt;doctyper.com&lt;/a&gt; which when loaded, made me realize another downside to imitate native UIs in the mobile web.&lt;/p&gt;
&lt;p&gt;I should make it clear first, that I don&amp;#8217;t intend to pick on doctyper or its developer, it just happens to be popular enough that I stumbled upon it. Everything I say here is general enough to apply to almost all native-imitation-style mobile web apps.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s what I saw when the page finished loading:&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/mobile-web-ubiquity/doctyper.png)"&gt;&lt;img src="/resources/mobile-web-ubiquity/doctyper.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;My first problem with this came up when the content started rendering and I tried to scroll. Because doctyper uses custom, Javascript-based scrolling (A topic I discuss in more detail &lt;a href="http://jtaby.com/2011/07/01/the-next-generation-of-mobile-web-apps.html#chasing_own_tail"&gt;here&lt;/a&gt;) and because the javascript hadn&amp;#8217;t finished parsing and executing, my touches weren&amp;#8217;t captured. Instead, the page scrolled as-is and the top and bottom black site bars along with the content all static and moving together. I released my finger, tried again, and it finally kicked in.&lt;/p&gt;
&lt;p&gt;Not a problem native developers have to deal with.&lt;/p&gt;
&lt;p&gt;The second problem came up when I started scrolling. I don&amp;#8217;t know about you, but I don&amp;#8217;t like small, confined spaces. And on this site, I felt very claustrophobic. To see what I mean, let&amp;#8217;s deconstruct the screenshot into its various elements. Labels on the left represent the component that drew them, and the labels on the right show their pixel height:&lt;/p&gt;
&lt;div class="image-row no-highlight"&gt;&lt;div class="image-container" style="background-image:url(/resources/mobile-web-ubiquity/doctyper_deconstructed.png)"&gt;&lt;img src="/resources/mobile-web-ubiquity/doctyper_deconstructed.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Of the 960 pixels of real estate, &lt;strong&gt;520&lt;/strong&gt; were used for content. In other words,  46% of the space was information and visual clutter that had nothing to do with the content.&lt;/p&gt;
&lt;p&gt;Sometimes web developers seem to be more concerned with the frame than the painting. Haven&amp;#8217;t we learned anything from Microsoft?&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/mobile-web-ubiquity/microsoft-word-crazy.jpg)"&gt;&lt;img src="/resources/mobile-web-ubiquity/microsoft-word-crazy.jpg"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class="subtext"&gt;Image courtesy of &lt;a href="http://www.pcadvisor.co.uk/news/software/106226/in-pictures-25-years-of-microsoft-word/?pn=3"&gt;pcadvisor.co.uk&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The Assumption&lt;/h2&gt;
&lt;p&gt;My assumption is that people who design and develop these native-imitation style mobile web apps are doing so in the void of MobileSafari, ignoring the ubiquity of the web. The whole point of building a web app is to leverage its strengths. One the main strengths is the web&amp;#8217;s ubiquity.&lt;/p&gt;
&lt;p&gt;The ubiquity of the web means you can&amp;#8217;t guess where and how people will be using your web app. The best you can do is come up with a flexible design language that will adapt to screen sizes, form factors, and input mechanisms. Unless you&amp;#8217;re building a hybrid app – combining web views within native wrappers – where you can presume the dimensions and access points, designing for a specific form-factor/use-case will indubitably lead to situations like the one discussed earlier.&lt;/p&gt;
&lt;h2&gt;The Addendum&lt;/h2&gt;
&lt;p&gt;Having said all that, some of you may be wondering why you would build an app-like experience on the mobile web at all. I &lt;em&gt;did&lt;/em&gt; just spend 400 words telling you why it was a bad idea afterall. Well, let me tell you about another experience I recently had with the mobile web.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/mobile-web-ubiquity/twitter.png)"&gt;&lt;img src="/resources/mobile-web-ubiquity/twitter.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class="subtext"&gt;A screenshot of the mobile Twitter app, running inside of Campfire.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://daringfireball.net"&gt;John Gruber&lt;/a&gt;, being the fan of &lt;a href="http://twitter.com/counternotions"&gt;@counternotions&lt;/a&gt; that he is, linked to one of his tweets recently. As I was browsing the feed, the mobile Twitter app loaded and I was pleasantly surprised. &lt;sup class="footnote" id="fnr1"&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; I was expecting the basic &lt;span class="caps"&gt;HTML&lt;/span&gt; page to load that showed the tweet, the person&amp;#8217;s avatar, and a couple of buttons. Instead, a rich UI was loaded which let me fave the tweet, see the conversation leading to it, and quickly switch over to my main timeline. 15 minutes later, I realized that I was still in the embedded web view of Reeder, lost in a sea of poop jokes and kittens.&lt;/p&gt;
&lt;p&gt;The takeaway is, I was under-promised and over-delivered, and that&amp;#8217;s what we ought to aim for. Mobile web apps should delight our users, not frustrate them.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/QcMC53NV4-Q" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/08/11/mobile-web-ubiquity.html</feedburner:origLink></entry>
 
 <entry>
   <title>The Fallacy of Modern Web Development</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/hVsa1XoPlbo/fallacy-of-modern-web-development.html" />
   <updated>2011-08-01T00:00:00-07:00</updated>
   <id>http://jtaby.com/2011/08/01/fallacy-of-modern-web-development</id>
   <content type="html">&lt;p&gt;Please note that I&amp;#8217;m writing this without any proof-reading. This is pure stream-of-consciousness.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;iCloud.com was just announced. That&amp;#8217;s pretty awesome: iCloud&amp;#8217;s web apps include some pretty amazing interactions. If you haven&amp;#8217;t seen them, get a developer account and log in. You should do that now, the rest of this blog post assumes you&amp;#8217;ve seen them. iCloud is pretty fuckin&amp;#8217; amazing: The animations are incredible, the interactions are buttery, and the UI is polished as possibly could be. Having praised the iCloud suite of applications, one thing worth noting is: They prove that a buttery-smooth UI is not impossible to build on the web.&lt;/p&gt;
&lt;p&gt;iCloud is tangential the the point of this blog, but it highlights a point I want to make: People are surprised and impressed that the web stack is capable of implementing the interactions which iCloud implements. We as web developers ought to be embarrassed about that. It shouldn&amp;#8217;t be a magical surprised that a good, no-compromise UX is possible on the web.&lt;/p&gt;
&lt;p&gt;Everyone expects Apple to release software that is far and beyond the level of sophistication and polish that we are accustomed to, but we shouldn&amp;#8217;t be surprised that a technical achievement is possible which we previously thought wasn&amp;#8217;t. My hypothesis is that we as web developers are so entrenched in our trees, we can&amp;#8217;t see the forest. Every javascript developer is developing their own hot little javascript micro-framework or even fully-developer mature framework to one part of the web development story or another. I call bullshit. As far as I&amp;#8217;m concerned, we&amp;#8217;re all chasing our tails trying to solve the same damned problem over and over again. People are somehow susceptible to false benefits which are easy to preach, but hard to verify. I say: Stop worrying about kilobytes, and start worrying about web developers being oblivious to the capabilities of the web.&lt;/p&gt;
&lt;p&gt;I could spend an entire blog post outlining the fallacies of micro-frameworks and niche solutions, but I feel like Apple has already proven many of my points: Take a look at the iPod. Not only has the iPod achieved market dominance in its segment, it has also maintained that dominance long enough for the entire market segment to become irrelevant. There are many reasons for the iPod&amp;#8217;s success, but the one I think is worth highlighting in this conversation is its ecosystem. An iPod without iTunes is like a human body without blood. Why don&amp;#8217;t we Web Developers learn this lesson?&lt;/p&gt;
&lt;p&gt;There are more &lt;span class="caps"&gt;MVC&lt;/span&gt; based frameworks than I can count. Since SproutCore 2.0 has started establishing its namesake with bindings support and the observer layer, it seems like every single new javascript framework ships with the same live-updating support. This isn&amp;#8217;t an apologetic SproutCore blog post though, I could spend an entire blog post telling you why all these framework developers are wasting their time and chasing their own tails, but the point is: The people developing these clones are really smart, but they&amp;#8217;re not building anything worthwhile.&lt;/p&gt;
&lt;p&gt;It shouldn&amp;#8217;t be a surprise to people what you can do with &lt;span class="caps"&gt;CSS&lt;/span&gt; 3D Transformations. At this point, that&amp;#8217;s well understood and well documented. It&amp;#8217;s like somebody being surprised that mixing peanut-butter and jelly with some bread creates a tasty combination. What should be a surprise is what happens when you build a fully-integrated solution on top of it. Instead of developing more redundant &lt;span class="caps"&gt;MVC&lt;/span&gt; frameworks, we need to coalesce our energy on a few proven solutions.&lt;/p&gt;
&lt;p&gt;Native developers don&amp;#8217;t have this problem. You never hear of widespread news when a native developer finds out that if you call methods on  UIImagePickerController then you magically get access to the device&amp;#8217;s camera, but it&amp;#8217;s common-place to find out that people exposing and using the intricacies of CSS3 transforms are creating incredible feats of UX.&lt;/p&gt;
&lt;p&gt;We need to cut this shit out. I don&amp;#8217;t care how small your microframework is. Bandwidth isn&amp;#8217;t the problem. If you think a 5kb framework is preferable to a 7kb framework, your are bat-shit insane and patently wrong. There is no &amp;#8220;maybe he has a point&amp;#8221;. No, it&amp;#8217;s black-and-white. File size isn&amp;#8217;t the problem, code-size is. If you string-wrap your code, your OK. Don&amp;#8217;t listen to people who tell you otherwise, they&amp;#8217;re lying to you (though probably not intentionally).&lt;/p&gt;
&lt;p&gt;A JavaScript-based &lt;span class="caps"&gt;MVC&lt;/span&gt; framework is only a small part of the solution, the same way an iPod is a small part of the digital music solution. A proper, scalable backend along with all the services and add-ons that make up a server stack are required to create an ecosystem. But that still doesn&amp;#8217;t quite cover the whole story: The stack not only has to exist (Nokia, &lt;span class="caps"&gt;RIM&lt;/span&gt;, Microsoft), but it also has to be tightly integrated and seamless (Apple).&lt;/p&gt;
&lt;p&gt;Partly as a disclaimer, and partly as supporting evidence, I should make it clear that I work at Strobe Inc. We&amp;#8217;re the first people to really build an end-to-end solution for web development. Lots of other developers are working on solving certain problems in the domain, but none are providing a full-stack, integrated solution like we are. Strobe is sponsoring projects like bpm, sproutcore, and the strobe platform to once-and-for-all solve the problem of developing web application from the ground up. I strongly believe in what we&amp;#8217;re doing, which is why I&amp;#8217;m spending time to make sure we do it, but the point is that the rest of us should stop wasting time and start moving our platform together.&lt;/p&gt;
&lt;p&gt;We have a gem on our hands: Let&amp;#8217;s stop arguing about who has the better hammer and let&amp;#8217;s start chiseling it into a beautiful piece of jewelry.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/hVsa1XoPlbo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/08/01/fallacy-of-modern-web-development.html</feedburner:origLink></entry>
 
 <entry>
   <title>Building the Next Generation of Mobile Web Applications</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/R9HlZCXMJFE/the-next-generation-of-mobile-web-apps.html" />
   <updated>2011-07-01T00:00:00-07:00</updated>
   <id>http://jtaby.com/2011/07/01/the-next-generation-of-mobile-web-apps</id>
   <content type="html">&lt;p&gt;All mobile web apps today suck. Some mobile web apps come close to being good, like &lt;a href="http://www.google.com/mobile/mail/"&gt;Gmail&lt;/a&gt; and &lt;a href="http://blog.twitter.com/2011/05/better-app-for-your-mobile-browser.html"&gt;Twitter&lt;/a&gt;, while some come &lt;em&gt;really&lt;/em&gt; close, like &lt;a href="http://apps.ft.com/ftwebapp/"&gt;The Financial Times&lt;/a&gt; and &lt;a href="http://37signals.com/svn/posts/2761-launch-basecamp-mobile"&gt;Basecamp&lt;/a&gt;. But all the examples fall short one way or another: Gmail&amp;#8217;s scrolling is unnatural, Twitter hides the browser&amp;#8217;s location bar, Financial Times is riddled with flashing/jittering/scrolling bugs, and Basecamp jumps when you tap on an item. For every one of these examples, there are 10 worse offenders I can point to, but they all share the same essential mistake: They all use the browser as an emulator of native apps. Trying to replicate the native experience on the web is a fool&amp;#8217;s errand, and leaves users confused. To move ahead, the web needs to play to its strengths.&lt;/p&gt;
&lt;p&gt;First, I&amp;#8217;ll highlight the overarching problems with the current fleet of mobile web apps, then I&amp;#8217;ll lay a framework for building the next generation of amazing mobile web applications.&lt;/p&gt;
&lt;h3 id="double_chrome"&gt;Problem: Double-chrome&lt;/h3&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/mobile-web-apps/double_chrome.PNG)"&gt;&lt;img src="/resources/mobile-web-apps/double_chrome.PNG"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Consider that screenshot from Google+: There are three back buttons. What do you think will happen if I click the browser&amp;#8217;s back button? Will it take me &amp;#8220;Home&amp;#8221;? or will it take me to the previous app? What will happen if I click the &amp;#8220;Nearby&amp;#8221; button? What about the &amp;#8220;Home&amp;#8221; button? Now let&amp;#8217;s say I clicked on the &amp;#8220;Incoming&amp;#8221; link at the top right. What do the buttons do now? The answer is, the browser&amp;#8217;s Back button will take me to the previous website, while the &amp;#8220;Home&amp;#8221; back button will take me to the main Google+ page, and the &amp;#8220;Nearby&amp;#8221; button will take you nearby. Once you click on a post, the browser&amp;#8217;s back button and the button that will replace the &amp;#8220;Home&amp;#8221; button will do the same thing, but the &amp;#8220;Nearby&amp;#8221; button won&amp;#8217;t. This lack of consistency and predictability is endemic of mobile web apps. This is a  problem that native applications don&amp;#8217;t usually have to deal with.&lt;/p&gt;
&lt;p&gt;The counter-argument goes: If you make the user believe they&amp;#8217;re in a native application, they will expect to have a back button in the top-left. Most of the time, this means having a navigation bar that is fixed to the top of the viewport. In reality, that argument makes the assumption that people are using the web app on iOS (navigation bars don&amp;#8217;t exist on Android), and that they forget they&amp;#8217;re in a web browser. Even assuming the argument is correct, it implies that the cost of learning the back gesture the first time outweighs the cost of having to make a decision on which back button to tap on every single subsequent page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Browsers provide a persistent back button at all times that is impossible to get rid of. They also provide a title bar – which admittedly, isn&amp;#8217;t persistent – but also provides a reliable way of telling your users where they are. Mobile web apps today suffer from platform-specific, ambiguous elements. Give the user their 50 pixels back.&lt;/p&gt;
&lt;h3 id="chasing_own_tail"&gt;Problem: Chasing your own tail&lt;/h3&gt;
&lt;p&gt;iOS has not had support for overflow-auto nor position:fixed until iOS 5. Instead, people &lt;a href="http://uxebu.com/blog/2010/04/27/touchscroll-a-scrolling-layer-for-webkit-mobile/"&gt;resort&lt;/a&gt; &lt;a href="http://cubiq.org/iscroll"&gt;to&lt;/a&gt; &lt;a href="http://joehewitt.github.com/scrollability/"&gt;elaborate&lt;/a&gt; &lt;a href="http://www.azoffdesign.com/overscroll"&gt;hacks&lt;/a&gt; to achieve the same fixed-bar-at-the-top UI of navigation controllers and tab controllers on native iOS apps described in the earlier section. If you&amp;#8217;re ever used a web app that used that UI, you&amp;#8217;ve probably noticed very quickly how unusual and weird the scrolling behavior is.&lt;/p&gt;
&lt;p&gt;Scrollability is the best of the bunch, but it&amp;#8217;s still not perfect, and it never will be perfect. The proper solution is the &lt;a href="http://johanbrook.com/browsers/native-momentum-scrolling-ios-5/"&gt;browser&amp;#8217;s solution&lt;/a&gt;. You obviously couldn&amp;#8217;t have used that feature before iOS 5, but my point is that web applications shouldn&amp;#8217;t have a fixed bar along the top anyway, obviating the need for a scrolling hack (except on iPad for multi-pane UIs. That&amp;#8217;s a technical limitation Scrollability is a good solution for). Moreover, for the scrolling hack to work, the scrollable area had to capture touches, which means when user scrolls to the top of the page, they get the scroll-bounce instead of getting access the address bar. For example, if you go to twitter&amp;#8217;s mobile web app, you have to know to tap the title bar to scroll to the top of the page and reveal the address bar. &lt;sup class="footnote" id="fnr1"&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; My uncle Bob doesn&amp;#8217;t know that tapping on the title bar scrolls his view to the top, so he&amp;#8217;s essentially stuck in the app.&lt;/p&gt;
&lt;p&gt;The fundamental problem is that people are trying to emulate as best they can what a bunch of engineers did at Apple 4 years ago. Apple can change interactions, behavior, and widgets between versions, and everyone who&amp;#8217;s trying to emulate them, has to continue playing an endless game of catch-up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Once you eliminate the double-chrome problem and the fixed-navigation-bar problem, you eliminate a lot of the issues that make mobile web apps terrible.&lt;/p&gt;
&lt;h3 id="cross_platform"&gt;Problem: Forgetting what the web is about&lt;/h3&gt;
&lt;p&gt;Mobile web app developers seem to have forgotten that the web is inherently cross-platform. That&amp;#8217;s the whole point of the web: Ubiquitous access to information. What&amp;#8217;s the point of building a mobile web app if you&amp;#8217;re only targeting iOS users? If you are targeting multiple platforms, why are you forcing the iOS UI on non iOS users? The navigation bar with a back button does not exist on Android, users won&amp;#8217;t be expecting it, so save yourself the 50 pixels of screen real estate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Build a UI and UX that is platform-agnostic.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Now that we&amp;#8217;ve outlined some of the problems of the existing fleet of mobile web apps, let&amp;#8217;s analyze how to build the next generation.&lt;/p&gt;
&lt;h3 id="build_when_it_makes_sense"&gt;Build a mobile web app when it makes sense&lt;/h3&gt;
&lt;p&gt;Not every app is a suitable candidate for the mobile web. It&amp;#8217;s important to analyze the strengths of the web and see if your application stands to benefit from them:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;No installation:&lt;/strong&gt; The barrier to entry for a new user to your app is essentially zero. As soon as a user has expressed interest (by clicking on a link), they have instant access to it. This quality is essential for certain classes of applications that require either an impulsive action, or a trial. If your app needs to get viral, it needs to be a mobile web app. There are counter examples: Instagram, Angry Birds, etc. However, instagram still needs to build a scaled back web page to share with people, and in the case of Angry Birds, they had to build different versions for every platform (and ultimately, the web). I&amp;#8217;m using Angry Birds here as an example for the virality argument, clearly, I don&amp;#8217;t think Angry Birds should ship as a mobile web app today.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;URLs:&lt;/strong&gt; This one goes hand-in-hand with the previous benefit. The fact that you have a &lt;span class="caps"&gt;URL&lt;/span&gt; to an application means you can a) encode the current state in the &lt;span class="caps"&gt;URL&lt;/span&gt;, and b) send that application in its current state to anyone in the world, on any device or platform. If your app stands to benefit from share-ability, it needs to be a mobile web app.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Auto update:&lt;/strong&gt; Mobile web app users are always using the latest version of your application. You can ensure 100% penetration of new features and bug fixes almost instantly (allowing time for caches to expire). If your application needs timely security fixes or a/b testing or iterative user feedback, it needs to be a mobile web app.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Cross-Platform:&lt;/strong&gt; Most people aren&amp;#8217;t on iOS. Nor are they on a Mac. Those users represent real people, with real jobs, real bank accounts, and real user needs. The web is the only example of a wildly successful, healthy cross device and form-factor platform. If you app needs to reach a wide audience, it needs to be a mobile web app.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notice how I didn&amp;#8217;t mention performance. Performance on the web needs to only be good enough to deliver a great UX, it doesn&amp;#8217;t need to be infinite. If you were instead building an oscilloscope app for the iPhone that needs to analyze large amounts of data quickly, please don&amp;#8217;t build it as a mobile web app.&lt;/p&gt;
&lt;h3 id="uncanny_valley"&gt;Uncanny Valley&lt;/h3&gt;
&lt;p&gt;Bill Higgins &lt;a href="http://billhiggins.us/blog/2007/05/17/the-uncanny-valley-of-user-interface-design/"&gt;wrote&lt;/a&gt; in May 2007:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So I’d recommend that if you’re considering or actively building Ajax/&lt;span class="caps"&gt;RIA&lt;/span&gt; applications, you should consider the Uncanny Valley of user interface design and recognize that when you build a “desktop in the web browser”-style application, you’re violating users’ unwritten expectations of how a web application should look and behave. This choice may have significant negative impact on learnability, pleasantness of use, and adoption. The fact that you can create web applications that resemble desktop applications does not imply that you should; it only means that you have one more option and subsequent set of trade-offs to consider when making design decisions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rasmus Lerdorf, the creator of &lt;span class="caps"&gt;PHP&lt;/span&gt;, once gave a talk to us at The University of Michigan where he was talking about performance. He gave us an anecdote from his time at Yahoo! where they asked users to use Yahoo! Mail and Gmail and asked them to rate which one was faster and which was slower. Although Yahoo! Mail was faster at a technical level, the users said Gmail was faster. His hypothesis was that users compared gmail&amp;#8217;s performance to Hotmail, but Yahoo Mail&amp;#8217;s performance to Outlook/Mail.app. The takeaway is, by copying a different platform&amp;#8217;s UX, the users had a mental model that did not match what they were using. I don&amp;#8217;t know the accuracy of the anecdote (I&amp;#8217;m recalling it from two years ago), but I think the point holds true today.&lt;/p&gt;
&lt;p&gt;Web developers today use iOS as a starting point for every mobile web initiative. It&amp;#8217;s a great platform, I don&amp;#8217;t blame them, but iOS is only one of the platforms the web supports. On Android/WebOS, most of iOS&amp;#8217;s interactions don&amp;#8217;t make sense, on iOS, if they&amp;#8217;re slightly off, they&amp;#8217;ll break the illusion to the user. It&amp;#8217;s a no-win situation. The Web has achieved cross-platform dominance by not imposing a platform-specific UI on multiple platforms.&lt;/p&gt;
&lt;p&gt;The Financial Times web app does a very good job of this. It doesn&amp;#8217;t feel like an iOS-specific app, and scales well to multiple platforms.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/mobile-web-apps/financial_times.jpeg)"&gt;&lt;img src="/resources/mobile-web-apps/financial_times.jpeg"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p class="subtext"&gt;Image courtesy of &lt;a href="http://www.macrumors.com/2011/06/07/financial-times-wont-give-apple-a-cut-drops-ios-for-web-app/"&gt;macrumors.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This view may seem contradictory to you if you&amp;#8217;re familiar with my work. I&amp;#8217;ve been involved with the &lt;a href="http://www.sproutcore.com/"&gt;SproutCore&lt;/a&gt; project for some time now first building desktop-like web apps, and now building a new UI layer for mobile devices. SproutCore&amp;#8217;s mission has been (until the recent 2.0 release) to build desktop-like applications on the web. That argument makes a bit more sense on the desktop: Most desktop computers share a keyboard, mouse, and across the different operating systems, most interactions will map from one to another. On mobile platforms, that&amp;#8217;s not the case, the variety between platforms is huge, and sometimes, input devices exist that don&amp;#8217;t on other platforms (trackball, physical keyboard, hardware-based gestures, etc.) Furthermore, desktop browsers are much, much more capable than their mobile counterparts. That&amp;#8217;s not to say that in a couple of years when mobile browsers get fast, that uncanny valley will no longer be an issue. After all, although SproutCore (and &lt;a href="http://cappuccino.org/"&gt;Cappuccino&lt;/a&gt;) delivered very strong solutions, neither nor developers flocked to use them.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The web platform on the desktop is much more capable than its mobile counterpart. For a while now, we&amp;#8217;ve been able to build &lt;a href="http://www.apple.com/mobileme/news/2010/10/new-mobileme-calendar-now-available-to-all-members.html"&gt;incredibly complex&lt;/a&gt;, compelling UIs on the web with no compromises. Desktop browsers are much better today at compatibility than they were before, and we have much better debugging tools.&lt;/p&gt;
&lt;p&gt;On the other hand, developing mobile web applications today is akin to developing a web application on the desktop in 2004. The saving grace is that the pace of progress on today&amp;#8217;s mobile devices is far, far faster than it was on the desktop. iOS 5 on an iPad 2/iPhone 4 is ready for the mobile web, Android isn&amp;#8217;t (but that&amp;#8217;s a topic for another post). The next generation of mobile devices (and worst-case scenario, the one after) will catch up to iPad 2/iPhone 4 and the mobile web will be ready to kick some ass.&lt;/p&gt;
&lt;hr /&gt;
&lt;p style="vertical-align:middle;" class="footnote" id="fn1"&gt;&lt;a href="#fnr1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; position:fixed in iOS 5 behaves correctly: When you reach the top of the scrollable area, the fixed bar moves down to reveal the address bar&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/R9HlZCXMJFE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/07/01/the-next-generation-of-mobile-web-apps.html</feedburner:origLink></entry>
 
 <entry>
   <title>Why I joined Strobe</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/YachhBmppTQ/why-i-joined-strobe.html" />
   <updated>2011-06-16T00:00:00-07:00</updated>
   <id>http://jtaby.com/2011/06/16/why-i-joined-strobe</id>
   <content type="html">&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;One should not pursue goals that are easily achieved. One must develop an instinct for what one can just barely achieve through one&amp;#8217;s greatest efforts.&amp;#8221;&lt;br /&gt;
- Einstein&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Three weeks ago I quit my job at Apple and joined &lt;a href="http://www.strobecorp.com"&gt;Strobe Inc.&lt;/a&gt; as a full-time engineer. My job is to start work on a new project under the SproutCore 2.0 umbrella called SproutCore UI. The goal of the project is to provide a UI layer for building complex, app-like experiences on the web.&lt;/p&gt;
&lt;p&gt;When I was trying to decide which company to join, I had the mother of all first-world-problems: I had to choose between multiple amazing offers from amazing companies with amazing people. During the process of deciding where to go, Einstein&amp;#8217;s quote played a part in shaping my decision. Of all the choices, I decided to join Strobe for its combination of ambition, people, and focus. All qualities I think are essential for a company&amp;#8217;s success.&lt;/p&gt;
&lt;h3&gt;Ambition&lt;/h3&gt;
&lt;p&gt;Strobe is attempting to provide a platform for web developers to build, deploy, and maintain amazing web apps. It&amp;#8217;s no small task and involves multiple moving parts coming together, but the promise is great. If Strobe succeeds, the web will be a better place. The task isn&amp;#8217;t simply to build the &amp;#8220;Heroku for ____&amp;#8221;, rather, it&amp;#8217;s to change the way people think about architecting and building applications, and to set the tone for how the mobile web will evolve.&lt;/p&gt;
&lt;p&gt;I never want to question the impact of what I&amp;#8217;m working on. I never want to feel like I&amp;#8217;ve settled for something, nor that I&amp;#8217;m content with my current situation. I found a company trying to achieve the improbable in Strobe. When I told people about what Strobe was trying to do, I was faced with skepticism regarding the challenges it faced. That skepticism served as a validation to me: Don&amp;#8217;t try to do the doable, try do the impossible.&lt;/p&gt;
&lt;h3&gt;People&lt;/h3&gt;
&lt;p&gt;I work &lt;a href="http://twitter.com/#!/okito"&gt;with&lt;/a&gt; &lt;a href="https://github.com/carllerche"&gt;some&lt;/a&gt; &lt;a href="http://tomdale.net/"&gt;brilliant&lt;/a&gt; &lt;a href="http://yehudakatz.com/"&gt;people&lt;/a&gt; at Strobe. Not only is everyone accomplished, but they are also humble, approachable, and friendly. I knew most of the people in the engineering team before I joined, so I knew what I was getting myself into. Regardless, it&amp;#8217;s much different in the trenches. &lt;a href="http://www.joelonsoftware.com/items/2011/04/28.html"&gt;Nobody at Strobe eats lunch alone&lt;/a&gt;. No uncertainties go unquestioned, no statements go unheard, and no ideas go un-vetted.&lt;/p&gt;
&lt;p&gt;There are a few reasons why that played a role in my decision to join Strobe: Firstly, it allows me to absorb an immense amount of technical knowledge from people much smarter than I am. Secondly, it provides me with unprecedented access to the web community. To affect change at scale, I believe you need to not only have the will, but also the means. At Strobe, I believe that we have the means to change things for the better. Finally, I believe that the type of people you work with can have a dramatic effect on the happiness and the quality of work I produce, and I&amp;#8217;m confident that my coworkers at Strobe will bring out the best in me.&lt;/p&gt;
&lt;h3&gt;Focus&lt;/h3&gt;
&lt;p&gt;The most important lesson I learned from my time at Apple is focus. I&amp;#8217;ve seen large companies flail and waste their time and energy in vain, I&amp;#8217;ve seen teams break apart because of a lack of direction, and I&amp;#8217;ve seen driven people grow complacent because of a lack of vision.&lt;/p&gt;
&lt;p&gt;Late last year, I got a chance to spend a day working at etsy&amp;#8217;s offices in Brooklyn. I was taken aback by the focus of their team, and the do-or-die attitude that I sensed in their office. I had the same sense talking to the different people at Strobe, and it has turned out to be very true.&lt;/p&gt;
&lt;p&gt;At Strobe, everyone knows what we&amp;#8217;re building, why we&amp;#8217;re building it, and who we&amp;#8217;re building it for. This laser-like focus ensures that talent isn&amp;#8217;t wasted, and resources are put to good use.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I&amp;#8217;m writing this at 11 PM on a Thursday. The office is full, and everyone is excited. There&amp;#8217;s a sense of urgency in the air, and everyone is working towards a single end-goal. I live for moments like this. Everyone on the engineering team understands what&amp;#8217;s at stake, and believes that we are in a position to deliver the best solution.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know how everything will play out, but what I do know is that everyone involved will work their butts off and whatever we do produce will have an impact. There&amp;#8217;s no way for it not to.&lt;/p&gt;
&lt;p&gt;Gruber recently &lt;a href="http://daringfireball.net/linked/2011/06/08/campus"&gt;linked to a quote&lt;/a&gt; that rang very true to me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Make no little plans. They have no magic to stir men&amp;#8217;s blood and probably themselves will not be realized. Make big plans; aim high in hope and work, remembering that a noble, logical diagram once recorded will never die, but long after we are gone will be a living thing, asserting itself with ever-growing insistency. Remember that our sons and grandsons are going to do things that would stagger us. Let your watchword be order and your beacon beauty. Think big.&amp;#8221;&lt;br /&gt;
- Daniel Burnham&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I can&amp;#8217;t wait to come to work tomorrow.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/YachhBmppTQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/06/16/why-i-joined-strobe.html</feedburner:origLink></entry>
 
 <entry>
   <title>Google Chrome - Epilogue and Reader Feedback</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/iASe7lmmX_E/google-chrome-reader-feedback.html" />
   <updated>2011-06-07T00:00:00-07:00</updated>
   <id>http://jtaby.com/2011/06/07/google-chrome-reader-feedback</id>
   <content type="html">&lt;p&gt;I got a lot of great feedback from my previous post higlighting why I hated using Chrome yet continued doing so. The feedback ranged from the dismissive to the supportive. In the process, some readers highlighted good and bad things about Chrome I missed that I wanted to highlight in this follow-up post.&lt;/p&gt;
&lt;p&gt;Before I get into the feedback though, there were a couple of points I wanted to expand on:&lt;/p&gt;
&lt;hr /&gt;
&lt;h4 style="vertical-align:middle;"&gt;On the status bar&lt;/h4&gt;
&lt;p&gt;When I wrote the blog post, my complaint about the status bar mirrored that of the search bar: It overlayed the contents of the page. That presented other problems, which had to have their own solutions. When it comes to the status bar, my suggestion wasn&amp;#8217;t to go the Safari route by making it a permanent bar (which in my opinion is inferior), but that the status bar as a whole is a useless relic from the olden browsers.&lt;/p&gt;
&lt;p&gt;Having had a bit of time to think about it, I think a solution would be to remove the status bar altogether and instead place the hovered-url in the address bar itself. The address bar (or omnibox, as it&amp;#8217;s called in Chrome parlance), provides the context of the current and future location of the page.&lt;/p&gt;
&lt;p&gt;The assumption I&amp;#8217;m making is that people use the status bubble to see what &lt;span class="caps"&gt;URL&lt;/span&gt; a link will take them to. By placing the hovered-url in the address bar, you also eliminate a mental step the user has to go through: Instead of hover, look at the bottom left, click, and then look up at the address bar, you just hover, look at the address bar, and click to commit the action. Moreover, you eliminate a confusing element from your browser!&lt;/p&gt;
&lt;hr /&gt;
&lt;h4 style="vertical-align:middle;"&gt;On the search bar&amp;#8217;s behavior&lt;/h4&gt;
&lt;p&gt;There seemed to be a bit of confusion regarding what I was suggesting when I complained about Chrome&amp;#8217;s search bar. My complaint was that it overlays the contents of the website, not that it was inlined to the window. In contrast, Safari&amp;#8217;s Search-in-Page UI is far superior in my opinion, since it is still inlined to the page, but it shifts the contents of the page down as it reveals itself. The separate window for searching the contents of a page was a terrible idea and I&amp;#8217;m glad it&amp;#8217;s largely history at this point.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4 style="vertical-align:middle;"&gt;On Chrome Develepor Tools&amp;#8217; non-native toolbar&lt;/h4&gt;
&lt;p&gt;Wes Campaigne wrote to highlight a bug he &lt;a href="http://code.google.com/p/chromium/issues/detail?id=44350"&gt;filed over a year ago&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The reason I decided to include this comment here because it highlights an aspect of Chrome which I think is the root cause of a lot of issues. Specifically:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is not as easy as it might seem &amp;#8211; we are talking about dragging native window by the tabcontents content. I think in Safari, toolbar is transparent and we are dragging by the window itself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Chrome is a cross-platform browser and shares a lot of code between its Windows, Linux, and Mac variants. To achieve that goal, they have to fake a lot of native behavior in their cross-platform components. What&amp;#8217;s interesting about this though, is that I checked out the Chrome codebase and as far as I can tell, Chromium (the open-source codebase for Chrome) uses a shared component but the UI layer is built specifically for each platform.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4 style="vertical-align:middle;"&gt;Chrome&amp;#8217;s open-tab behavior&lt;/h4&gt;
&lt;p&gt;Chris Karalus writes to highlight Chrome&amp;#8217;s new-tab behavior. If you open a new tab, Chrome intelligently places that new tab adjacent to the current one. This creates a natural grouping of related tabs with no explicit user action. This is UX at its best: Interpret the user&amp;#8217;s intent, and let the UI adapt to it.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4 style="vertical-align:middle;"&gt;On the download bar&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://news.ycombinator.com/item?id=2603853"&gt;callahad on Hacker News wrote&lt;/a&gt; :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Actually, in OS X, the Chrome icon in the dock has a small pie chart overlay during downloads that indicates both the number of pending downloads as well as the aggregate progress of all downloads. If your dock is hidden, you can quickly and easily check the progress by hitting Cmd-Tab. In Windows 7, the &amp;#8220;tile&amp;#8221; in the Windows &amp;#8220;Dock&amp;#8221; fills from left to right, like a progress bar, to show the aggregate status of downloads. You can also click on the in-progress download, dismiss the dialog, and the file will open once the download completes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h4 style="vertical-align:middle;"&gt;On the preferences pane&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://news.ycombinator.com/item?id=2603853"&gt;callahad again from Hacker News&lt;/a&gt; :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;you can actually link to specific pages and panels. Though this doesn&amp;#8217;t help you find a preference in the first place, it does make communicating the location of known preferences much simpler.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h4 style="vertical-align:middle;"&gt;On integration with OS X&lt;/h4&gt;
&lt;p&gt;Kurt Landrus writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The one feature missing in Chrome and Firefox that keeps me in Safari, is the ability to drag or copy Rich Text from the browser to another app like text edit or MacJournal, Chrome and Firefox only copy plain text. I use this all the time for research.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;The response I&amp;#8217;ve received seems to suggest that a lot of people weren&amp;#8217;t aware of any of these issues. The post also seems to have generated a healthy debate regarding the merits of my arguments and their objectivity. Whether you agree with my complaints or not, I think it&amp;#8217;s important to take a critical look at the software we use every day.&lt;/p&gt;
&lt;p&gt;On a separate note, it seems like the Chrome team has &lt;a href="https://twitter.com/#!/paul_irish/status/76537070876758016"&gt;taken notice&lt;/a&gt; of the complaints and there are been bugs submitted to track those issues. Hopefully some good will come out of my ranting!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/iASe7lmmX_E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/06/07/google-chrome-reader-feedback.html</feedburner:origLink></entry>
 
 <entry>
   <title>Google Chrome - Why I Hate It And Continue To Use It</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/XqKMWlrAqnE/google-chrome-why-i-hate-it-and-continue-to-use-it.html" />
   <updated>2011-05-31T00:00:00-07:00</updated>
   <id>http://jtaby.com/2011/05/31/google-chrome-why-i-hate-it-and-continue-to-use-it</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; striked-through a reference to the search bar overlapping search results. &lt;a href="http://littlebigdetails.com/post/6000057345/chrome-if-a-result-is-behind-the-search-form-it"&gt;It doesn&amp;#8217;t do that&lt;/a&gt;. (thanks to everyone who let me know).&lt;/p&gt;
&lt;p&gt;This is the third time I have tried to use Chrome. The first two attempts lasted two days before I uninstalled it and went back to the comfort of Safari. Every time I use it, I end up &lt;a href="http://twitter.com/#!/jtaby/status/72782341659045888"&gt;venting&lt;/a&gt; my frustrations on twitter and face the inevitable backlash from my Chrome-loving followers. My problems with Chrome always revolved around its UI and UX, and this post will highlight the reasons I reached my conclusions.&lt;/p&gt;
&lt;p&gt;First, I&amp;#8217;ll highlight the things that Chrome gets right. Credit where credit&amp;#8217;s due, and all that.&lt;/p&gt;
&lt;h2&gt;The Good&lt;/h2&gt;
&lt;p&gt;My current attempt to use Chrome as my default browser is much more successful than the previous ones. I&amp;#8217;ve been using it for just over a week now and have finally gotten over the initial hump of disappointment. My hypothesis is that every time I try to use Chrome, I end up interacting with the browser itself for two days and not really using it to browse the internet. Once I got past the UI issues, I found Chrome to be a fine browser.&lt;/p&gt;
&lt;h3&gt;Unified search/location fields&lt;/h3&gt;
&lt;p&gt;By far, my favorite feature of Chrome is its unification of the search bar and the location bar:&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/unified_bar.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/unified_bar.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This combination eliminates a decision every time I search/go somewhere. Not only that, sometimes I find myself switching between a search query and a &lt;span class="caps"&gt;URL&lt;/span&gt; mid-way through typing it!&lt;/p&gt;
&lt;h3&gt;Tab closing behavior&lt;/h3&gt;
&lt;p&gt;This one should already be &lt;a href="http://littlebigdetails.com/post/2925192794/chrome-when-closing-tabs-in-chrome-the-position"&gt;familiar&lt;/a&gt; to you.&lt;/p&gt;
&lt;h3&gt;Tab exposé&lt;/h3&gt;
&lt;p&gt;This is an opt-in feature of the Canary builds which you can enable in &lt;ins&gt;about:flags&lt;/ins&gt;&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/tab_expose.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/tab_expose.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;When I first found out about this feature, I thought it was a gimmicky but I found it works great especially with the trackpad (swipe three fingers down to activate).&lt;/p&gt;
&lt;h3&gt;Recently Closed / Restore session&lt;/h3&gt;
&lt;p&gt;These two go hand-in-hand, basically, being able to restore a session or re-open a recently-closed tab has saved my butt a few times and I appreciated the feature.&lt;/p&gt;
&lt;h3&gt;Developer Tools&lt;/h3&gt;
&lt;p&gt;The Chrome team has added some amazing debugging and inspecting tools to the webkit inspector (and they broke a bunch more, but we&amp;#8217;ll get to that later). I find myself much more productive when debugging my web apps in Chrome vs. Safari.&lt;/p&gt;
&lt;h3&gt;The Update Process&lt;/h3&gt;
&lt;p&gt;&amp;#8230;or lack thereof. The fact that Chrome sends you tiny diffs and updates its binary is amazing on a technical and UX level. It completely blurs the line between native and web app and I strong-heartedly stand behind this. More apps should do this and someone should release a framework that simplifies it.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 style="vertical-align:middle;"&gt;The Bad&lt;/h2&gt;
&lt;p&gt;This is a list of what bugs me about Chrome. I will admit that on their own, a lot of these are tiny issues, but in aggregate, they form a sloppy browser. Death by a thousand cuts.&lt;/p&gt;
&lt;h3&gt;Lack of &lt;span class="caps"&gt;RGB&lt;/span&gt; Anti-Aliasing&lt;/h3&gt;
&lt;p&gt;Take a look at this zoomed-in screenshot of the New Tab page:&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/bw_anti_aliasing.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/bw_anti_aliasing.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Notice how it&amp;#8217;s using Black &amp;amp; White anti-aliasing? My guess is that they have&lt;br /&gt;
the text on a hardware-accelerated layer and not setting a background color on it, which causes the text to lose the anti-aliasing.&lt;/p&gt;
&lt;p&gt;Look what happens when I give it a &lt;ins&gt;background-color: white;&lt;/ins&gt;&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/rgb_anti_aliasing.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/rgb_anti_aliasing.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Why this is something the Google engineers don&amp;#8217;t do is beyond me. This happens in multiple places throughout the UI, not just the New Tab page.&lt;/p&gt;
&lt;h3&gt;Terrible &lt;span class="caps"&gt;PDF&lt;/span&gt; font-rendering&lt;/h3&gt;
&lt;p&gt;Chrome uses a non-native &lt;span class="caps"&gt;PDF&lt;/span&gt; viewer. That isn&amp;#8217;t an inherently bad thing, you can be better than the native alternative, but this is anything but. Compare the text in the picture below between Safari&amp;#8217;s &lt;span class="caps"&gt;PDF&lt;/span&gt; viewer and Chrome&amp;#8217;s &lt;span class="caps"&gt;PDF&lt;/span&gt; viewer.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/pdf_font.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/pdf_font.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;The Downloads Page&lt;/h3&gt;
&lt;p&gt;This one is a double-whammy. In Chrome, the downloads page opens in a separate tab, as opposed to a separate window (like Safari, Firefox, etc. all do).&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/download_page.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/download_page.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Here&amp;#8217;s my problem with this: Because the downloads window is a tab within the same Chrome window, they needed to add extra UI to show you the progress of your downloads are you browse. The way they do this is using the Downloads bar:&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/download_bar.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/download_bar.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This bar eats up 43px of screen real-estate in the browser. If you wanted to reclaim your space, you can&amp;#8217;t monitor the status of your downloads. If you don&amp;#8217;t hide it, it stays visible long after all the downloads are done.&lt;/p&gt;
&lt;p&gt;This is a solution to a problem that shouldn&amp;#8217;t exist. By making the downloads manager a separate window, you can monitor it while you browse. Not only that, but you can view individual progress of your downloads vs. the aggregate.&lt;/p&gt;
&lt;p&gt;You &lt;em&gt;could&lt;/em&gt; tear-off the downloads tab and treat it as a separate window, but not only does that require user action, the UI isn&amp;#8217;t designed to be compact, so you still can&amp;#8217;t make the window small and get meaningful information.&lt;/p&gt;
&lt;h3&gt;The Title Bar&lt;/h3&gt;
&lt;p&gt;Because the tabs live in the title bar, and because the rest of the chrome (note the lowercase c) is not-draggable, the effective draggable area in Chrome is a thin 10px strip at the top of the window.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/drag_bar.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/drag_bar.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I&amp;#8217;ve highlighted the section of the window which you can drag. It&amp;#8217;s tiny!&lt;/p&gt;
&lt;p&gt;The second problem with the tab bar being in the title bar is that when you have many tabs open, you have to rely on a tooltip to figure out what the title of the tab is.&lt;/p&gt;
&lt;h3&gt;Massive Preference List&lt;/h3&gt;
&lt;p&gt;When I first started using Chrome, I thought the preferences-as-a-tab was a heinous crime against humanity, however, after using it for a week, I&amp;#8217;ve come to the conclusion that it doesn&amp;#8217;t inherently present a UX problem. What does present a UX problem however, is the massive number of preferences Chrome exposes to the user:&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/preferences.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/preferences.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I recognize that most people won&amp;#8217;t peek &amp;#8220;Under the Hood&amp;#8221; but for most people, the large number of options makes finding what you want hard, even with the search feature.&lt;/p&gt;
&lt;h3&gt;Favicons Everywhere&lt;/h3&gt;
&lt;p&gt;I hesitated at first to list this, thinking it was too subjective. However, upon further consideration, I feel like I can lay out an argument for why it is actually bad.&lt;/p&gt;
&lt;p&gt;Consider this site. I&amp;#8217;ve put a lot of work into making sure that this website is as simple as possible, allowing you to, the reader, to focus as much as possible on the content without any distractions. However, in a typical session in Chrome, you&amp;#8217;re innundated with favicons in the location bar, in the tab bar, and in the bookmarks bar. This not only clutters and cheapens the chrome of the browser itself, but it also distracts from the aesthetics of the article and impacts the motif I&amp;#8217;ve built.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/favicons.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/favicons.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Another problem is that favicons are duplicated on the tab bar and on the bookmarks bar. However, the address bar doesn&amp;#8217;t include them (just has that globe icon). This means that you end up seeing the same favicon multiple times unnecessarily, adding to the clutter.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/multiple_favicons.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/multiple_favicons.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;While we&amp;#8217;re on the topic of bookmarks. Notice that &amp;#8220;Other Bookmarks&amp;#8221; button? It&amp;#8217;s empty. there&amp;#8217;s the &amp;#8220;»&amp;#8221; button next to it, that shows me the &amp;#8220;other bookmarks&amp;#8221; which I can&amp;#8217;t see because they don&amp;#8217;t fit, but &amp;#8220;Other Bookmarks&amp;#8221; apparently means something else. I assume it means regular bookmarks (not on the bookmarks bar), but I couldn&amp;#8217;t figure out how to add a page to that list.&lt;/p&gt;
&lt;h3&gt;Search Field&lt;/h3&gt;
&lt;p&gt;The search field covers the content of the site, if you &lt;del&gt;were searching and a match was under the field, or you&lt;/del&gt; wanted to click a link/button under the search field, you&amp;#8217;re out of luck.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/search.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/search.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;In the case of a web app with a toolbar (This screenshot shows MobileMe, but the same UI model exists in most web apps), the search field actually covers the main parts of the UI, you have to dismiss it before you can use the app!&lt;/p&gt;
&lt;h3&gt;Status Bar&lt;/h3&gt;
&lt;p&gt;The status bar can be in one of three states: Bottom left, hanging off the window if it fits, or on the bottom-right. As you move your mouse in the bottom left corner, the status bar will move and jump around erratically.&lt;/p&gt;
&lt;p&gt;This is a video showing the problem. (h.264 mov)&lt;/p&gt;
&lt;video src="/resources/chrome-good-bad-ugly/status_bar.mov" controls&gt;
&lt;p&gt;Your browser does not support the video tag. You should probably not be reading this blog post.&lt;/p&gt;
&lt;/video&gt;
&lt;h3&gt;The New Tab Page&lt;/h3&gt;
&lt;p&gt;The list of tabs is horizontal, instead of vertical, there&amp;#8217;s not enough space to read the title, and it&amp;#8217;s hard to quickly and visually see what page is what.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: In the Canary builds, there&amp;#8217;s an option in about:flags to enable an experimental Tab Page which is much better.&lt;/em&gt;&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/bad_tab_page.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/bad_tab_page.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;The Tab Bar&lt;/h3&gt;
&lt;p&gt;Again, because the tab bar is in the title bar, if you have a lot of tabs open, you end up having to hunt for the tab you want, and you can&amp;#8217;t read the title of the tab you&amp;#8217;re on.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/tab_bar.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/tab_bar.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Loading UI&lt;/h3&gt;
&lt;p&gt;When a new page/tab is loading, the only indication is a small spinner in the tab. I continuously find myself wondering whether or not Chrome is doing something or not.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/loading.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/loading.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Can you tell at a glance whether this site is loading or not? (By glancing at the chrome, most sites don&amp;#8217;t have a giant &amp;#8220;Loading&amp;#8221; UI in the middle of the page.)&lt;/p&gt;
&lt;h3&gt;Lack of Attention-to-Detail throughout&lt;/h3&gt;
&lt;p&gt;Everywhere you look, things are mis-aligned, and broken. Here are a couple of examples:&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/broken_gradient.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/broken_gradient.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Broken gradient in the toolbar of the Developer Tools&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/weird_selection.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/weird_selection.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Not only is this using ugly and non-standard menus, but the first item remains curiously selected.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/bad_menu.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/bad_menu.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;There is a highlighted item in this menu, can you find it? Neither can I.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve counted three different menu styles in Chrome. The bookmark bar menu, the contextual menu in the bookmarks manager, and the customized native one in the Tools menu. This creates a confusion among users as the three menus behave slightly differently.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/text_overlay.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/text_overlay.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Notice how the error icon overlaps filter list in the Network tab of the inspector.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/weird_sorting.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/weird_sorting.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;To change the sorting, you have to click on a header of a column (no indication that it&amp;#8217;s clickable), and then select from a drop down. Who came up with this one?&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/resize_handle.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/resize_handle.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;When you open a new tab and go to a page with a scrollbar, it overlaps the resize handler.&lt;/p&gt;
&lt;h3&gt;The Network Tab&lt;/h3&gt;
&lt;p&gt;The Network Tab is an addition to the webkit inspector that still hasn&amp;#8217;t made sense to me. Before it was introduced, The Resources tab was where you go to browse the&amp;#8230;resources (js, css, html, xhr, etc) of your page and inspect the response/request headers. Now, you can access the same information in both the Resources tab and the Network tab in different UIs. The Resources tab doesn&amp;#8217;t require a refresh, but the Network tab does.&lt;/p&gt;
&lt;p&gt;The Network tab is also one of three ways you can view the contents of a file. Imagine an email app that has three different places to show you the list of emails in your inbox, in the same exact format, in three different places of the app.&lt;/p&gt;
&lt;p&gt;To add insult to injury, the Network tab is the only place you can view the size/time statistics of your application, but you can&amp;#8217;t view aggregate data. If someone could explain to me why the Network tab exists, I would be grateful.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/network_tab.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/network_tab.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Non-native behavior, Native look&lt;/h3&gt;
&lt;p&gt;Go to the developer tools, notice how it looks like it has a unified toolbar? Funny thing about that is, you can&amp;#8217;t actually drag anywhere other than the title bar. Again, I&amp;#8217;ve highlighted the area of the toolbar that&amp;#8217;s clickable.&lt;/p&gt;
&lt;div class="image-row"&gt;&lt;div class="image-container" style="background-image:url(/resources/chrome-good-bad-ugly/dev_tools_drag.png)"&gt;&lt;img src="/resources/chrome-good-bad-ugly/dev_tools_drag.png"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;It&amp;#8217;s been just over a week by now, and I continue to use Chrome. It may seem hypocritical, but the combination of search and address bar and the rate of iteration keep me hooked. I think it&amp;#8217;s a bit like gambling, I keep using it with the hope that tomorrow all these problems will be fixed. As an anecdote, Google announces things like &lt;a href="http://blog.chromium.org/2011/05/chrome-developer-tools-put-javascript.html"&gt;memory inspection&lt;/a&gt; that keep my interest in Chrome high. I feel like there&amp;#8217;s a lesson here for other projects, maybe it deserves its own blog post.&lt;/p&gt;
&lt;p&gt;As I said previously, a lot of these issues are small, but they add up to a broken experience and lots of little frustrations. I expect a lot of people to tell me that they don&amp;#8217;t mind a lot of these problems, or that a lot of these problems are not in fact, problems. Finally, I also realize some of the problems tend to be subjective, but you came looking for my opinion, and I opined :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/XqKMWlrAqnE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/05/31/google-chrome-why-i-hate-it-and-continue-to-use-it.html</feedburner:origLink></entry>
 
 <entry>
   <title>What I Learned From Releasing My First Open Source Project</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/6oLGZSxXsc8/what-i-learned-from-releasing-my-first-open-source-project.blog.html" />
   <updated>2011-05-30T00:00:00-07:00</updated>
   <id>http://jtaby.com/2011/05/30/what-i-learned-from-releasing-my-first-open-source-project.blog</id>
   <content type="html">&lt;p&gt;Yesterday was a roller coaster ride. I woke up in the morning, fleshed out a quick &lt;span class="caps"&gt;README&lt;/span&gt; file, took a screenshot and a screencast, and launched my very first open source project. The project is called &lt;a href="https://github.com/jtaby/Waldo"&gt;Waldo&lt;/a&gt; now, but it released under the name &amp;#8220;VimAck&amp;#8221;, and it was under that name that it hit the &lt;a href="http://news.ycombinator.com/item?id=2597166"&gt;front page&lt;/a&gt; of Hacker News.&lt;/p&gt;
&lt;p&gt;In the meantime, The repository has 105 watchers, I&amp;#8217;ve merged three pull requests, I&amp;#8217;ve implemented 2 new features, and also released two new versions. All in the span of 20 hours. Like I said, roller coaster ride.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve had some time to think about my experience overnight, and I&amp;#8217;ve already had to learn a bunch of lessons I thought I&amp;#8217;d share with you.&lt;/p&gt;
&lt;h2&gt;Be your own QA department&lt;/h2&gt;
&lt;p&gt;When I released version 0.1, the search button was labeled &amp;#8220;Button&amp;#8221;. I had shown the app to 3 friends before releasing it, but everyone assumed I would change it before release. I even took a screenshot/cast with it and even published it live! I wouldn&amp;#8217;t have even noticed had it not been for a &lt;a href="https://twitter.com/appden/status/74942643670491137"&gt;friend on twitter&lt;/a&gt;. Basically, what happened was that I assumed it worked for the simple case I was developing it with and was so focused on getting it to work I forgot to actually change the label.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve gotten better at with version 0.3. Before release, I go through both the installation, setup, and usage process, as well as the upgrade and usage process. The only person you can trust is yourself and that&amp;#8217;s the only way you can ensure everything is running smoothly.&lt;/p&gt;
&lt;p&gt;Something I do want to work on though, is automated testing. This is my first real Cocoa project and I&amp;#8217;m not familiar with how testing is done, and it&amp;#8217;s something I have to learn.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Takeaway&lt;/strong&gt;: Rely on your own tests to ensure that things are running, and do it all before each release.&lt;/p&gt;
&lt;h2&gt;Choose a name wisely, and stick to it&lt;/h2&gt;
&lt;p&gt;VimAck, the name I released under, was chosen as a working title, and I was so involved in building the first version and caught up in the feedback it released, I forgot to change it.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s a terrible name. I couldn&amp;#8217;t ever remember whether it was VimAck or AckVim, there was already a similar vim plugin called ack.vim, and it just sounded bad.&lt;/p&gt;
&lt;p&gt;But here&amp;#8217;s the problem with renaming a released project: People have already forked the old repository, links all over are pointing to the old repository, and Sparkle has problems updating to a different app name!&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve decided to take the hit early, after all, there were only 7 forker and 80 watchers at the time, and it&amp;#8217;s better to do it soon rather than get stuck with a terrible name in the long run.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Takeaway&lt;/strong&gt;: Changing the project&amp;#8217;s name is costly, consider and reconsider your project&amp;#8217;s name before launch.&lt;/p&gt;
&lt;h2&gt;Lower the barrier to contribution&lt;/h2&gt;
&lt;p&gt;In my opinion, one of the most rewarding aspects of open source software is receiving contributions from the community. A pull request is both a validation that you have created something of value to other people, and that you have created an ecosystem that encourages other developers to pitch in.&lt;/p&gt;
&lt;p&gt;For example, &lt;a href="http://github.com/zef"&gt;zef&lt;/a&gt; came up with the great idea of auto-installing the vim plugin on launch. That was something I hadn&amp;#8217;t thought of myself. &lt;a href="http://github.com/ashchan"&gt;ashchan&lt;/a&gt; did the work to make Waldo show up as a status menu item. That is something I had wanted to do, but didn&amp;#8217;t know how.&lt;/p&gt;
&lt;p&gt;However, you can&amp;#8217;t expect people to come up with contribution ideas themselves, which is why I added a &amp;#8220;Roadmap&amp;#8221; section to the &lt;span class="caps"&gt;README&lt;/span&gt; on Waldo and outlined the upcoming features. I also commented the most code-heavy files in the project and outlined to people how they can contribute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Takeaway&lt;/strong&gt;: Do as much work as you can to streamline the contribution process to your users.&lt;/p&gt;
&lt;h2&gt;Your first release should be a full package&lt;/h2&gt;
&lt;p&gt;The first release was really only for me to show off my weekend project. What I didn&amp;#8217;t anticipate was 100 people to watch it, and 120 people to download it. The problem with releasing what was essentially a demo, is that it wasn&amp;#8217;t a full package. What I mean by package, is that it not only has support for the core set of features, but it also has a mechanism to update, an icon, a web presence, a way for people to contribute, and a way for people to file bugs.&lt;/p&gt;
&lt;p&gt;Github takes care of most of those problems. Github is truly one of the best things to happen to open source software. I don&amp;#8217;t think it&amp;#8217;s hyperbolic to say that the world of open source would look a lot different without it. What I didn&amp;#8217;t do, however, was include support for &lt;a href="http://sparkle.andymatuschak.org/"&gt;Sparkle.framework&lt;/a&gt; which meant that for people who wanted to upgrade to VimAck 0.2, they have to know that there&amp;#8217;s a new version, and they have to manually download it.&lt;/p&gt;
&lt;p&gt;To add insult to injury, the renaming of the project from VimAck to Waldo meant that the upgrade mechanism doesn&amp;#8217;t work. Hopefully nobody will face these issues anymore and everything will be smooth sailing from here on forth.&lt;/p&gt;
&lt;p&gt;It still doesn&amp;#8217;t have an icon, but that&amp;#8217;s because I haven&amp;#8217;t come up with a good idea for one, but would love to have someone contribute one for me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Takeaway&lt;/strong&gt;: Provide a complete package to your users, not just a demo.&lt;/p&gt;
&lt;h2&gt;Be upfront with your users&lt;/h2&gt;
&lt;p&gt;The problems with Sparkle and with the renaming caused a lot of headache. For one, a pull requests was broken and was tough to merge, people who forked had bad remote URLs, and people had to upgrade manually from 0.1 to 0.2. As a user, this experience sucks, and there&amp;#8217;s no way around it. As the care-taker of the repo, I felt like my trust with the contributors was broken. To amend it, I messaged everyone who submitted a pull request and told them what happened, and I also set up a placeholder &lt;span class="caps"&gt;README&lt;/span&gt; on the old &lt;a href="http://github.com/jtaby/VimAck"&gt;VimAck repo&lt;/a&gt; with instructions to people who forked on how to update their repository.&lt;/p&gt;
&lt;p&gt;I felt like the communication is especially important in the open source space and it helped people figure out what was happening with the project. Communication is essential since you have people in different parts of the world trying to touch the same codebase and having a clear narrative is essential.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Takeaway&lt;/strong&gt;: When you make a mistake, &amp;#8217;fess up to it, and provide remedies.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The project is only a day old, and I continue to learn a lot about project management, community building, and communication in general. I hope you can take away a thing or two from my experience with open source. It is incredibly satisfying to see people appreciate and use your software and I thank everyone who helped fork/contribute and those who downloaded!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/6oLGZSxXsc8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2011/05/30/what-i-learned-from-releasing-my-first-open-source-project.blog.html</feedburner:origLink></entry>
 
 <entry>
   <title>Reflexions on my 23rd Year</title>
   <link href="http://feedproxy.google.com/~r/majd-taby/~3/xZ19VILU_m8/reflexions-on-my-23rd-year.html" />
   <updated>2010-12-10T00:00:00-08:00</updated>
   <id>http://jtaby.com/2010/12/10/reflexions-on-my-23rd-year</id>
   <content type="html">&lt;p&gt;&lt;em&gt;This post is written by me, to my future me, in a public way. Hopefully I won&amp;#8217;t regret this decision&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hey Majd, this is your 23 year old self. Let me tell you about this year just in case you need a refresher. Hopefully you&amp;#8217;ll have done this every birthday and if you don&amp;#8217;t, what the fuck is wrong with you? This shit will come in handy when you write an autobiography about yourself.&lt;/p&gt;
&lt;p&gt;22 was a good year. Following up the best summer of my life (Apple class of 2009 representin&amp;#8217;!), I crammed 3 semesters into 2 so I can get the fuck out of school, graduate, and start my life. Winter 2010 was a busy semester, but it was also the semester I started drawing again, founded the iPhone Developers Club, was president of &lt;span class="caps"&gt;CSE&lt;/span&gt; Scholars, and took some awesome courses. Mostly, I spent most of the semester waiting for graduation. May 1st came, Obama spoke, and I walked.&lt;/p&gt;
&lt;p&gt;After graduation, I started waiting to start my job. The team was so much fun last summer and I learned so much, I couldn&amp;#8217;t wait to start. May 18th came along, and I head off to Cupertino. Two days later, I found a room in a house in the Castro and decided to move into it. I wonder what this experience will seem like to you in hindsight.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m 7 months into my job now and it&amp;#8217;s a blast. My coworkers are my best friends and my managers are incredible. The work is challenging, frustrating, fun, and unpredictable, just the way I like it. I&amp;#8217;m half way through losing 80 pounds (at 45 right now), and it has already begun to change my life.&lt;/p&gt;
&lt;p&gt;So to recap: When I was 22, I graduated, moved to San Francisco, lost 45 pounds, released some of my best code yet. Like I said, it was a good year.&lt;/p&gt;
&lt;p&gt;Now that the &amp;#8220;what&amp;#8221; is covered, I&amp;#8217;ll dig deeper. Here are things that I&amp;#8217;m thinking about right now.&lt;/p&gt;
&lt;p&gt;Wait, before I start. I want you to remember this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Here’s to the crazy ones. &lt;br /&gt;
The misfits. The rebels. The troublemakers. &lt;br /&gt;
The round pegs in the square holes. &lt;br /&gt;
The ones who see things differently. &lt;br /&gt;
They’re not fond of rules. &lt;br /&gt;
And they have no respect for the status quo. &lt;br /&gt;
You can quote them, disagree with them, glorify or vilify them. &lt;br /&gt;
About the only thing you can’t do is ignore them. &lt;br /&gt;
Because they change things.&lt;br /&gt;
They push the human race forward. &lt;br /&gt;
And while some may see them as the crazy ones, we see genius. &lt;br /&gt;
Because the people who are crazy enough to think they can change the world, &lt;br /&gt;
are the ones who do.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;School. What it meant, what came of it.&lt;/h3&gt;
&lt;p&gt;Was school a waste of time? I haven&amp;#8217;t decided yet. On the one hand, I know for a fact that had I not gone to school, I would&amp;#8217;ve accomplished a lot more professionally. On the other, I really value the friendships I built during school, and wouldn&amp;#8217;t trade them for anything. Besides, I didn&amp;#8217;t end up in a bad place, so maybe it all turned out for the better. The thought of having left Michigan 4 years earlier than I did sounds amazing though.&lt;/p&gt;
&lt;h3&gt;Current Thoughts&lt;/h3&gt;
&lt;p&gt;What is going through my mind right now? Work, weight-loss, and girls, in that order.&lt;/p&gt;
&lt;p&gt;Professionally speaking, work is going great, but I&amp;#8217;m trying to figure out what my next move is. I&amp;#8217;m happy where I am right now, but I realize it&amp;#8217;s not a permanent gig. The more time I spend in the industry, the more I realize how much shit there is out there. Not just that, but how much people don&amp;#8217;t care. I&amp;#8217;m not the most technically impressive engineer, nor do I claim to be. What I am (or, think I am), is a craftsman. In terms of money and success, I&amp;#8217;m starting to realized that I&amp;#8217;m not really after &amp;#8220;the big exit&amp;#8221;. I want to be successful, to be sure. I want my income to satisfy my ridiculous lifestyle and then some, but that doesn&amp;#8217;t require a hundred-million dollar bank account. The reason I say that is because I feel like given a more bounded business, I can focus on making products in a life where money is not a limiting factor. I might be an idiot for thinking that, and I may change my opinion. I want to build products, and sell them.&lt;/p&gt;
&lt;p&gt;When I&amp;#8217;m not working, I&amp;#8217;m primarily thinking about weight-loss. I&amp;#8217;ve lost 45 pounds so far, and I want to lose 35 more. I just started reading The Hacker&amp;#8217;s Diet and it seems to align itself perfectly with my approach to dieting. I&amp;#8217;m thinking of starting some kind of blog where I keep track of my stats and write about how I&amp;#8217;m doing, hoping to influence someone else.&lt;/p&gt;
&lt;p&gt;Thanks to my coworkers who first got me running in the morning before work and biking with them after work, I unintentionally lost 20 pounds, and when I saw the improvements, I kept going. Now that I&amp;#8217;ve gone from shirts XL to Medium, and pants from size 40 to 34, I see the profound ways in which being fit and healthy can affect my life. Biking down a mountain, hiking up a mountain, running in races, these are all new experiences for me. These are all things I couldn&amp;#8217;t have done no matter how hard I tried 7 months ago. When I go shopping now, I don&amp;#8217;t leave depressed, when I go to the gym, I don&amp;#8217;t have to keep holding the towel up as I go to the shower. It&amp;#8217;s the little things. Things that to other people seems completely benign, are completely new experiences for me. Majd, if you gained back the weight, then &lt;span class="caps"&gt;FUCK&lt;/span&gt; &lt;span class="caps"&gt;YOU&lt;/span&gt;! You should first be ashamed, then on a diet.&lt;/p&gt;
&lt;p&gt;Girls. Girls girls girls&amp;#8230;.There aren&amp;#8217;t a lot of Christian Arab girls around here, at least not that I can tell. I guess American girls are cool too, just not the crazy variety. Are you single still? lower your god damned standards! Right now I&amp;#8217;m not &amp;#8220;looking&amp;#8221; to find someone. I&amp;#8217;m waiting to lose the rest of my weight.&lt;/p&gt;
&lt;h3&gt;Attitude&lt;/h3&gt;
&lt;p&gt;Majd, you always look forward, never backwards. When you moved from Sayyidet Al-Farah to &lt;span class="caps"&gt;IISA&lt;/span&gt;, you learned to speak fluent English. When you moved from &lt;span class="caps"&gt;IISA&lt;/span&gt; to Livonia, you picked up web  development. When you moved from Livonia to Ann Arbor, you got a job at Apple. When you moved to Apple&amp;#8230;well I&amp;#8217;m still here, I don&amp;#8217;t know what you did but whatever it is, it better be a step up. Always look ahead.&lt;/p&gt;
&lt;h3&gt;Closing Quote&lt;/h3&gt;
&lt;p&gt;Heed these words, Majd.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There&amp;#8217;s work, and there&amp;#8217;s your life&amp;#8217;s work.&lt;br /&gt;
The kind of work that has your fingerprints all over it.&lt;br /&gt;
The kind of work that you&amp;#8217;d never compromise on.&lt;br /&gt;
That you&amp;#8217;d sacrifice a weekend for.&lt;br /&gt;
You can do that work here.&lt;br /&gt;
People don&amp;#8217;t come here to play it safe.&lt;br /&gt;
They come here to swim in the deep end.&lt;br /&gt;
They want their work to add up to something.&lt;br /&gt;
Something big. Something that couldn&amp;#8217;t happen anywhere else.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Swim in the deep end. Always.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/majd-taby/~4/xZ19VILU_m8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://jtaby.com/2010/12/10/reflexions-on-my-23rd-year.html</feedburner:origLink></entry>
 
 
</feed>
