Subscribe to Methods & Tools
if you are not afraid to read more than one page to be a smarter software developer, software tester or project manager!
Software Development Blogs: Programming, Software Testing, Agile Project Management
Subscribe to Methods & Tools
if you are not afraid to read more than one page to be a smarter software developer, software tester or project manager!
Hey, it's HighScalability time:

Don't miss all that the Internet has to say on Scalability, click below and become eventually consistent with all scalability knowledge...
Imagine that the government decided an intake of 2.500 calories per day should be the maximum for each person, regardless of age, gender, health, metabolism, dietary habits, etc. And imagine that the government also measured and enforced this every day, claiming it is “for your own health”, and handing out daily fines for each person who went over target. How would you feel about this practice?
Now imagine that the government decided that a speed of 130 km/hours should be the maximum for each driver, regardless of age, health, mental condition, road condition, traffic condition, weather condition, or the condition of their cars. And imagine that the government measured and enforced this, claiming it is “for your own safety”, and handing out fines to anyone who went over this “target”. How would you feel about that? Oh, wait… this is an actual practice in many countries!
I drove 14 hours from Bologna to Brussels yesterday, with a proper break every 2 hours, good nutrition, a healthy mind, a well-serviced car, and an excellent track record as a driver. During that trip I saw people not using their indicator lights when switching lanes, people overtaking others on the emergency lane, people using their mobile phones, and people driving vehicles that barely deserved the name “car”. And among those many thousands of drivers, I’m sure there were also some with mental problems, physical problems, mechanical problems, etc. However, the one who got picked out by the government was me. I got flashed twice because I drove “too fast”.
For every complex goal, there is a metric that is clear simple and wrong.
In organizations we see this all the time. Managers have a goal, such as faster time-to-market or higher productivity. But productivity is a very complex thing. It depends on motivation, creativity, innovation, collaboration, etc. And managers can’t measure all that stuff easily. So they reduce the metric to the simplest possible thing that can be measured with a computer: the number of hours people are physically at the office. And then they turn it into a target: the computer requires at least 8! Or else…
Measuring something meaningful is hard, so let’s measure something that is meaningless but easy.
Measuring real safety on the streets for everyone is next to impossible, so the government reduces it to the simplest possible metric that can be delegated to computers: speed.
I fear the day when governments find a way to have computers measure our daily intake of calories.
You’ve read the introduction books, you’ve keyed in the hello world examples, now it’s time to dive deep into solutions from experienced developers working in interesting domains.
Deep Dive
Like many of you I’m sure I’ve collected a bookcase full of books introducing an array of languages and technologies. But like you I crave material that is based on actual experience of developing real-world systems in interesting domains. The excellent Beautiful Architecture and Beautiful Code books present chapters from experienced developers who talk about real-world applications they’ve worked on. F# Deep Dives goes deep on simple functional solutions with F# applied to interesting domains like finance, machine learning and games.
F#
F# is a practical, functional-first language that lets you write simple code to solve complex problems. By focusing on F# we have been able to draw from a wealth of experienced developers working on practical problems in interesting domains. F# is also a very expressive language which means that each chapter can focus on showing solutions without having to sacrifice content because of excessive amounts of boilerplate. The solutions should be easy to follow for developers with or without F# experience and interesting whether you intend to solve problems with F# or another functional-first language like Scala or Clojure.
Deal of the day
If all that sounds interesting I think you’ll enjoy F# Deep Dives:
Work on the book started in December 2012, it’s currently in MEAP with Manning and today (17th May 2013) F# Deep Dives is Manning’s deal of the day - use code: dotd0517au
30 Days of Getting Results is a hard-core time management course.
It’s a 30 Day Sprint with a lesson each day, but you can go at your own pace. For example, I every now and then I scan through it in about 20 minutes to remind myself of the best time management skills to work on.
Some of you have let me know that you can’t get to the site. I’m not sure why.
Regardless, I have a free PDF version of 30 Days of Getting Results available.
It’s powerful stuff. If you want to master time management, productivity, and work-life balance, this short-course will help you do that.
Time management and extreme productivity are a few of the things that I regularly mentor individuals, teams, and leaders on.
It’s 129 pages, and very easy to flip through.
Each lessons includes an exercise to make it real and drive it home.
If you download and go through it, please rate it on Good Reads.
Enjoy.
Some of the most exciting Android announcements at Google I/O this year are part of our latest Google Play services release, version 3.1.
The new version brings you Google Play games services, part of a new cloud-integrated platform for social gaming based on Google+ identity. Also included are location-based services that make it easier to build efficient location-aware apps. For apps using the popular Google Cloud Messaging platform, you can now take advantage of XMPP messaging and easier setup. Finally, Cross-Platform Single Sign On for Google+ Sign-In is now available to your apps.
You can get started using these APIs and services right away—Google Play services 3.1 is already rolling out to Android devices across the world, with support reaching all the way back to Froyo.
Google Play games services
Games are always popular with Android developers, and the announcement of Google Play game services raised the volume even more.
Google Play games services lets you make your games more social, with achievements, leaderboards, and multiplayer, and they help you extend your user’s games across multiple devices by storing game saves and settings in the cloud.
Several great Android games are already using these new game services, including World of Goo, Super Stickman Golf 2, Beach Buggy Blitz, Kingdom Rush, Eternity Warriors 2, and Osmos.
You can take advantage of the new services right away using the games services SDK included in Google Play services. For all the details, check out the Google Play games services documentation.
Location APIs
If you build location-aware Android apps, you’ll want to check out the new location APIs. They make it easy to build accurate, fast, and efficient apps, with new contextual features.
The Fused Location Provider intelligently manages the underlying location technology and gives you the best location according to your needs. We’ve simplified the location APIs and completely rewritten our location algorithm to make location more accurate, flexible and use less battery.
Using the new geofencing API, your app can set up geographic boundaries around specific locations and then receive notifications when the user enters or leaves those areas.
With apps becoming increasingly contextual, understanding what the user is doing is critical to surfacing the right content. A new activity recognition API makes it easy to check the the user’s current activity — still, walking, cycling, and in-vehicle — with very efficient use of the battery. We use low-power sensors and machine-learning classifiers to recognize the activity, giving you both both high accuracy and low battery usage.
To learn more, head over to our training classes at Making Your App Location Aware or dive directly into the reference docs.
Google Cloud MessagingWe’ve added APIs to make it easier to set up GCM in your apps, and in the service itself we’ve added new messaging capabilities for your apps to use.
A new registration API lets your app register with the service using a single method call and begin receiving messages as soon as the call returns.
Sign Up for Early AccessIf you’d like to try out CCS messaging or the User Notifications API, please sign up for early access.
In the GCM service itself we’ve added support for messaging over XMPP with the new GCM Cloud Connection Server (CCS). Your servers now have a persistent connection over which to send large numbers of messages, very quickly, and with no overhead. New APIs in Google Play services let apps send messages back upstream to third-party servers using CCS, without needing to manage network connections. This helps keep battery and data usage to a minimum.
Also new in the GCM service is a User Notifications API. This new API lets you synchronize notifications across a user’s multiple devices — when the user dismisses a notification on one device, the notification disappears automatically from all the other devices. To get started with GCM, head over to the developer documentation.
Google+ Cross-Platform Single Sign OnMany people use apps on multiple devices throughout the day, switching between their laptops, tablets, and mobile devices. After signing-in to an app on one device, it’s natural that when they pick up a different device and use the same app, they would expect to be signed in there as well.
To help you provide this kind of seamless transition between platforms and stay connected with users across devices, we’re adding Cross-Platform Single Sign On to our Google+ Sign-In capabilities.
If your app is already using Google+ Sign-In, you’ve already got support for Cross-Platform Single Sign On. This feature will be enabled automatically over the coming days.
Cross-Platform Single Sign On gives you a great way to build longer-running, cross-platform user experiences, and it dovetails perfectly with the new Google Play games services for bridging game state across devices using the cloud.
To learn more about Google+ Sign-In, check out http://developers.google.com/+.
More About Google Play ServicesGoogle Play Services is our platform for offering you better integration with Google products, and providing new capabilities to use within your apps. To learn more about Google Play services and the APIs available to you through it, visit the Google Services area of the Android Developers site.
Join the discussion onQuite a few interesting sessions today:
Google Knowledge Graph
With the Knowledge Graph, Google is trying to give a new dimension to its flagship product: Search.
Users should be able to have a conversation with search, and search should anticipate on a user’s interests by showing related topics.
So search needs to understand the context of searches, in other words: it needs to understand the world. This is where Knowledge Tree comes in handy.
Knowledge Tree is a hugh graph with semantic data about real world entities and their relations. This data has been gathered from Wikipedia, Google+ and many other sources.
The complete tree is viewable and downloadable at freebase.com.
Freebase Api
If you don’t feel like writing your query logic by yourslef, Google also offers a (free) Rest api:
Freebase Api
The following services are offered, many of them have their own JQuery plugin as well:
Dart: new features
The Dart programming language has been around a few years already. It is Google’s scalable and typesafe alternative for Javascript. It can run in its own VM, in a special version of Chrome, or it can be compiled into Javascript.
During the last year quite a couple of new features have been added. Here are some highlights:
Mixins
Metadata
Lazy loading of libraries
Futures
streams
Also nice: you can try out Dart in realtime on try.dartlang.org
Dart’s performance has been enhanced: native Dart now runs many times faster than Javascript, thanks to, amongst others, utilization of SimD instructions by the Dart VM.
“Chrome DevTools Revolution”
The DevTools in Chrome Canary have been updated with quite a few cool features. It should even be possible now to use Chrome DevTools as your only IDE: inline editing of Javascript and styling was already possible, but now it is also possible to save the edited code to disk (using Ctrl-S).
If you are using an IDE and have edited a source file, Chrome can now detect file system changes and refresh automatically.
Sass support has been added to Chrome DevTools. So you can trace a styling all the way to the Sass reference that defines it, inside Chrome Devtools.
And also here it is possible to automatically reload the page when a sass file has been changed.
A lot of support was added for profiling Javascript:
Portable Native Client
This is Google’s solution to let you run C++ code inside your browser. Actually that was already possible with Native Client, but Portable Native Client makes it easier to create C++ apps that will run on both Arm and x86 architectures.
Obviously Google needed to do a lot to prevent this from being a security risk. So the C++ code needs to be compiled with a custom compiler, which will create a .pexe file; this file runs inside a ‘native client process’ with ‘software fault isolation’. What this means is that Chrome will scan the code before running it, to check for illegal instructions and for illegal access of certain memory regions.
Apart from that, native client code can only be used in applications inside Chrome Webstore.
This all should make Native Clients safe to use.
The advantage of Native Clients is obviously their performance: they run at 80% or 90% of the speed of a fully native application.
But the question is of course: why go through so much trouble, why not just download a fully native application to your cellphone or laptop?
I guess the answer is that such a thing is not possible on Chromebooks. Google is trying hard to make Chrome the universal platform to run all your applications. And with Native Client, you can now get enough performance to run games as well.
In my time playing around with neo4j I’ve run into a problem a few times where I executed a query using the web console (usually accessible @ http://localhost:7474/webadmin/#/console/) and have got absolutely no response.
I noticed a similar thing today when Rickard and I were having a look at why a Lucene index query wasn’t behaving as we expected.
I setup some data in a neo4j database using neography with the following code:
require 'neography'
@neo = Neography::Rest.new
@neo.create_node_index("Id_Index", "exact", "lucene")
node1 = @neo.create_node("Hour" => 1, "name" => "Max")
node2 = @neo.create_node("Hour" => 2, "name" => "Mark")
node3 = @neo.create_node("Hour" => 3, "name" => "Rickard")
@neo.add_node_to_index("Id_Index", "Hour", 1, node1)
@neo.add_node_to_index("Id_Index", "Hour", 2, node2)
@neo.add_node_to_index("Id_Index", "Hour", 3, node3)
I then ran the following query which I was expecting to return all the nodes:
start hour=node:Id_Index("Hour:[00 TO 02] or Hour:[03 TO 05]") RETURN hour
Instead it returned nothing and I couldn’t see anything being logged either.
Rickard pointed out was because the exception is only returned to the API caller and that it would be better to run the query from the Data Browser which is typically accessible from http://localhost:7474/webadmin/#/data/search/
If we run the query from there then we can see what’s going wrong:
BadInputException StackTrace: org.neo4j.server.rest.repr.RepresentationExceptionHandlingIterable.exceptionOnHasNext(RepresentationExceptionHandlingIterable.java:50) org.neo4j.helpers.collection.ExceptionHandlingIterable$1.hasNext(ExceptionHandlingIterable.java:60) org.neo4j.helpers.collection.IteratorWrapper.hasNext(IteratorWrapper.java:42) org.neo4j.server.rest.repr.ListRepresentation.serialize(ListRepresentation.java:58) org.neo4j.server.rest.repr.Serializer.serialize(Serializer.java:75) org.neo4j.server.rest.repr.MappingSerializer.putList(MappingSerializer.java:61) org.neo4j.server.rest.repr.CypherResultRepresentation.serialize(CypherResultRepresentation.java:57) org.neo4j.server.rest.repr.MappingRepresentation.serialize(MappingRepresentation.java:42) org.neo4j.server.rest.repr.OutputFormat.assemble(OutputFormat.java:179) org.neo4j.server.rest.repr.OutputFormat.formatRepresentation(OutputFormat.java:131) org.neo4j.server.rest.repr.OutputFormat.response(OutputFormat.java:117) org.neo4j.server.rest.repr.OutputFormat.ok(OutputFormat.java:55) org.neo4j.server.rest.web.CypherService.cypher(CypherService.java:94) java.lang.reflect.Method.invoke(Method.java:597)
There seemed to be some strangeness going on with how Lucene handles the query when a default search field isn’t provided but we noticed that it behaved as expected if we didn’t use an OR since Lucene has an implicit OR between statements anyway.
start hour=node:Id_Index("Hour:[00 TO 02] Hour:[03 TO 05]") RETURN hour
Either way, the lesson for me was if the console isn’t giving a result run the query in the data browser to work out what’s going wrong!
Agile practices draw on the team committing to the assigned work on many levels for example the commitments from the sprint planning or the commitments made during the daily stand-up. Without the team continually committing to the work Agile would just be iterative waterfall. Teams can be defined as a group people that have developed relationships based around a commitment to attain a set of common goals. The commitment of team members to work together is a critical factor in formation of teams and their ultimate success.
Team commitment is impacted by many factors.
Knitting mission, value, challenge and empowerment together creates an environment where a group can organize around a mission, develop a solution and commit to achieving that goal because they know that their performance will be valued. The environment that supports commitment is a core component for high performance teams.
By Andrew Jessup, Product Manager

<?php
$db = new PDO(
'mysql:unix_socket=/cloudsql/hello-php-gae:my-cloudsql-instance;dbname=demo_db;charset=utf8',
'demo_user',
'demo_password'
);
foreach($db->query('SELECT * FROM users') as $row) {
echo $row['username'].' '.$row['first_name']; //etc...
}
Methods such as query() work just as you’d expect with any MySQL database. This example uses the popular PDO library, although other libraries such as mysql and mysqli work just as well.
<?php
$handle = fopen('gs://hello-php-gae-files/prime_numbers.txt','w');
fwrite($handle, "2");
for($i = 3; $i <= 2000; $i = $i + 2) {
$j = 2;
while($i % $j != 0) {
if($j > sqrt($i)) {
fwrite($handle, ", ".$i);
break;
}
$j++;
}
}
fclose($handle);
The same fopen() and fwrite() commands are used just as if you were writing to a local file. The difference is we’ve specified a Google Cloud Storage URL instead of a local filepath. <?php
$primes = explode(",",
file_get_contents('gs://hello-php-gae-files/prime_numbers.txt')
);
if(isset($primes[100]))
echo "The 100th prime number is ".$primes[100];
To do great things, it helps to study people that do great things and show us better ways to do things. It helps us build our reference library of what’s possible and it helps inspire us to new levels of success.
Most importantly, it expands our capabilities.
Chalene Johnson is a powerhouse when it comes to personal development. She continuously pushes herself, while expanding and exploring what’s possible physically, mentally. and emotionally. She’s a unique blend of entrepreneur, physical fitness expert, choreographer, author, life changer, and motivational speaker … and we can learn a lot from her approach.
I wrote up 27 lessons from Chalene Johson, but my favorite lesson is actually Lesson #7 – Success isn’t magic, it’s a method:
Chalene says, “It’s NOT luck — it’s KNOW HOW. There is a formula for everything.” You have to study the people that have the results that you want. Learn from their formula. Study what made them successful. If you can find the proven practices and the methods that work, you’ll speed up your success, and you’ll avoid the dead-ends. Finding a formula helps you establish and practices routines that will help you get better and better over time.
Personally, I’ve found this to be true time and time again. Whenever I got stuck, it was my strategy or approach. I just didn’t know the right formula or who to model from. There’s always a recipe. One of the most important things I learned on the Microsoft patterns & practices team is that if you look to the right sources, you’ll find the proven practices or the patterns that really work, even if it’s not well-known (in fact, part of our job on the Microsoft patterns & practices team was really to share and scale this knowledge more broadly.)
I’ve shared my personal rapid results formula before in The Way of Success, and it helps elaborate on how to model success in a more effective way. As Tony Robbins says, success leaves clues. We just need to be good students of possibility to find them and apply them.
Even if you’re not into working out, I think you'll enjoy lessons from Chalene Johnson on personal development, productivity, motivation, and more.


import googledatastore as datastore def main() writeEntity() readEntity()Next include writeEntity() and readEntity() functions:
def WriteEntity():
req = datastore.BlindWriteRequest()
entity = req.mutation.upsert.add()
path = entity.key.path_element.add()
path.kind = 'Greeting'
path.name = 'foo'
message = entity.property.add()
message.name = 'message'
value = message.value.add()
value.string_value = 'to the cloud and beyond!'
try:
datastore.blind_write(req)
except datastore.RPCError as e:
# remember to do something useful with the exception pass
def ReadEntity():
req = datastore.LookupRequest()
key = req.key.add()
path = key.path_element.add()
path.kind = 'Greeting0'
path.name = 'foo0'
try:
resp = datastore.lookup(req)
return resp
except datastore.RPCError as e:
# remember to do something useful with the exception pass
First create a new file called “demo.py”. Inside demo.py, we’ll add code to write and then read an entity from the Cloud Datastore. Finally we can update main() to print out the property values within the fetched entity: def main()
writeEntity();
resp = readEntity();
entity = resp.found[0].entity
for p in entity.property:
print 'Entity property name: %s', p.name
v = p.value[0]
print 'Entity property value: %s', v.string_value
Before we can run this code we need to tell the SDK which Cloud Datastore instance we would like to use. This is done by exporting the following environment variable: ~$ export DATASTORE_DATASET cloud-datastore-demoFinally we’re able to run the application by simply issuing the following:
~$ python demo.pyBesides the output that we see in console window, we’re also able to monitor our interactions within the Cloud Console. By navigating back to Cloud Console, selecting our cloud-datastore-demo project, and then selecting the Cloud Datastore we’re taken to our instance’s dashboard page that includes number of entities, properties, and property types, as well as index management, ad-hoc query support and breakdown of stored data.


Looks like an interesting take on "a completely asynchronous, low-latency transaction management protocol, in line with the fully distributed NoSQL architecture."
Warp: Multi-Key Transactions for Key-Value Stores overview:
Implementing ACID transactions has been a longstanding challenge for NoSQL systems. Because these systems are based on a sharded architecture, transactions necessarily require coordination across multiple servers. Past work in this space has relied either on heavyweight protocols such as Paxos or clock synchronization for this coordination.
This paper presents a novel protocol for coordinating distributed transactions with ACID semantics on top of a sharded data store. Called linear transactions, this protocol achieves scalability by distributing the coordination task to only those servers that hold relevant data for each transaction. It achieves high performance by serializing only those transactions whose concurrent execution could potentially yield a violation of ACID semantics. Finally, it naturally integrates chain-replication and can thus tolerate faults of both clients and servers. We have fully implemented linear transactions in a commercially available data store. Experiments show that the throughput of this system achieves 1-9× more throughput than MongoDB, Cassandra and HyperDex on the Yahoo! Cloud Serving Benchmark, even though none of the latter systems provide transactional guarantees.
Note: Engine Yard friend Daragh Curran, Head of Product Engineering, Intercom has graciously let us post this great piece about code deployment on our blog. Check it out on their own blog here.
Software only becomes valuable when you ship it to customers. Before then it's just a costly accumulation of hard work and assumptions.
Shipping unlocks a feedback loop that confirms or challenges those assumptions. It makes new things possible for your customers, and gives you the opportunity to focus on the next thing.
Shipping brings life to your team, to your product, and to your customers. Shipping is your company's heartbeat.
Shipping will try to kill youThe scramble to get that one last feature done, the late nights, the compromises, the sinking feeling when we realise something major is broken, the post-mortems… It's agony, but if it was easy everyone would do it. Shipping exposes mistakes. We're nervous about it, and our natural reaction is to do it reluctantly and infrequently, which actually carries higher risk, causing more reluctance in the future.
The cost of shipping is approaching zeroNot too long ago, shipping software involved actual ships, disks, and printed manuals. It happened perhaps once a year. Bug fixes weren't automatic over the internet like today. Everything was slower and more controlled. The cost of shipping was massive, the consequence of a mistake was large. Today, the cost of shipping has approached zero. Most people can deploy in seconds or minutes with a single command or button click. With a little thought you can do that without your customers noticing, and with automated monitoring you'll find out immediately if something goes wrong.
Despite the cost of shipping approaching zero, many people still ship software guided by very old habits.
Shipping cadence defines your companyThe cadence at which you ship defines your company. A yearly cadence results in a very structured approach to the design->build->test cycle. A few months of building, while the rest is spend fixing. Engineers can join and leave before seeing their hard work end up in the hands of customers. The approach to design becomes one of anticipating all possible needs, rather than focusing and iterating on the important ones.
Obstacles downstream propagate upstreamAn obstacle downstream propagates upstream. If you're not allowed to implement new ideas, you stop having them.
- Paul Graham
The right approach to shipping has a positive influence on your company's productivity and your team's happiness & job satisfaction. Shipping infrequently is an obstacle. Ship slow, and you'll introduce challenges that push you to ship even slower. Ship frequently, and see positive effects everywhere in your company. For example, lets examine how behaviour changes along with shipping frequency, while handling a simple request from a customer.
Lets say a customer gets in touch to say "No matter what I do, I cannot save my name correctly, I think it doesn't like hyphens". In a company where you ship continuously, you see this and think Simple — I'll tweak a test and a regex pattern, get a quick code review from my buddy beside me, merge to mainline, and 1 minute later when it's deployed to production, reply to the customer: "Sorry about this, it's fixed now, thanks for letting us know". They'll reply: "Wow, thanks for fixing so quickly". High fives all around!
If we stretch the time to production (TTP) out a little, even to 10 minutes, the behaviour changes. You either do the same, but reply saying it'll be fixed with our next deploy (probably 10 minutes) - or you wait, so that you can communicate with certainty. The waiting is time where you'll shift focus to something else, but have the baggage of having to follow up. Perhaps you'll think, I'll have a quick coffee, then move on to something else afterwards. Even though your deployments are entirely automated, you lose time because of waiting and losing focus.
If TTP is hours, the behaviour changes again. No longer can you say with certainty when the change will be out there, so you're tempted to batch up with other similar small changes. You postpone replying until you get time to do it, sometimes forgetting about it. You're less likely to take prompt action, wow'ing the customer, and you pay some mental cost for having it on a todo list. Since getting to production takes hours now, your team will start restricting to morning only deploys, so miss that slot and it's further delays.
If TTP is days, it exacerbates that further - perhaps you'll reply "Thanks for letting us know. We'll fix this in our next sprint". It gets bundled in with a whole load of other small low, priority items, you spend more time debating estimates, and priorities, than the first guy took to fix it and reply to the customer. Miss the beginning of week deploy window and further slippage. The larger releases bring higher risk, you'll tell your customer it's fixed, only to later require rolling back because of a separate change. Your bug database gets bigger and bigger, with little details that you'll probably never fix.
When TTP is weeks, it exaggerates that even further - perhaps you'll reply "Sorry about this, I'll let the development team know" or something equally lame from your customer’s standpoint. Deep down you realise nothing will be fixed, and the job of talking to customers becomes a cost or hassle, rather than an opportunity to improve your product and nurture happy loyal customers.
Shipping continuouslyBetter approaches to writing or testing software help us iterate more quickly and confidently, but the benefits are quite local to engineering teams. Continuous shipping on the other hand, touches all parts of your company, as do the benefits, and the behaviours it enables and encourages.
Linkedin's transition to continuous deployment is linked to their recent financial success.
Good products, are a side effect of combining good people with an idea in an environment that helps those people to kick ass. Your attitude to shipping is a big part of that environment you create.
Shipping breathes life into how we think. The feedback loop helps us learn, gain confidence in making quick decisions, and build momentum. Momentum in product improvements excites and engages our customers. Seeing quickly the benefits of our hard work, motivates us to do more. Building a team where people can work hard and move fast attracts others to join you - hiring gets easier.
Shipping continuously isn't an achievement you unlock and then move on. You've got to constantly obsess about it. If you believe in the benefits it brings, you'll be driven to shrink 20 minutes down to 1 minute or less, you'll consider 'ability to ship' as an equal to 'does it scale' when building new systems. And you'll do that because of all the life it breathes into your company and your product.
Shipping is your company's heartbeat.

Today was the first day of the Google IO conference in San Francisco. I was lucky enough to be able to attend so I can share some (personal) highlights of the day.
In the keynote Google showed some of their latest developments:
It is now possible to upload a batch of pictures to your online storage and let Google decide which are the best ones to keep. For instance when you’ve been on holiday and have taken 600 pictures, too many to show to anybody, Google can propose a selection after doing some intelligent analysis:
It can filter pictures if they are dupicates or if they are unclear. But it also recognizes if pictures contain some of your (Google+) relations, which would make them more interesting. Even more cool: with the help of some machine learning and a lot of training, Google can now estimate if a picture is pretty or not.
Another cool feature: Google will recognize if you have multiple pictures of the same person in the same scene. Based on some intrapolation algorithm, it can generate new pictures in that scene. Some examples were shown and they were actually really good.
Voice recognition was added Chrome (desktop and Chromebook only) so you can give spoken commands to let it do searches. Not really new, but what makes it special is that integration was added with Google Knowledge Tree, a giant graph database which contains semantic relations between entities.
What this means is that Chrome might understand what you mean when you say something like: “Send Misja an e-mail with the shortest route from here to Amsterdam”. This does require that Misja is one of your Google+ contacts. Chrome will infer that ‘here’ refers to your current location.
And there were many more announcements. You can see the full keynote speech here.
In the afternoon there was a choice of about 60 different presentations. Obviously too many to watch or to describe. Here are a few brief highlights:
Google has added App Script support to Google Forms.
App Script support was already present in Gmail and Google Sheets and it enables you to write macro’s or other logic in Javascript. The Javascript can access and manipulate the document you are working on, it can use all Google Api’s and connect to databases.
Now it can also be used in Google Forms. Quite useful if you want to add form validation for instance.
You can try it out here
Google Compute Engine, Google’s cloud service, has gotten some useful pricing options for small businesses. The cheapest one can host your application already for less than 2 cents per hour. There’s not much use for buying your own server anymore if cloud computing becomes so cheap ..
.png)
The last year has been an exciting one for Android developers, with an incredible amount of momentum. In fact, over 48 billion apps have been downloaded from Google Play to date, with over 2.5 billion app downloads in the last month alone.
This week, at Google I/O, our annual developer conference, we’re celebrating this momentum, and putting on stage a number of new features and advancements both for the Android platform and Google Play, to help you design, develop and distribute great apps to your users.
We just wrapped up the keynote, and wanted to share a number of those new features; we’ll be spotlighting some of them throughout the week both here, on Google+, and in 36 Android sessions and sandboxes at the Moscone center in San Francisco (with many of the sessions livestreamed at developer.google.com). Enjoy!
Google Play Services 3.1Google Play Services is our platform for bringing you easier integration with Google products and new capabilities to use in your apps. Today we announced a new version of Google Play Services that has some great APIs for developers.
Today we announced a new Integrated Development Environment (IDE) built just for Android, with the needs of Android developers in mind. It’s called Android Studio, it’s free, and it’s available now to try as an early access preview.
To build Android Studio, we worked with with JetBrains, creators of one of the most advanced Java IDEs available today. Based on the powerful, extensible IntelliJ IDEA Community Edition, we've added features and capabilities that are designed specifically for Android development, to simplify and optimize your daily workflow for creating Android apps.
Google Play Developer Console: a better distribution experienceBuilding awesome Android apps is only part of the story. Today we announced great new features in the Google Play Developer Console that give you more control over how you distribute your app and insight into how your app is doing:
Join us for the Android sessions today and through the week by livestream. Visit the I/O Live Stream schedule for details.

By Greg Hartrell, Lead Product Manager
