<story><title>Go at Google: Language Design in the Service of Software Engineering</title><url>http://talks.golang.org/2012/splash.article</url></story><parent_chain></parent_chain><comment><author>cromwellian</author><text>I think the &quot;return an error code&quot; approach is just as unreadable as nested or multiple try/catch blocks when the number of failure states grows large. I think the &quot;Maybe Monad&quot; approach of functional languages and Scala, combined with pattern matching in the language tends to look cleaner, e.g.&lt;p&gt;some_expression match {
   case Some(x) =&amp;#62; do_something_with(x)
   case None =&amp;#62; no result (e.g. null in C/Java/etc)
   case Error(x) =&amp;#62; handle error x
}&lt;p&gt;One of the nice things about the monad approach is they can be combined together. Consider the following chain of function calls which may return null at any point:&lt;p&gt;int val = foo().bar().baz().blah();&lt;p&gt;To deal with this with if/else statements, you need 3 nested if-statement for a single line of expression. In a language like Scala, you can just write:&lt;p&gt;for (a &amp;#60;- foo();
     b &amp;#60;- a.bar();
     c &amp;#60;- b.baz()) c.blah();&lt;p&gt;I think there is an inherent tension between explicitly detailing everything and boilerplate in terms of readability and writeability. I haven&apos;t seen enough Go code or written much of anything to say anything about it, except that it worries me. I do think the multi-return stuff can limit the amount of accident ignoring of error conditions, but the Go language itself doesn&apos;t provide any high level syntactic constructs to make dealing with the errors less painful, whereas with the Monad approach (which essentially is multi-return), the pattern matching tends to look cleaner IMHO.</text></comment>
<story><title>Go at Google: Language Design in the Service of Software Engineering</title><url>http://talks.golang.org/2012/splash.article</url></story><parent_chain></parent_chain><comment><author>millstone</author><text>I continue to be confused by how Go gets positioned. From the article:&lt;p&gt;&lt;i&gt;&quot;Go is a programming language designed by Google to help solve Google&apos;s problems, and Google has big problems. The hardware is big and the software is big. There are many millions of lines of software, with servers mostly in C++ and lots of Java and Python....And of course, all this software runs on zillions of machines, which are treated as a modest number of independent, networked compute clusters&quot;&lt;/i&gt;&lt;p&gt;The author moved effortlessly from &quot;Google&apos;s problems&quot; to &quot;servers&quot; that are &quot;networked compute clusters.&quot; That&apos;s quite a leap, because it&apos;s certainly not true that &quot;&lt;i&gt;&lt;/i&gt;all&lt;i&gt;&lt;/i&gt; this software&quot; runs in that manner. Android does not, Chrome does not, Chrome OS does not, the iOS YouTube app does not, Google Earth does not, etc. And there&apos;s plenty of not-big hardware that Google writes for, like laptops and phones.&lt;p&gt;And the reason I bring this up is because Go was explicitly pitched as a systems programming language - see the PDF &lt;a href=&quot;http://www.stanford.edu/class/ee380/Abstracts/100428-pike-stanford.pdf&quot; rel=&quot;nofollow&quot;&gt;http://www.stanford.edu/class/ee380/Abstracts/100428-pike-st...&lt;/a&gt;. Programming tools, IDEs, web browsers, operating systems (&quot;maybe&quot;) are among the tasks specifically called out as suitable for Go. But now this article tells us that Go was designed for &quot;large server software&quot;.&lt;p&gt;So the question is, what changed? Was Go found to be unsuitable for tasks like web browsers? If so, in what way?</text></comment>