<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Shaun Abram &#187; Events</title>
	<atom:link href="http://www.shaunabram.com/category/events/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.shaunabram.com</link>
	<description>Java and Technology weblog</description>
	<lastBuildDate>Wed, 18 Jan 2012 00:39:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>JavaOne: Tuesday&#8217;s Keynote</title>
		<link>http://www.shaunabram.com/javaone2011-tuesday-keynote/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=javaone2011-tuesday-keynote</link>
		<comments>http://www.shaunabram.com/javaone2011-tuesday-keynote/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 18:28:53 +0000</pubDate>
		<dc:creator>sabram</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[javaone]]></category>
		<category><![CDATA[javaone2011]]></category>

		<guid isPermaLink="false">http://www.shaunabram.com/?p=1416</guid>
		<description><![CDATA[This morning&#8217;s Keynote at JavaOne contained a few interesting announcements, including JDK7 for MacOS X Developer Preview announced by Hasan Rizvi (SVP @ Oracle). Available here. Java FX to be open sourced, and it will be proposed to the JCP (Confirmed, see press release) JDK8 will be released in the summer of 2013 (not 2012 [...]]]></description>
			<content:encoded><![CDATA[<p>This morning&#8217;s Keynote at JavaOne contained a few interesting announcements, including</p>
<ul>
<li>JDK7 for MacOS X Developer Preview announced by Hasan Rizvi (SVP @ Oracle). Available <a href="http://jdk7.java.net/macportpreview/">here</a>.</li>
<li>Java FX to be open sourced, and it will be proposed to the JCP (Confirmed, see <a href="http://www.oracle.com/us/corporate/press/512728">press release</a>)</li>
<li>JDK8 will be released in the summer of 2013 (not 2012 as previously discussed), as announced by Adam Messinger from Oracle</li>
</ul>
<p>There was also mention of an <a href="http://www.oracle.com/technetwork/java/javamagazine/index.html">Oracle Java Magazine</a>, which I confess I had never heard of before.</p>
<p>For a summary of this morning&#8217;s announcements, see <a href="http://blogs.oracle.com/otn/entry/the_most_exciting_oracle_openworld">here</a>.</p>
<p>Overall, not the most exciting keynote I have seen. It opened with a presentation from Juniper Networks. I didn&#8217;t find the topic of &#8220;Programming the network&#8221; to bring networks and apps closer together particular relevant for me personally. They then rolled out a bunch of other corporate folks from the likes of Intel, Redhat, IBM and ARM. The Twitter guy did announce that Twitter are joining OpenJDK as well as the JCP though.</p>
<p>On to the sessions&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shaunabram.com/javaone2011-tuesday-keynote/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>@JavaOne</title>
		<link>http://www.shaunabram.com/javaone2011/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=javaone2011</link>
		<comments>http://www.shaunabram.com/javaone2011/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 00:26:57 +0000</pubDate>
		<dc:creator>sabram</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[javaone]]></category>
		<category><![CDATA[javaone2011]]></category>

		<guid isPermaLink="false">http://www.shaunabram.com/?p=1403</guid>
		<description><![CDATA[I am at JavaOne 2011 right now. Always fun and it seems to be bigger than last year, with a huge selection of talks and presentations (although frustratingly flaky wifi!). Some of the themes of this morning&#8217;s keynote talk were JavaFX 2.0, what will be coming in Java 8 and a new Oracle NoSQL Database. [...]]]></description>
			<content:encoded><![CDATA[<p>I am at JavaOne 2011 right now. Always fun and it seems to be bigger than last year, with a huge selection of talks and presentations (although frustratingly flaky wifi!).</p>
<p>Some of the themes of this morning&#8217;s keynote talk were JavaFX 2.0, what will be coming in Java 8 and a new Oracle NoSQL Database. There are some links <a href="http://blogs.oracle.com/otn/entry/the_most_exciting_oracle_openworld">here</a>, <a href="http://www.theserverside.com/feature/JavaOne-Keynote-Duke-Cloud-JavaFX-and-Glassfish">here</a> and <a href="http://www.infoq.com/news/2011/10/javaone-tech-keynote">here</a> (and I believe the videos will be posted soon <a href="http://www.oracle.com/javaone/live/on-demand/index.html">here</a>).</p>
<p>I just attended a very useful Java Web Framework comparison talk that I will try to post about shortly. I also met up with some of the <a href="http://java.dzone.com/">DZone</a> team. For now, I am going to some JavaFX talks.</p>
<p>If any of you are attending, let me know!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shaunabram.com/javaone2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Final day at JavaOne</title>
		<link>http://www.shaunabram.com/final-day-at-javaone/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=final-day-at-javaone</link>
		<comments>http://www.shaunabram.com/final-day-at-javaone/#comments</comments>
		<pubDate>Tue, 28 Sep 2010 15:55:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[javaone]]></category>

		<guid isPermaLink="false">http://www.shaunabram.com/?p=997</guid>
		<description><![CDATA[I posted some notes about my final day at JavaOne to theServerSide. At the moment, currently on the front page. Cool http://www.theserverside.com/news/thread.tss?thread_id=60987]]></description>
			<content:encoded><![CDATA[<p>I posted some notes about my final day at JavaOne to theServerSide. At the moment, currently on the front page. Cool <img src='http://www.shaunabram.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
<a href="http://www.theserverside.com/news/thread.tss?thread_id=60987">http://www.theserverside.com/news/thread.tss?thread_id=60987</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.shaunabram.com/final-day-at-javaone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSCON Day4: WebSockets</title>
		<link>http://www.shaunabram.com/oscon-day4-websockets/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oscon-day4-websockets</link>
		<comments>http://www.shaunabram.com/oscon-day4-websockets/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 01:03:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[comet]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[oscon]]></category>
		<category><![CDATA[websockets]]></category>

		<guid isPermaLink="false">http://www.shaunabram.com/?p=882</guid>
		<description><![CDATA[The first talk of the day I attended at Day 4 of OSCON was from Sean Sullivan (Aravo), who gave a talk on &#8220;Programming WebSockets&#8220;. Intro WebSockets is a technology that enables bidirectional communication between web browsers and server side processes. It provides a persistent connection between client &#038; Server, hence enabling &#8216;push&#8217; abilities where [...]]]></description>
			<content:encoded><![CDATA[<p>The first talk of the day I attended at Day 4 of <a href="http://www.oscon.com/oscon2010">OSCON</a> was from Sean Sullivan (<a href="http://www.aravo.com/">Aravo</a>), who  gave a talk on &#8220;<a href="http://www.oscon.com/oscon2010/public/schedule/detail/13805">Programming WebSockets</a>&#8220;.</p>
<h3>Intro</h3>
<p><a href="http://en.wikipedia.org/wiki/WebSockets">WebSockets</a> is a technology that enables bidirectional communication between web browsers and server side processes. It provides a persistent connection between client &#038; Server, hence enabling &#8216;push&#8217; abilities where you can push data/notification to browsers from the client. Other client communication options to compare it with would be <a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29">Ajax</a><br />
and <a href="http://en.wikipedia.org/wiki/Comet_%28programming%29">Comet</a> (basically Ajax with long polling).</p>
<p><span id="more-882"></span> </p>
<h3>Specifications</h3>
<ul>
<li><a href="http://dev.w3.org/html5/websockets/">WebSockets API</a> &#8211; This focuses on the client side programming model.</li>
<li><a href="http://www.whatwg.org/specs/web-socket-protocol/">WebSockets protocol</a> &#8211; Describes the client/server communication in more detail. More complicated and 51 pages long. The WebSockets protocol is still actively being changed.</li>
</ul>
<h3>Browser Support</h3>
<ul>
<li>Google Chrome 4.0.249.0 and higher (v5 has WebSockets enabled by default)</li>
<li>Safari 5.0</li>
<li>FireFox 4.0 beta 1</li>
<li>
IE 9: TBD</li>
</ul>
<p>There was a suggestion that Apple have decided to disable WebSockets in iOS4 but this is unconfirmed and the speaker suspects Apple will support WebSockets in the future.</p>
<h3>Server side support</h3>
<ul>
<li>Apache Server &#8211; not supported yet</li>
<li><a href="http://code.google.com/p/pywebsocket/">Py WebSocket</a> &#8211; designed for use with Apache Server (actually implemented by Google Chromium team.)</li>
<li>There is also a DJango solution: <a href="http://pypi.python.org/pypi/django-websocket/">django-websocket</a></li>
<li><a href="http://blogs.webtide.com/gregw/entry/jetty_websocket_server">Jetty WebSocket Server</a> &#8211; Jetty has supported WebSockets since last September. This seems to be a good option.</li>
</ul>
<p>However, note that there is no standard service side Java API. Each Java container has it&#8217;s own API. Therefore it will likely be difficult to write WebSockets for one app server and do a straight port to another app server.</p>
<h3>Projects</h3>
<p>Other Java Projects supporting WebSockets:</p>
<ul>
<li>GlassFish/Grizzly (see a DZone posting on it <a href="http://www.dzone.com/links/glassfish_web_sockets_sample.html?ref=rs">here</a>)</li>
<li><a href="http://jwebsocket.org/">jWebSocket</a></li>
<li><a href="http://jboss.org/netty">JBoss Netty</a> (see patch <a href="https://jira.jboss.org/browse/NETTY-264">here</a>)</li>
<li><a href="http://www.caucho.com/resin/examples/websocket-java/index.xtp">Caucho Resin</a></li>
</ul>
<p>Sean finished by showing the <a href="http://code.google.com/p/quake2-gwt-port/">Google Quake demo</a> (also reported <a href="http://www.bit-tech.net/news/2010/04/05/google-ports-quake-2-to-html5/1">here</a>).</p>
<p>The conclusion of the talk was on how to gracefully handle browsers that don&#8217;t support WebSockets (e.g. IE8). The main option here seems to be &#8220;<a href="http://code.google.com/p/jquery-graceful-websocket/">The Graceful WebSocket</a>&#8220;. This resorts back to using AJAX long pulling if WebSockets isn&#8217;t supported in the browser.</p>
<h3>My Thoughts</h3>
<p>WebSockets looks like one of the most interesting technologies that fall under the HTML5 umbrella. If it gets wide browser support (e.g. IE9), and perhaps some standardization on the server side, it could really take off and even potentially over take Ajax. Definitely one to watch&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shaunabram.com/oscon-day4-websockets/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OSCON Day3: Database Scalability</title>
		<link>http://www.shaunabram.com/oscon-day3-database-scalability/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oscon-day3-database-scalability</link>
		<comments>http://www.shaunabram.com/oscon-day3-database-scalability/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 23:48:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[oscon]]></category>

		<guid isPermaLink="false">http://www.shaunabram.com/?p=878</guid>
		<description><![CDATA[I spent the afternoon of Day3 at OSCON attending two interesting database scalability talks. The first was on Database Scalability Patterns; The second on Database Sharding (and Spider for MySQL). All my notes are below&#8230; Database Scalability Patterns The first talk on &#8220;Database Scalability Patterns&#8221; was by Robert Treat from OmniTI. Database scalability patterns are [...]]]></description>
			<content:encoded><![CDATA[<p>I spent the afternoon of Day3 at <a href="http://www.oscon.com/oscon2010">OSCON</a> attending two interesting database scalability talks. The first was on Database Scalability Patterns; The second on Database Sharding (and Spider for MySQL).</p>
<p>All my notes are below&#8230;</p>
<p><span id="more-878"></span></p>
<h2>Database Scalability Patterns</h2>
<p>The first talk on &#8220;<a href="http://www.oscon.com/oscon2010/public/schedule/detail/13226">Database Scalability Patterns</a>&#8221;<br />
was by Robert Treat from <a href="http://omniti.com/">OmniTI</a>.</p>
<p>Database scalability patterns are part design patterns and part application life cycle.</p>
<h4>Phases</h4>
<p>Typically, most databases go through the following phases:<br />
1. MyFirstDatabase<br />
2. Vertical partitioning<br />
3. Vertical scaling<br />
4. Read slaves<br />
5. Horizontal partitioning</p>
<h6>1. MyFirstDatabase </h6>
<p>MyFirstDatabase is just a term to refer to a simple, unsophisticated database setup.</p>
<h6>2. Vertical Partitioning</h6>
<p>You now have much more data and more transactions.<br />
The <a href="http://en.wikipedia.org/wiki/Partition_%28database%29">Wikipedia definition</a> of Vertical partitioning is creating tables with fewer columns and using additional tables to store the remaining columns.  </p>
<h6>3. Vertical Scaling</h6>
<p>Adding more RAM, more disks. Basically, adding more hardware.<br />
This is not necessarily a one time deal as you can do multiple iterations.</p>
<h6>4. Read Slaves</h6>
<p>&#8220;Read Slaves&#8221; or &#8216;Master &#8211; Slave&#8221;<br />
I think the idea here is that you have a single destination for database writes, but multiple sources for database reads. These &#8216;slaves&#8217; read database are replicated form the single write source.<br />
This approach however does not work for write bottle necks! It only works for read heavy loads.<br />
Typically<br />
- full copy of data on each node<br />
- Asynchronous<br />
Consider<br />
- Partial copy<br />
- Synchronous<br />
- Perhaps don&#8217;t use a RDBMS</p>
<p>Also note that the Master/Slave setup typically requires changes to your application code. But overall, the Master/Slave approach is fairly easy</p>
<p>Note that scaling large number of database writes can be much more difficult. One approach is to use multiple Masters, but while there are many ways to implement multiple masters, there are few that really work in a production environment! You may be able to reduce CPU, but it is difficult to reduce the I/O. Really, the master slave approach is is a fail-over solution, not a scalability solution.</p>
<h6>5. Horizontal partitioning</h6>
<p>According to <a href="http://en.wikipedia.org/wiki/Partition_%28database%29">Wikipedia</a>, Horizontal partitioning is putting different rows into different tables. It is sometimes referred to as Sharding.<br />
- Move each piece to own server<br />
- Duplicate some data as needed<br />
- When splitting the data, you must separate dependencies in the app code first!<br />
Note that each each node is a new instance of vertical scaling</p>
<h4>&#8220;Universal truths&#8221; of scaling databases</h4>
<p>1) Vertical scalability is helpful for every pattern<br />
Even in a horizontally scaled, fully distributed database, the number of nodes needed is affected by vertical scalability<br />
2) New nodes are never free<br />
-Adds points of failure<br />
-Add management costs<br />
-Add complexity to architecture<br />
-Add complexity to your app code</p>
<h4>Tips</h4>
<p>- Plan for layered data sources<br />
- Read/write connections in code i.e. have separate read vs write connections in the code to start with. Then you can have planned outages where you can still read, but not do updates.<br />
- Use schemas to separate services (think about what pieces of data need to talk/be aware of each other, and what do not)</p>
<h2>Sharding</h2>
<p>The second database scaling talk was on &#8220;<a href="http://www.oscon.com/oscon2010/public/schedule/detail/14059">Sharding for the Masses</a>&#8221; by Giuseppe Maxia (MySQL @ Oracle)</p>
<p>He simply described sharding as &#8220;breaking a database into pieces&#8221;.<br />
It is used simply as a way of dealing with too much data &#038; traffic.</p>
<h4>Replication</h4>
<p>One approach to scaling is replication.<br />
Client sends a write to master and the reads to a load balancer.<br />
The write master and the read load balancer distribute to slaves.<br />
I think this is simply &#8217;4. Read Slaves&#8217; from the database patterns talk above. Again, the speaker pointed out that this approach doesn&#8217;t scale  well when you have too many writes because the he &#8216;Write master&#8217; becomes the single point of failure.</p>
<h4>Homemade Sharding</h4>
<p>So, another alternative is to use homemade sharding.<br />
&#8216;Homemade&#8217; because your app contains logic of how/where to put data.<br />
However there are 2 problems with this homemade approach.<br />
The first is that your application logic can become very complex.<br />
The second is that if the sharding logic is in your application, the approach doesn&#8217;t work if data is accessed via a different application!</p>
<h4>Sharding via Spider for MySQL</h4>
<p>So, instead of using a homemade approach, the speaker suggested using <a href="http://spiderformysql.com/">Spider</a> for MySQL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shaunabram.com/oscon-day3-database-scalability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSCON Day3 &#8211; Google App Engine</title>
		<link>http://www.shaunabram.com/oscon-day3-google-app-engine/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oscon-day3-google-app-engine</link>
		<comments>http://www.shaunabram.com/oscon-day3-google-app-engine/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 23:43:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[googleAppEngine]]></category>
		<category><![CDATA[oscon]]></category>

		<guid isPermaLink="false">http://www.shaunabram.com/?p=961</guid>
		<description><![CDATA[I have seen several talks on Google App Engine before, but have still not used it in anger, so this talk, Introduction to Google App Engine, acted as a refresher. It was given by Ikai Lan, a software engineer working for the Developer Programs groups at Google. Google App Engine is a way to run [...]]]></description>
			<content:encoded><![CDATA[<p>I have seen several talks on <a href="http://code.google.com/appengine/">Google App Engine</a> before, but have still not used it in anger, so this talk, <a href="http://www.oscon.com/oscon2010/public/schedule/detail/13769">Introduction to Google App Engine</a>, acted as a refresher. It was given by <a href="http://www.oscon.com/oscon2010/public/schedule/speaker/94899">Ikai Lan</a>, a software engineer working for the Developer Programs groups at Google.  </p>
<p>Google App Engine is a way to run your applications on Google infrastructure. You push your code to App Engine and it gets scaled out depending on how many instances you need.</p>
<p>My notes from the talk are below, but you can find the full slides <a href="http://slideshare.net/ikailan">here</a> or <a href="http://www.oscon.com/oscon2010/public/schedule/detail/13812#">here</a>.</p>
<p><span id="more-961"></span></p>
<h2>LAMP Setups</h2>
<p>The motivation for using Google App Engine is due to the limitations or constraints of a typical LAMP (Linux, Apache, MySQL and Perl/PHP/Python) setup.</p>
<h4>1) Single Server</h4>
<p>A single server running the LAMP stack is not scalable and has a single point of failure.</p>
<h4>2) Separate web &#038; database server</h4>
<p>The next step would be to move the Apache server and the database to separate servers. You may get better performance but this is still not a highly scalable solution and you now have two single points of failure.</p>
<h4>3) Multiple web servers</h4>
<p>You can provide a more scalable solution by adding multiple Apache web servers, but now you need load balancing and the database remains as a single point of failure.<br />
In order to utilize the multiple web servers, you can use round robin load balancing. Register the web server IPs with DNS; DNS record is cached with a TTL (Time to Live). But the TTL takes time to propagate down and may not be respected, so if a web server goes does, you can still have problems. Additionally, the database remains a single point of failure.</p>
<h4>4) Master Slave Database</h4>
<p>The next approach is to use a Master Slave database. Note that this approach was also discussed at the Database Scalability Patterns talk, and the Database Sharding talk. This Master Slave database approach improves read throughput, but the Master is now a single point of failure for writes and may die before replication takes place.</p>
<h4>5) Partitioned Database</h4>
<p>So, you can migrate to a partitioned database where you will (hopefully) have better read <em>and </em> write throughput, but where you now have more machines and more management and you may need to update your application logic, queries and schema.</p>
<h2>Google App Engine to the rescue</h2>
<p>So, in order to avoid all the hassle of above, Google propose using the Google App Engine.</p>
<h4>Cloud Computing landscape</h4>
<p>App Engine fits into the Cloud Computing landscape as follows:<br />
Software as a Service: Google Docs, saleforce.com<br />
Platform as a Service: <em>Google App Engine</em>, force.com<br />
Infrastructure as a Service:  Amazon Web Services, Rackspace, VMWare</p>
<h4>App Server</h4>
<p>The App Server component of Google App Engine:</p>
<ul>
<li>Hosts application code</li>
<li>Handles concurrent requests</li>
<li>Enforces isolation for app safety</li>
<li>Maintains statelessness</li>
<li>Supports Python &#038; Java runtimes (and in fact any language than runs on JVM, including Scala)</li>
</ul>
<p>It also supports the following services &#038; APIs</p>
<ul>
<li>Memcache &#8211; Distributed, very fast, in-memory cache</li>
<li>Datastore</li>
<ul>
<li>Uses Bigtable</li>
<li>Distributed, partitioned data stored</li>
<li>Arbitrary Horizontal Scaling to &#8216;Internet Scale&#8217;</li>
<li>Replicated and Fault Tolerant</li>
<li>Predictable query performance with no deadlocks</li>
</ul>
<li>URL Fetch &#8211; Simple Http communication with GET/POST to external services; Allows integration with 3rd party REST APIs</li>
<li>Mail &#8211; Inbound &#038; Outbound mail</li>
<li>XMPP &#8211; Instant messaging</li>
<li>Task Queue &#8211; Background &#038; scheduled computation and processing infrastructure</li>
<li>Images</li>
<li>Blobstore &#8211; Upload and distribute large files</li>
<li>User Services &#8211; User account support including federated login (via Google accounts)</li>
</ul>
<h2>Open Source Implementation &#8211; TyphoonAE</h2>
<p>The presentation finished with a code demo, but the presenter also pointed out that there is an open source implementation of Google App Engine called <a href="http://code.google.com/p/typhoonae/">TyphoonAE</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shaunabram.com/oscon-day3-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSCON Day3 &#8211; The Joys of Engineering Leadership</title>
		<link>http://www.shaunabram.com/oscon-day3-leadership/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oscon-day3-leadership</link>
		<comments>http://www.shaunabram.com/oscon-day3-leadership/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 23:39:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[leadership]]></category>
		<category><![CDATA[oscon]]></category>

		<guid isPermaLink="false">http://www.shaunabram.com/?p=958</guid>
		<description><![CDATA[The first talk of Day 3 at OSCON was &#8220;How to Lose Friends and Alienate People: The Joys of Engineering Leadership&#8221; by Brian &#8216;Fitz&#8217; Fitzpatrick and Ben Collins-Sussman, both from Google. What is an engineering leader? Serves the team Eliminates roadblocks Provides advice, guidance and helps get job done Mutual respect/Mutual trust Promotes technical and [...]]]></description>
			<content:encoded><![CDATA[<p>The first talk of Day 3 at <a href="http://www.oscon.com/oscon2010">OSCON</a> was &#8220;<a href="http://www.oscon.com/oscon2010/public/schedule/detail/13245">How to Lose Friends and Alienate People: The Joys of Engineering Leadership</a>&#8221; by Brian &#8216;Fitz&#8217; Fitzpatrick and Ben Collins-Sussman, both from Google. </p>
<p>What is an engineering leader? </p>
<ul>
<li>Serves the team</li>
<li>Eliminates roadblocks</li>
<li>Provides advice, guidance and helps get job done</li>
<li>Mutual respect/Mutual trust</li>
<li>Promotes technical and social health</li>
<li>Leadership is not a waste of time&#8230;</li>
<li>Being a team leader is a way of scaling yourself</li>
</ul>
<p>The speakers broke their talk on how to be a good leader down in to two sections, which were (in good coding tradition) patterns and anti-patterns&#8230;</p>
<p><span id="more-958"></span></p>
<h2>Anti patterns for leadership</h2>
<p>1. Be everyone&#8217;s friend<br />
Don&#8217;t try to be everyone&#8217;s friend because you still need to be a hard-ass sometimes. Instead, just try to maintain a healthy, working relationships. For example, try having lunch with your team regularly.</p>
<p>2. Treat reports as children<br />
Give responsibility and trust.</p>
<p>3. Micromanage<br />
Micromanagement breeds co-dependency. If you are off for a day, the team can&#8217;t work. They should work on their own initiative, without your commands.</p>
<p>4. Hire pushovers<br />
Don&#8217;t hire people that are dumber than you! If they are smarter, you will build and better team and learn more from them.</p>
<p>5. Compromise when hiring<br />
Don&#8217;t just just hire the top 10% of candidates you interview &#8211; they might not be good enough.</p>
<p>6. Ignore low performers<br />
Do not ignore them! Low performers are the obstacle in the road. They will not go away. Try to motivate them. Maybe need to more-micro-manage. Have an &#8216;acceptable&#8217; level bar.</p>
<p>7. Ignore human problems<br />
Don&#8217;t assume the team has no life outside of work. Keep morale up.</p>
<h2>Patterns</h2>
<p>1. Be honest<br />
There is no such thing as a temporary lapse of integrity!<br />
Deliver criticism directly, constructively and with empathy.<br />
Be honest about your motivation for making decisions.</p>
<p>2. Be a wise zen master<br />
If someone asks hard questions, you can respond with questions.<br />
Don&#8217;t try to manage people!</p>
<p>3. Lose the ego<br />
You don&#8217;t need to be the smartest person in the room. Trust others and respect their abilities.</p>
<p>Appreciate any inquiries the team has; Accept feedback and don&#8217;t be scared to apologize. Humility != Doormat</p>
<p>To influence, be influenceable.</p>
<p>4. Get your hands dirty<br />
Lead by example and understand the problems the team is going through.</p>
<p>5. Delegate<br />
Delegate even if another team member can&#8217;t do a job as well (or as quickly) as you think you can.</p>
<p>6. Seek to replace yourself</p>
<p>7. Make waves<br />
When you lease want to make waves, this is probably the time you should be making most waves.</p>
<p>8. Shield your teams from bureaucracy</p>
<p>9. Succeed and fail as a team<br />
Public praise, private criticism as everyone already knows when someone messed up.</p>
<p>10. Be a catalyst, a teacher and a mentor</p>
<p>12. Set clear goals<br />
Make sure everyone agrees on the milestones and the plan for a projects.<br />
Otherwise you get feature creep and get side tracked.</p>
<p>13. Track happiness &#038; careers<br />
If someone is not happy,find out why.<br />
What do team members want to be doing?<br />
Ask them what they need?<br />
Get everyone to work on fun stuff &#038; dull stuff. Change it up.</p>
<p>Give Autonomy &#038; Trust<br />
e.g. the 20% time @ Google</p>
<p>Mastery<br />
People want to grow; Always want to master new things; Give people a sense of purpose</p>
<p>Managing your manager<br />
Act like a grown up. Encourage people to take responsibility</p>
<p>Pursue responsibility<br />
Do more than is required. Deliver 110%<br />
Take calculate risks</p>
<p>If you fail &#8211; learn. And document the process and what was learned.</p>
<p>Communicate!!</p>
<p>Point out obstacles</p>
<p>Argue<br />
Good leaders don&#8217;t want yes men<br />
Give back structured criticism</p>
<h2>Conclusion</h2>
<p>3 words:</p>
<ul>
<li>Serve</li>
<li>Respect (give more, get more)</li>
<li>Motivate</li>
</ul>
<p>Stop being a manager, be a leader!</p>
<p>Finally, the speaker recommended checking out a talk by Dan Pink on Intrinsic vs Extrinsic Motivations. I think <a href="http://www.ted.com/talks/dan_pink_on_motivation.html">this</a> is it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shaunabram.com/oscon-day3-leadership/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSCON Day2: Scala</title>
		<link>http://www.shaunabram.com/oscon-day2-scala/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oscon-day2-scala</link>
		<comments>http://www.shaunabram.com/oscon-day2-scala/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 04:11:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[akka]]></category>
		<category><![CDATA[sbt]]></category>
		<category><![CDATA[scala]]></category>
		<category><![CDATA[specs]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.shaunabram.com/?p=868</guid>
		<description><![CDATA[I attended the Scala Summit on day 2 at OSCON. As well as the Scala introduction classes, there were interesting talks on Akka, Simple Build Tool and Specs&#8230;. Akka I attended a lecture by Jonas Boner on the Akka library. Jonas believes that it is simply too hard to write correct concurrent, scalable applications and [...]]]></description>
			<content:encoded><![CDATA[<p>I attended the <a href="http://www.oscon.com/oscon2010/public/schedule/detail/15318">Scala Summit</a> on day 2 at <a href="http://www.oscon.com/oscon2010">OSCON</a>.</p>
<p>As well as the Scala introduction classes, there were interesting talks on Akka, Simple Build Tool and Specs&#8230;.</p>
<p><span id="more-868"></span></p>
<h2>Akka</h2>
<p>I attended a lecture by<a href="http://www.oscon.com/oscon2010/public/schedule/speaker/89251"> Jonas Boner</a> on the <a href="http://akkasource.org">Akka</a> library. Jonas believes that it is simply too hard to write correct concurrent, scalable applications and that the threads and locks approach to concurrency taken in Java is far from the ideal approach. So, he created the Akka project to provide a better solution.</p>
<p>Akka is an opensource library ,with a Scala and Java API, whose MO is &#8220;Simpler Scalability, Fault-Tolerance, Concurrency &#038; Remoting&#8221;. It achieves this through the use of the <a href="http://en.wikipedia.org/wiki/Actor_model">Actor Model</a>. As well as actors, Akka provides Fault tolerance (inspired by the approach used in Erland) using a Let It Crash approach. Akka also makes use of <a href="http://en.wikipedia.org/wiki/Software_transactional_memory">Software Transactional Memory</a>.</p>
<p>It seems like a well written project with a lot of good ideas. I would like to learn more about it (and perhaps hear of it being used in some enterprise apps) before I would attempt to use it in anger, but definitely one to keep an eye on&#8230;</p>
<h2>Simple Build Tool</h2>
<p>The second interesting talk was by <a href="http://www.oscon.com/oscon2010/public/schedule/speaker/93492">Mark Harrah</a> on SBT (<a href="http://code.google.com/p/simple-build-tool">Simple Build Tool</a>).</p>
<p>SBT is for building projects. It is all about Scala: written in Scala; builds scala; defined in Scala.<br />
It uses <a href="http://ant.apache.org/ivy/">Ivy</a> for dependency management, can be run in interactive mode or via triggered execution (~) to run when the source code changes.<br />
The tool seemed neat and effective when he demoed it and this was reinforced by the other Scala presenters giving it a very big thumbs up. If I ever get a chance to start developing Scala in anger, this will be the first tool I would look at&#8230;</p>
<h2>Specs</h2>
<p>The final talk of interest was on <a href="http://www.oscon.com/oscon2010/public/schedule/detail/15321">Specs</a>, by <a href="http://www.oscon.com/oscon2010/public/schedule/speaker/89569">Eric Torreborre</a>.</p>
<p>Specs is a is a Behaviour-Driven-Design framework which provides a simple and typed language to create specifications. It seemed to be a way to create specifications as tests (with integration with JUnit and JMock) in a way that is understandable by both business and technical folks alike, in a DSL like manner. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.shaunabram.com/oscon-day2-scala/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSCON Day1: The Productive Programmer, part 2</title>
		<link>http://www.shaunabram.com/oscon-day1-productive-programmer2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oscon-day1-productive-programmer2</link>
		<comments>http://www.shaunabram.com/oscon-day1-productive-programmer2/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 03:12:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[bestpractice]]></category>
		<category><![CDATA[nealford]]></category>
		<category><![CDATA[oscon]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://www.shaunabram.com/?p=921</guid>
		<description><![CDATA[The following are my notes from the second part of Neal Ford&#8216;s &#8220;The Productive Programmer&#8221; talk on best practices (see here for part1 on mechanics). Again, you can get the original slides form here. Part2: Practice 10 ways to improve your code 1. Composed Method The concept of &#8216;Composed Method&#8216; Comes from Smalltalk Best Practices [...]]]></description>
			<content:encoded><![CDATA[<p>The following are my notes from the second part of <a href="http://nealford.com/">Neal Ford</a>&#8216;s &#8220;<a href="http://www.oscon.com/oscon2010/public/schedule/detail/13834">The Productive Programmer</a>&#8221; talk on best practices (see here for <a href="http://www.shaunabram.com/oscon-day1-productive-programmer1/">part1 on mechanics</a>). Again, you can get the original slides form <a href="http://nealford.com/downloads/conferences/Productive_Programmer_Tutorial(Neal_Ford).pdf">here</a>.</p>
<p><span id="more-921"></span></p>
<h1>Part2: Practice</h1>
<p>10 ways to improve your code</p>
<h2>1. Composed Method</h2>
<p>The concept of &#8216;<a href="http://c2.com/ppr/wiki/WikiPagesAboutRefactoring/ComposedMethod.html">Composed Method</a>&#8216; Comes from<a href="http://c2.com/cgi/wiki?SmalltalkBestPracticePatterns"> Smalltalk Best Practices Patterns</a>.<br />
The concept involves dividing your programs into methods that perform one identifiable task. If you find yourself chunking a method (using blank lines) you should probably be refactoring</p>
<h4>Benefits of composed methods</h4>
<ul>
<li>Shorter methods are easier to test</li>
<li>Method names become documentation</li>
<li>Large number of cohesive methods</li>
<li>Discover reusable assets</li>
</ul>
<h2>2. Test Driven Development</h2>
<p>(And Test Driven Design!)<br />
TDD is the first consumer of your code &#8211; it makes you think abut how the rest of the world will use it</p>
<ul>
<li>Creates consumption awareness</li>
<li>Forces mocking of dependent objects</li>
<li>Naturally creates composed method</li>
</ul>
<p>Extroverted objects (e.g. where you create dependent objects in theconstructor) &#8216;reach out&#8217; to create other objects, i.e. adhoc object creation<br />
Introverted objects move object construction to a few simple places. Dependency Injection is a way to achieve introverted objects.</p>
<h2>3. Static analysis</h2>
<ul>
<li><a href="http://findbugs.sourceforge.net/">Findbugs</a> &#8211; byte code analysis</li>
<li><a href="http://pmd.sourceforge.net/">PMD</a> &#8211; Scans Java source code and looks for potential problems</li>
<li><a href="http://pmd.sourceforge.net/cpd.html">CPD</a> &#8211; Copy Paste Detector</li>
</ul>
<h2>4. Good citizenship</h2>
<h4>a) getters &#038; setter != encapsulation</h4>
<p>If user code has getter &#038; setters, it can break encapsulation too!<br />
Create atomic mutators for dependent fields<br />
e.g. Address should have a single setAddress method, not setCity &#038; setState</p>
<p>Instead, only have getters &#038; setter when you need them for other methods.<br />
And you shouldn&#8217;t have to test getters &#038; setters &#8211; will be tested through other code.</p>
<h4>b) Constructors</h4>
<p>Specific contract for how to create valid objects<br />
Q: How often is a blank object valid?<br />
A: Never!<br />
Therefore, don&#8217;t provide default constructor for domain objects<br />
Push back on frameworks that require default constructors</p>
<h4>c) Static methods</h4>
<p>One good use for static methods is completely black box use. No state involved i.e. for stateless, stand alone methods.<br />
But if you mix static &#038; state, you have problems.<br />
e.g. Singletons!<br />
Singletons are bad because&#8230;<br />
1) Mix responsibility (creation and logic)<br />
2) Untestable<br />
3) The object version of global variable</p>
<p>Avoid using Singletons and instead<br />
1) Create a plain class<br />
2) create a factory to create POJO of that class</p>
<h2>5. Yagni</h2>
<p>You Aint Gonna Need It!</p>
<ul>
<li>Discourages gold plating</li>
<li>Don&#8217;t indulge in speculative development &#8211; as that increases software entropy</li>
<li>Leads to frameworks, in a very bad sense e.g. <a href="http://avalon.apache.org/closed.html">Avalon</a> is framework to build frameworks</li>
</ul>
<p>Frameworks extracted from working code can be good.<br />
Frameworks created as speculative development are usually bad.</p>
<h2>6. Question Authority</h2>
<p>Test names are special<br />
Use underscores instead of Camel case (only for test method names though!)<br />
Much easier to read</p>
<p>APIS<br />
Use fluent interfaces<br />
Makes code readable to non-developers<br />
But this vialoates the JavaBean spec<br />
(need default constructor, all set methods must return void)<br />
Therefore can&#8217;t use JavaBeans spec for fluent interfaces</p>
<p>Summary &#8211; Know when to break the rules</p>
<h2>7. Slap</h2>
<p>Single Layer of Abstraction Principle<br />
Keep all lines of code in a method at the same level of abstraction<br />
Jumping abstraction layers makes code hard to understand<br />
(See a blog posting on this <a href="http://www.markhneedham.com/blog/2009/06/12/coding-single-level-of-abstraction-principle/">here</a>)</p>
<h2>8. Polyglot programming</h2>
<p>Consider leveraging existing platforms with languages targeted at specific problems and applications. In other words, use the right tool to get the job done.<br />
e.g. Java is bad at threading, consider Jaskell or Scala<br />
e.g. If there is schedule pressure, consider JRuby on Rails, or Grails<br />
e.g. For every day tasks done quickly, consider Groovy or Ruby. or <a href="http://swiby.codehaus.org/">Swiby</a> (Ruby / Swing)</p>
<p>&#8220;Stop banging rocks together &#038; get some work done!&#8221;</p>
<h2>9. Learn every Nuance</h2>
<p>Learn all the quirks<br />
For example, consider:</p>
<ul>
<li>Using Reflection (no longer slower). Can give elegant solutions to problems.</li>
<li>Regular expressions</li>
</ul>
<p>Learn the nuances of your tools, then tell the other people on your project.</p>
<h2>10. Anti Objects</h2>
<p>An antiobject is a kind of object that appears to essentially do the opposite of what we generally think the object should be doing.<br />
Consider using them if they bring elegant solutions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shaunabram.com/oscon-day1-productive-programmer2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSCON Day1: The Productive Programmer</title>
		<link>http://www.shaunabram.com/oscon-day1-productive-programmer1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oscon-day1-productive-programmer1</link>
		<comments>http://www.shaunabram.com/oscon-day1-productive-programmer1/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 03:09:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[nealford]]></category>
		<category><![CDATA[oscon]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.shaunabram.com/?p=898</guid>
		<description><![CDATA[I spent the afternoon of day 1 at OSCON listen to Neal Ford give his &#8220;The Productive Programmer&#8221; talk and I have to say I loved it. I have heard Neal talk before and he is an excellent speaker: clear, funny, interesting and knowledgeable. The talk was in 2 parts: Mechanics and Practice. Below are [...]]]></description>
			<content:encoded><![CDATA[<p>I spent the afternoon of day 1 at <a href="http://www.oscon.com/oscon2010">OSCON</a> listen to <a href="http://nealford.com/">Neal Ford</a> give his &#8220;<a href="http://www.oscon.com/oscon2010/public/schedule/detail/13834">The Productive Programmer</a>&#8221; talk and I have to say I loved it. I have heard Neal talk before and he is an excellent speaker: clear, funny, interesting and knowledgeable. </p>
<p>The talk was in 2 parts: Mechanics and Practice.<br />
Below are my notes from the first part of the talk (see here for <a href="http://www.shaunabram.com/oscon-day1-productive-programmer1/">part2</a>), but you can also get the original slides form <a href="http://nealford.com/downloads/conferences/Productive_Programmer_Tutorial(Neal_Ford).pdf">here</a>. The talk is based on his book of the same name, <a href="http://www.amazon.com/Productive-Programmer-Theory-Practice-OReilly/dp/0596519788">The Productive Programmer</a>. Which is similar in theme but not to be confused with the &#8220;<a href="http://www.pragprog.com/the-pragmatic-programmer">The Pragmatic Programmer</a>&#8221; book.</p>
<p><span id="more-898"></span></p>
<h2>Part1: Mechanics</h2>
<p>1. Acceleration<br />
2. Focus<br />
4. Canonicality (applying the DRY principle)<br />
3. Automation</p>
<h3>1. Acceleration</h3>
<p>The basic premise of &#8216;acceleration&#8217; is that typing is faster than navigation and that tools, especially for repetitive tasks, are your friend.</p>
<h4>Operating System accelerators</h4>
<p>For o/s accelerators, he pointed out several useful tools:</p>
<ul>
<li>Windows: explorer address bar (alt-d shifts focus to the address bar)</li>
<li>Apple: In Finder, use apple-shift-g to go to Folder; There are also a bunch of other shortcuts like apple-shift-h = go to home directory</li>
<li>Firefox: Use the numberfox plugin &#8211; I looked in to this. I think it is <a href="https://addons.mozilla.org/en-US/firefox/addon/6420/">this </a>plugin, but unfortunately, it is only available for Firefox 1.5-2.0 <img src='http://www.shaunabram.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </li>
<li>He also suggested using smart help on Mac Leopard, but I&#8217;m not sure what this refers to&#8230;</li>
</ul>
<h4>Clipboards</h4>
<p>Neal pointed out that having only 1 clipboard with 1 entry is very limiting and suggested these tools to help:</p>
<ul>
<li>Windows: <a href="http://www.snapfiles.com/get/clcl.html">clcl</a> (infinite/100 clipboard history)</li>
<li>Mac: <a href="http://www.thornsoft.com/affiliate/iclip/index.htm">iClip</a> ($)</li>
<li>Mac: <a href="http://jumpcut.sourceforge.net/">Jumpcut</a></li>
</ul>
<h4>Directory Switching</h4>
<p>&#8216;There and back&#8217; for directory switching</p>
<ul>
<li>pushd &#8211; pushes a directory on the stack</li>
<li>popd &#8211; pops it back off</li>
</ul>
<p>(Note that these tools are also available on Windows)</p>
<h4>Command Prompts</h4>
<p>Graphical explorers better for some things, but the command line is better for others. The following are some tools to easy command prompt use:</p>
<ul>
<li>Windows: <a href="http://www.petri.co.il/add_command_prompt_here_shortcut_to_windows_explorer.htm">&#8216;Command prompt here&#8217; power toy</a> [Update: This is now available by default in Windows 7. By holding shift and right-clicking a folder, you'll see additional commands not listed on the standard menu. See <a href="http://downloadsquad.switched.com/2009/02/09/windows-7-tip-elevated-command-prompt-anywhere/">here</a> for more details]</li>
<li>Windows: <a href="http://www.codeproject.com/KB/cs/commandbar.aspx">Command prompt explorer bar</a> &#8211; This looks very cool!</li>
<li>Cygwin: <a href="http://unitstep.net/blog/2009/05/16/open-cygwin-bash-shell-here/">bash here</a></li>
<li>Mac: <a href="http://www.cocoatech.com/">Path finder</a> ($)</li>
</ul>
<h4>Prefer Keyboard to Mouse</h4>
<p>When coding, always prefer keyboard to mouse</p>
<h5>Learning shortcuts</h5>
<ul>
<li>Make yourself use the shortcut, even if you&#8217;ve found it via the menu!</li>
<li>Have someone else pester you about it &#8211; e.g. pair programmer</li>
<li>There is an app called KeyCaster than displays what keys were pressed</li>
<li>Key promoter plug in for IntelliJ</li>
<li>mousefeed for eclipse</li>
<li>Try turning off menu options! Forces you to use keyboard shortcuts</li>
<li>Use flash cards &#038; cheat sheets</li>
</ul>
<h5>Java IDE Examples</h5>
<p>All of our hierarchies are too deep, including in the file system &#038; in code.<br />
He suggested the following tools for IntelliJ: </p>
<ul>
<li>goto class (like &#8216;Open resource&#8217; in Eclipse?)</li>
<li>Can also open based on capital letter patterns</li>
<li>goto symbol (opens a class based on a symbol (e.g. var name) in it</li>
<li>introduce variable (does left hand declaration for you)</li>
<li>introduce variable redux</li>
<li>escalating selection</li>
</ul>
<h5>Templates</h5>
<p>All major IDE’s and coding text editors support templates in some form.</p>
<ul>
<li>Use templates, for example in <a href="http://www.jetbrains.com/idea/features/code_assistance.html#Live_Templates">IntelliJ</a> or <a href="http://eclipse.dzone.com/news/effective-eclipse-custom-templ">Eclipse</a> for things like parameter substitution, default values, repeating values</li>
<li>
Learn the language of your templating engine e.g. <a href="http://www.jetbrains.com/idea/features/freemarker_velocity.html">Velocity</a> in IntelliJ</li>
<li>Every time you type something for the 3rd time, templatize it!</li>
</ul>
<h5>Key macro tools</h5>
<p>Key macro tools are like templates, but at the operating system level. Use them to avoid typing the same commands over and over again.<br />
Windows: <a href="http://www.autohotkey.com/">AutoHot key</a><br />
Mac: <a href="http://www.smileonmymac.com/TextExpander/">TextTxpander</a> ($)</p>
<h3>Focus</h3>
<p>Try to avoid distractions by doing simple things like:</p>
<ul>
<li>Get a comfortable chair</li>
<li>Use dual monitors (google dual monitors and productivity to see proof!)
</li>
<li>Have monitors sitting immediately in front of you</li>
<li>Use a good keyboard &#038; mouse</li>
<li>Don&#8217;t get carpal tunnel! (http://en.wikipedia.org/wiki/Carpal_tunnel_syndrome)</li>
<li>Try moving mouse to your &#8216;bad&#8217; side, or use on left AND right side (Using the mouse on your &#8216;bad&#8217; will force you to use keyboard more and will also make you ambidextrous!)</li>
<li>Motivate yourself to learn keyboard shortcuts</li>
<li>Have admin privileges for the O/S (If you are not given permission, start a spreadsheet of all the time you waste because you can&#8217;t do what you need to due to lack of admin rights; Show your boss how much time it is wasting)</li>
</ul>
<p>In general, offices are terrible environments (too many distractions) &#8211; War rooms work better.</p>
<h4>Locus of attention</h4>
<p>Anything that happens outside your locus of attention breaks ﬂow.<br />
Flow is when you have total concentration and time disappears (&#8216;in the zone&#8217;).<br />
It is hard to get in to and easy to break (like sleep in that respect).</p>
<p>To avoid breaking flow/concentration, try:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Tweak_UI">Tweak UI</a> &#8211; A tool that allows you to easily manipulate your Windows environment. For example, you can turn of balloon tips for ever.</li>
<li>Screen dimmers &#8211; Allow you to automatically set you background to dark after a set time
<ul>
<li>Windows: <a href="http://www.techiequest.com/jedi-concentrate-fate-inactive-windows-application-in-black/">Jedi Concentrate</a></li>
<li>Mac: <a href="http://www.lachoseinteractive.net/en/products/doodim/">Doodim</a></li>
</ul>
<li>Internet blockers
<ul>
<li>Mac: <a href="getconcentrating.com">Concentrate</a>  &#8211; Have to reboot machine to unblock. Can configure to only block certain sites.</li>
<li>Windows: <a href="http://www.techiequest.com/jedi-concentrate-fate-inactive-windows-application-in-black/">Jedi Concentrate</a></li>
</ul>
</ul>
<p>The higher the level of concentration, the denser the ideas, so to maintain concentration:</p>
<ul>
<li>Turn of notications</li>
<li>Don&#8217;t keep email open &#8211; email is best done in batches (e.g. deal with at 9, noon and 3)</li>
<li>Put on headphones</li>
<li>Create office &#8220;quiet time&#8221;</li>
</ul>
<h4>Focus techniques</h4>
<h5>Search beats navigation</h5>
<p>Search is (increasingly) better than navigation, so try to replace file hierarchy navigation with search</p>
<ul>
<li>Desktop search. e.g. <a href="http://www.google.com/quicksearchbox/">Google Desktop search</a>(aka quick search box)</li>
<li><a href="http://desktop.google.com/plugins/i/indexitall.html">Larry&#8217;s &#8220;any text file&#8221; indexer</a></li>
</ul>
<h5>Rooted Views</h5>
<p>A <a href="http://nuggets.hammond-turner.org.uk/2008/12/top-tip-rooted-views.html">rooted view</a> is a specialized explorer view with a base folder that is &#8216;rooted&#8217; at the folder you specify.<br />
(on Mac, this is simply the directory shortcuts on the left hand side)</p>
<h5>Use virtual desktops</h5>
<ul>
<li><a href="http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx">virtual desktop manager</a> power toy</li>
<li><a href="http://virtuawin.sourceforge.net/">VirtualWin</a> (better?)</li>
<li><a href="http://www.apple.com/macosx/what-is-macosx/apps-and-utilities.html#spaces">Spaces</a> (built into leopard) </li>
</ul>
<h3>Canonicality</h3>
<p><a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY</a> &#8211; Don&#8217;t repeat yourself</p>
<h4>ORM</h4>
<p>A database schema can be made up of DDL + xml + pojo<br />
Choose 1 and generate the others from that<br />
e.g. generate xml &#038; Pojos classes from schema<br />
(If you need to add to a class&#8217;s logic, make the generated code Abstract, and the class that extends it is where the extra, custom code gets added)<br />
Or, generate the schema &#038; POJOs from Hibernate mapping files</p>
<h4>DRY Documentation</h4>
<p>e.g. generating wiki pages from subversion check in details (see SVN2Wiki)<br />
DRY Diagrams &#8211; Generate based on code<br />
DRY Schemas &#8211; Schemaspy</p>
<h3>Automation</h3>
<p>In general, don&#8217;t do by hand what you can automate!</p>
<ul>
<li>You should have a one command build (if, on a brand new machine, you can&#8217;t issue one command to get build, and another single command to build, then you have a flawed build process)</li>
<li>Continuous Integration (good for building, metrics reporting)</li>
<li>Version Control (Essential!) &#8211; Do not comment out code! Remove and use VCS.</li>
</ul>
<h4>Subverting other tools</h4>
<p>Selenium (open source tool for UAT)<br />
Includes a side project called selenium IDE<br />
Side use: Allows you to automate debugging wizard style web apps! (you need to test one page, but you need to navigate through 10 pages to get to it &#8211; use Selenium)<br />
Record your interaction the FIRST time you walk through the page<br />
Cuts debugging time!<br />
Selenium defines an interaction API for web apps<br />
Have your Q/A dept record bug discoveries</p>
<p>You almost never do anything just once</p>
<ul>
<li>Work like a craftsman, not a laborer</li>
<li>Build shims &#038; jigs</li>
<li>Building a tool takes longer, but you are building assets</li>
<li>Develop <a href="http://www.urbandictionary.com/define.php?term=bash-fu">Bash-fu</a></li>
</ul>
<h4>Why Automate?</h4>
<ul>
<li>Time sent automating can take multiple times longer but can be used multiple+ times. And can accidentally can become a major part of project!</li>
<li>Allows throw-aways to grow into assets</li>
<li>Allows unit testing, refactoring, support</li>
<li>Solving problems by hand makes you dumber!</li>
<ul>
<li>Steals concentration</li>
<li>Squanders focus</li>
</ul>
</ul>
<h4>Justifying automating</h4>
<ul>
<li>Timebox! &#8211; Set a reasonable amount of time to POC</li>
<li>Evaluate @ end of timebox</li>
<li>
Abandon if it is not working out</li>
</ul>
<h4>Analyze the ROI</h4>
<ul>
<li>How long does it take to do X times?</li>
<li>What are the consequences of doing it wrong?</li>
<li>Automation is about time saving and risk mitigation</li>
</ul>
<p>Last and by no means least &#8211; Don&#8217;t shave yaks!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shaunabram.com/oscon-day1-productive-programmer1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

