<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5060551251465839575</id><updated>2013-05-29T04:45:16.331-07:00</updated><category term='mobile'/><category term='pricing'/><category term='technology'/><category term='scalability'/><category term='web-development'/><category term='html5'/><category term='refactoring'/><category term='app-development'/><category term='debugging'/><category term='salaries'/><category term='programming-language-popularity'/><category term='3d'/><category term='sockets'/><category term='apple'/><category term='programming'/><category term='graphics'/><category term='humour'/><category term='terminology'/><category term='real-time'/><category term='design-patterns'/><category term='game-development'/><category term='webgl'/><category term='cross-platform'/><category term='c#'/><category term='stackoverflow'/><category term='app-store'/><category term='code-craft'/><category term='TDD'/><category term='programming-languages'/><category term='sqa'/><category term='amazon'/><category term='online-retail'/><category term='history'/><category term='microsoft'/><category term='self-improvement'/><category term='.net'/><category term='career'/><category term='tiobe'/><category term='testing'/><category term='tcp-ip'/><category term='methodologies'/><category term='management'/><category term='hardware'/><category term='google'/><category term='startups'/><title type='text'>Dodgy Coder</title><subtitle type='html'>Never trust a programmer in a suit</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-531632676883673596</id><published>2013-02-19T21:04:00.000-08:00</published><updated>2013-02-20T03:35:47.769-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='startups'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google's fiber leeching caper</title><content type='html'>Back in 2000, Google only had data centers on the US west coast and were planning an expansion over to the east coast, to reduce latency to end users. At the time, Google was not hugely profitable like today, and were very conscious of costs. One of the biggest costs of the move was duplicating the data contained in their search indexes over onto the east coast. Google had &lt;a href="http://web.archive.org/web/20000711012924/http://www.google.com/pressrel/pressrelease26.html"&gt;just passed indexing 1 billion web pages&lt;/a&gt;, and had around 9 terabytes of data contained in their indexes. They calculated that even at the highest speed of 1 Gigabit per second, it would take 20 hours to transfer all the data, with a total cost of $250,000. &lt;br /&gt;&lt;br /&gt;Larry and Sergey had a plan however, and it centered on exploiting a loophole in the common billing practice known as &lt;a href="https://en.wikipedia.org/wiki/Burstable_billing"&gt;burstable billing&lt;/a&gt;, which is employed by most large bandwidth suppliers. The common practice is to take a bandwidth usage reading every 5 minutes for the whole month. At the end of the month, the top 5% of usage information is discarded, to eliminate spikes (bursts). They reasoned that if they transferred data for less than 5% of the entire month (e.g. for 30 hours), and didn't use the connection at all outside that time, they should be able to get some free bandwidth. &lt;br /&gt;&lt;br /&gt;So for 2 nights a month, between 6pm and 6am pacific time, Google pumped the data from their west coast data center to their new east coast location. Outside of these 2 nights, the router was unplugged. At the end of the month the bill came out to be nothing.&lt;br /&gt;&lt;br /&gt;They continued like this every month until the contract with their bandwidth supplier ended, and they were forced to negotiate a new one, which meant actually paying for their bandwidth. By this time, Google had started buying up strategically located stretches of fiber, paving the way for its own fiber network to support its increasing bandwidth needs.&lt;br /&gt;&lt;br /&gt;Source: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Plex-Google-Thinks-Works-Shapes/dp/1416596585/?tag=intsecdb-20"&gt;In The Plex: How Google Thinks, Works, and Shapes Our Lives&lt;/a&gt; [Amazon]&lt;br /&gt;By Steven Levy&lt;br /&gt;Published: April 12, 2011&lt;br /&gt;See pages 187-188, Steven Levy's interview with Urs Hölzle and Jim Reese.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: initial;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;" /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: initial;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/531632676883673596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2013/02/googles-fiber-leeching-caper.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/531632676883673596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/531632676883673596'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2013/02/googles-fiber-leeching-caper.html' title='Google&apos;s fiber leeching caper'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-7790805791670602372</id><published>2013-02-01T22:29:00.000-08:00</published><updated>2013-02-02T17:56:45.002-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='self-improvement'/><category scheme='http://www.blogger.com/atom/ns#' term='programming-languages'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>How to learn a new programming language</title><content type='html'>Here's some tips on learning a new programming language. They aren't listed in any specific order. Hopefully you'll gain from this at least one new tip that will help you to become proficient in the next language you learn.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Build something you actually need right now.&lt;/b&gt; This could be either a tool you can use in your day job, or something useful you can make use of at home.&lt;br /&gt;&lt;br /&gt;Consider these example projects ...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Write a simple unit testing framework. Many new languages don't have any unit testing frameworks available when they are first introduced. This project will force you to use areas of the language like reflection and meta-programming. Once completed, it becomes useful straight away, for unit testing your future work in the language.&lt;/li&gt;&lt;li&gt;Implement a disk usage tool; it summarizes the disk usage of all directories on a disk and outputs to the console. It doesn't require overly complex algorithms but touches a lot of the basics: recursion, filesystems, command line parsing and output formatting.&lt;/li&gt;&lt;li&gt;Implement a backup/archive script which has command line switches to exclude certain file extensions. It should place the backup into a single .zip or .tar.gz file. The project will touch on the following: recursion, filesystems, command line parsing, compression libraries and regular expressions.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Port an existing, well known program to the new language.&lt;/b&gt; Since you are porting it, you already have the application design work done. This frees up your mind to focus on the specifics of the new language. After you've finished you'll then have a good reference to which you can refer back to, when comparing the old with the new language.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Find a decent book on the language and read through it all as fast as you can.&lt;/b&gt; The goal is not to memorize everything, but to soak up the ideas and idioms of the language. Then write some small but non-trivial project. When you get stuck, hopefully it'll trigger a memory of something from the book, and you can go back to refer to it. &lt;br /&gt;&lt;br /&gt;Many of the "in a Nutshell" and "Head First" series of books, both published by O'Reilly, are highly rated by readers - they are available for many popular languages (C, C++, C#, Java, Python, JavaScript, PHP).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Mix action with equal parts learning (reading books/tutorials).&lt;/b&gt; Too much action without learning, and you get a lot of poor quality code. Too much learning without enough action, and you fail to absorb the material to a deep enough level.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Study reference works on public repositories.&lt;/b&gt; Find a medium sized project on GitHub which is written 100% in the language. Read though the code and try to understand it. Look for projects written by the language designers or an acknowledged expert. &lt;br /&gt;&lt;br /&gt;As an example, with &lt;a href="http://golang.org/"&gt;Go&lt;/a&gt;, the standard libraries for the language are written in Go and are open source, e.g. here is part of the &lt;a href="http://golang.org/src/pkg/strings/strings.go"&gt;strings package&lt;/a&gt;.&amp;nbsp; In addition, Brad Fitzpatrick and other members of the Go team have several projects on GitHub that you can read and learn from, e.g. here is a &lt;a href="https://github.com/bradfitz/gomemcache"&gt;Go client for Memcache&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Devote large, uninterrupted chunks of time&lt;/b&gt;, at least half a day, to learning the new language. Brief, half hour sessions over the course of the week aren’t really useful, because most of the time would be spent just getting back up to speed on what you previously studied.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Learning a language shouldn’t just be a solitary endeavor.&lt;/b&gt; There are plenty of people who have made the same mistakes that you have, so asking for help is a great way to overcome problems when you get stuck. Some possible sources of help online: Language-specific IRC channels, StackOverflow, Twitter, Facebook groups, Quora, Google+, Google groups. You can also submit your finished code to these forums after you've completed a project; people more experienced with the language than you will often be able to identify areas which can be improved or simplified.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Use an editor with syntax highlighting.&lt;/b&gt; Perennial favorites such as Vim and Emacs, plus newer editors such as Sublime Text, feature support for most if not all programming languages and are available for all major operating systems. Some languages are often associated with specific IDEs; these are a good idea when learning a new language. These are generally ...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Eclipse IDE for Java and Android development.&lt;/li&gt;&lt;li&gt;Xcode for Objective-C and iOS development (on Mac OSX only).&lt;/li&gt;&lt;li&gt;Visual Studio IDE for C#, C++, VB.NET, F# (on Windows only).&lt;/li&gt;&lt;/ul&gt;All of the IDEs and editors listed above are either completely free or have an unlimited trial version available.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Working on a real project with real customers and deadlines&lt;/b&gt; is a white hot crucible for learning a new programming language. If you really need to learn a language quickly, then consider taking on a new job which requires it. Once you've got the job, you'll have no other choice but to learn it quickly.&lt;br /&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Finally, a tip from &lt;a href="http://www.amazon.com/gp/product/020161622X/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=intsecdb-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399369&amp;amp;creativeASIN=020161622X"&gt;The Pragmatic Programmer&lt;/a&gt;, Tip #8 "&lt;b&gt;Invest Regularly in Your Knowledge Portfolio&lt;/b&gt;":&lt;br /&gt;&lt;blockquote&gt;"Learn at least one new language every year. Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getting stuck in a rut. Additionally, learning many languages is far easier now, thanks to the wealth of freely available software on the Internet."&amp;nbsp; &lt;/blockquote&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: initial;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;" /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: initial;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/7790805791670602372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2013/02/how-to-learn-new-programming-language.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/7790805791670602372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/7790805791670602372'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2013/02/how-to-learn-new-programming-language.html' title='How to learn a new programming language'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-7658991837949551508</id><published>2013-01-15T04:23:00.001-08:00</published><updated>2013-01-16T05:06:36.334-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design-patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='terminology'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='code-craft'/><category scheme='http://www.blogger.com/atom/ns#' term='methodologies'/><title type='text'>Big Ball of Mud Design Pattern</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-YdDLm3rxKjo/UPUhZa54S0I/AAAAAAAAAPQ/4xTlq26fm_8/s1600/big_ball_of_mud.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="307" src="http://2.bp.blogspot.com/-YdDLm3rxKjo/UPUhZa54S0I/AAAAAAAAAPQ/4xTlq26fm_8/s320/big_ball_of_mud.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In "Big Ball of Mud", Brian Foote and Joseph Yoder propose that the default (and most  common) software architecture in use is the "Big Ball of Mud" pattern and go on to  discuss six additional patterns and activities that it gives rise to: "Throwaway Code", "Piecemeal Growth", "Keep it Working", "Shearing Layers", "Sweep it Under the Rug" and "Reconstruction".&lt;br /&gt;&lt;br /&gt;Their original article is &lt;a href="http://www.laputan.org/mud/mud.html"&gt;located here&lt;/a&gt; and can be downloaded in PDF form here: &lt;a href="http://www.laputan.org/pub/foote/mud.pdf"&gt;Big Ball of Mud by Brian Foote and Joseph Yoder [PDF download]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have picked out what I think are the highlights of their article ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Big Ball of Mud ... alias &lt;i&gt;Shantytown &lt;/i&gt;or &lt;i&gt;Spaghetti Code&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Shanty_town"&gt;Shantytowns&lt;/a&gt; are usually built from common, cheap materials with simple tools and using unskilled labor. The construction and maintenance of the shantytown is labor intensive, and there is little or no labor specialization - each builder must be a jack of all trades. There's no overall planning, or regulation of future growth. &lt;br /&gt;&lt;br /&gt;Too many of our software systems are, architecturally, little more than shantytowns. Investment in tools and infrastructure is often inadequate and the tools that are used are primitive. Parts of the system grow unchecked, and the lack of architecture and planning allows problems in one part of the system to erode and pollute adjacent portions. Deadlines loom like monsoons, and architectural elegance seems unattainable. &lt;br /&gt;&lt;br /&gt;The time and money to chase perfection are seldom available and there is a survival at all costs attitude, to do what it takes to get the software working and out the door on time. The biggest cost borne by the Big Ball of Mud development is the lack of a decent architecture.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Common features of Big Ball of Mud Code&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Data structures are haphazardly constructed, or non-existent. &lt;/li&gt;&lt;li&gt;Everything talks to everything else. &lt;/li&gt;&lt;li&gt;Important state data is global. &lt;/li&gt;&lt;li&gt;State data is passed around though Byzantine back channels that circumvent the system's original structure. &lt;/li&gt;&lt;li&gt;Variable and function names are uninformative and misleading. &lt;/li&gt;&lt;li&gt;Functions use global variables extensively, as well as long lists of poorly defined parameters. &lt;/li&gt;&lt;li&gt;Functions themselves are lengthy and convoluted, and perform several unrelated tasks. &lt;/li&gt;&lt;li&gt;Code duplication. &lt;/li&gt;&lt;li&gt;The flow of control is hard to understand, and difficult to follow. &lt;/li&gt;&lt;li&gt;The programmer’s intent is next to impossible to discern. &lt;/li&gt;&lt;li&gt;The code is simply unreadable, and borders on indecipherable. &lt;/li&gt;&lt;li&gt;The code exhibits the unmistakable signs of patch after patch at the hands of multiple maintainers, each of whom barely understood the consequences of what he or she was doing. &lt;/li&gt;&lt;li&gt;Did we mention documentation? What documentation?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Working with Big Ball of Mud Code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some software engineers come to regard life with the Big Ball of Mud as normal and become skilled at learning to navigate these quagmires, and guiding others through them. Over time, this symbiosis between architecture and skills can change the character of the organization itself, as swamp guides become more valuable than architects. &lt;br /&gt;&lt;br /&gt;As per &lt;a href="http://en.wikipedia.org/wiki/Conway%27s_law"&gt;Conway's Law&lt;/a&gt;, architects depart in futility, while engineers who have mastered the muddy details of the system they have built, prevail. The code becomes a personal fiefdom, since the author care barely understand it anymore, and no one else can come close. Once simple repairs become all day affairs, as the code turns to mud.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Throwaway Code ... alias &lt;i&gt;Quick Hack&lt;/i&gt; or &lt;i&gt;Protoduction&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While prototyping a system, you're normally unconcerned with how elegant or efficient your code is. You plan that you will only use it to prove a concept and once the prototype is done, the code will be thrown away and written properly. As the time nears to demonstrate the prototype, the temptation to load it with impressive but utterly inefficient realizations of the system’s expected eventual functionality can be hard to resist. Sometimes, this strategy can be a bit too successful. The client, rather than funding the next phase of the project, may slate the prototype itself for release. &lt;br /&gt;&lt;br /&gt;This quick-and-dirty coding is often rationalized as being a stopgap measure. More often than not, the time is never found for this follow up work. The code languishes, while the product flourishes. It becomes a protoduction - a prototype that gets used in production.&lt;br /&gt;&lt;br /&gt;Once it becomes evident that the throwaway code is going to be around for a while, you can turn your attention to improving its structure, either through an iterative process of Piecemeal Growth, or via a fresh draft, as discussed in the Reconstruction pattern below. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Piecemeal Growth ... alias &lt;i&gt;Refactoring&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Successful software attracts a wider audience, which can, in turn, place a broader range of requirements on it.&lt;br /&gt;&lt;br /&gt;When designers are faced with a choice between building something elegant from the ground up, or undermining the architecture of the existing system to quickly address a problem, architecture usually loses.&lt;br /&gt;&lt;br /&gt;In the software world, we deploy our most skilled, experienced people early in the lifecycle. Later on, maintenance is often relegated to junior staff, and resources can be scarce. The so-called maintenance phase is the part of the lifecycle in which the price of the fiction of master planning is really paid. It is maintenance programmers who are called upon to bear the burden of coping with the ever widening divergence between fixed designs and a continuously changing world.&lt;br /&gt;&lt;br /&gt;Piecemeal growth can be undertaken in an opportunistic fashion, starting with the existing, living, breathing system, and working outward, a step at a time, in such a way as to not undermine the system’s viability. You enhance the program as you use it. Massive system-wide changes are avoided - instead, change is broken down into small, manageable chunks.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Keep It Working&lt;span style="font-size: large;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;... alias &lt;i&gt;Continuous Integration&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Businesses become critically dependent on their software and computing infrastructures. There may be times where taking a system down for a major overhaul can be justified, but usually, doing so is fraught with peril. Therefore, do what it takes to maintain the software and keep it going. Keep it working.&lt;br /&gt;&lt;br /&gt;This approach can be used for both minor and major modifications. Large new subsystems might be constructed off to the side, perhaps by separate teams, and integrated with the running system in such a way as to minimize disruption. &lt;br /&gt;&lt;br /&gt;A development build of each product can be performed at regular intervals, such as daily or even more often via an automated build tool. Another vital factor in ensuring a system's continued vitality is a commitment to continuous testing, which can be integrated into the automated build process.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Shearing Layers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Software never stands still. It is often called upon to bear the brunt of changing requirements, because, being as that it is made of bits, it can change.&lt;br /&gt;&lt;br /&gt;Over time, the software's frameworks, abstract classes, and components come to embody what we've learned about the structure of the domains for which they are built. More enduring insights gravitate towards the primary structural elements of these systems and change rarely. Parts which find themselves in flux are spun out into the data, where users can interact with them. Software evolution becomes like a centrifuge stirred by change. The layers that result, over time, can come to a much truer accommodation with the forces that shaped them than any top-down planning could have devised. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Sweeping It Under The Rug&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;At first glance, a Big Ball of Mud can inspire terror and despair in the hearts of those who would try to tame it. The first step on the road to architectural integrity can be to identify the disordered parts of the system, and isolate them from the rest of it.&lt;br /&gt;&lt;br /&gt;Overgrown, tangled, haphazard spaghetti code is hard to comprehend, repair, or extend, and tends to grow even worse if it is not somehow brought under control. If you can’t easily make a mess go away, at least cordon it off. This restricts the disorder to a fixed area, keeps it out of sight, and can set the stage for additional refactoring.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Reconstruction ... alias &lt;i&gt;Total Rewrite&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One reason to start again might be that the previous system was written by people who are long gone. Doing a rewrite provides new personnel with a way to reestablish contact between the architecture and the implementation. Sometimes the only way to understand a system it is to write it yourself. Doing a fresh draft is a way to overcome neglect. Issues are revisited. A fresh draft adds vigor. You draw back to leap. The quagmire vanishes. The swamp is drained. &lt;br /&gt;&lt;br /&gt;When a system becomes a Big Ball of Mud, its relative incomprehensibility may hasten its demise, by making it difficult for it to adapt. It can persist, since it resists change, but cannot evolve, for the same reason. Instead, its inscrutability, even when it is to its short-term benefit, sows the seeds of its ultimate demise. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The above are highlights from the original article, which is located here ... &lt;a href="http://www.laputan.org/pub/foote/mud.pdf"&gt;Big Ball of Mud by Brian Foote and Joseph Yoder [PDF download]&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Some further reading on Programmers.StackExchange ...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://programmers.stackexchange.com/q/155488/36473"&gt;I've inherited 200K lines of spaghetti code — what now?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programmers.stackexchange.com/q/87757/36473"&gt;How to convince my boss that quality is a good thing to have in code?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programmers.stackexchange.com/q/129327/36473"&gt;How to keep a big and complex software product maintainable over the years?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programmers.stackexchange.com/q/66438/36473"&gt;Techniques to re-factor garbage and maintain sanity?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programmers.stackexchange.com/q/94007/36473"&gt;When is code “legacy”?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://programmers.stackexchange.com/q/103807/36473"&gt;What is negative code?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Some related books ...&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052/?tag=intsecdb-20"&gt;Working Effectively With Legacy Code ... by Michael Feathers&lt;/a&gt; [Amazon]&lt;br /&gt;&lt;a href="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/?tag=intsecdb-20"&gt;Refactoring: Improving the Design of Existing Code ... by M. Fowler, K. Beck, et al.&lt;/a&gt; [Amazon]&lt;br /&gt;&lt;a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/?tag=intsecdb-20"&gt;Design Patterns: Elements of Reusable Object-Oriented Software ... by the Gang of Four&lt;/a&gt; [Amazon]&lt;br /&gt;&lt;a href="http://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420/?tag=intsecdb-20"&gt;Patterns of Enterprise Application Architecture ... by Martin Fowler&lt;/a&gt; [Amazon]&lt;br /&gt;&lt;a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/?tag=intsecdb-20"&gt;Domain Driven Design: Tackling Complexity in the Heart of Software ... by Eric Evans&lt;/a&gt; [Amazon]&lt;br /&gt;&lt;a href="http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124/?tag=intsecdb-20"&gt;Head First Design Patterns by E. Freeman, E. Freeman, et al.&lt;/a&gt; [Amazon]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: initial;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;" /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: initial;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/7658991837949551508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2013/01/big-ball-of-mud-design-pattern.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/7658991837949551508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/7658991837949551508'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2013/01/big-ball-of-mud-design-pattern.html' title='Big Ball of Mud Design Pattern'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-YdDLm3rxKjo/UPUhZa54S0I/AAAAAAAAAPQ/4xTlq26fm_8/s72-c/big_ball_of_mud.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-6837110494198492273</id><published>2013-01-03T02:16:00.000-08:00</published><updated>2013-01-03T02:16:13.013-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='real-time'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><category scheme='http://www.blogger.com/atom/ns#' term='methodologies'/><title type='text'>The first right answer is the only answer</title><content type='html'>Reading through David B. Stewart's paper entitled "&lt;a href="http://dec.bournemouth.ac.uk/staff/awatson/embedded/304.pdf"&gt;Twenty-Five Most Common Mistakes with Real-Time Software Development&lt;/a&gt;" (PDF, 131 KB). &lt;br /&gt;&lt;br /&gt;There's an interesting nugget of advice at number 8, "The first right answer is the only answer";&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;Inexperienced programmers are especially susceptible to assuming that the first right answer they obtain is the only answer. Developing software for embedded systems is often frustrating. It could take days to figure out how to set those registers to get the hardware to do what is wanted. At some point, Eureka! It works. Once it works the programmer removes all the debug code, and puts that code into the module for good. Never shall that code ever change again, because it took so long to debug, nobody wants to break it. &lt;br /&gt;&lt;br /&gt;Unfortunately, that first success is often not the best answer for the task at hand. It is definitely an important step, because it is much easier to improve a working system, than to get the system to work in the first place. However, improving the answer once the first answer has been achieved seems to rarely be done, especially for parts of the code that seem to work fine. Indirectly, however, a poor design that stays might have a tremendous effect, like using up too much processor time or memory, or creating an anomaly in the timing of the system if it executes at a high priority. &lt;br /&gt;&lt;br /&gt;As a general rule of thumb, always come up with at least two designs for anything. Quite often, the best design is in fact a compromise of other designs. If a developer can only come up with a single good design, then other experts should be consulted with to obtain alternate designs.&lt;/i&gt;&lt;/blockquote&gt;As David suggests, when dealing with complex, mission critical or concurrent sections of code, that first success is often not the best solution. Weeks later, you might find that its not performing as well as it should be in production and you have to revisit the section of code again looking for a better solution. But the best time to develop a better solution was back when the job was fresh in your mind, when you developed the original solution.&lt;br /&gt;&lt;br /&gt;So he suggests adapting this into a new practice:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;u&gt;&lt;i&gt;As a general rule of thumb, always come up with at least two designs for anything.&lt;/i&gt;&lt;/u&gt;&lt;/blockquote&gt;&amp;nbsp;There's multiple problems with this advice:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/You_ain%27t_gonna_need_it"&gt;YAGNI&lt;/a&gt;, you ain't gonna need it. Develop an extra solution only if and when you need it; don't create extra work where it might not be needed.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikiquote.org/wiki/Donald_Knuth#Computer_Programming_as_an_Art_.281974.29"&gt;Premature optimization is the root of all evil.&lt;/a&gt; Knowing when you need to optimize a solution further is almost impossible to do at design time, before any benchmarking or code profiling have been done.&lt;/li&gt;&lt;li&gt;Lastly, if your solution passed the unit test, yet fails further down the line (in production for example), then that suggests there was a problem with your unit test, and not with your solution. If required, you should add some specific concurrency and/or performance testing to your unit test. This will mean you can then optimize your code, while maintaining a &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt; approach.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I notice the original article is actually from 1999, which I believe is before test driven development came into prominence. I think this particular piece of advice ("come up with two designs for anything") might have been ok for some projects back then, but would now be considered flawed and certainly not advisable. &lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: initial;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;" /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: initial;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/6837110494198492273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2013/01/the-first-right-answer-is-only-answer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6837110494198492273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6837110494198492273'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2013/01/the-first-right-answer-is-only-answer.html' title='The first right answer is the only answer'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-6609493629043058956</id><published>2012-12-28T00:54:00.000-08:00</published><updated>2012-12-28T00:58:43.282-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='online-retail'/><category scheme='http://www.blogger.com/atom/ns#' term='pricing'/><category scheme='http://www.blogger.com/atom/ns#' term='startups'/><title type='text'>Pricing hacks of online retailers</title><content type='html'>&lt;h2&gt;&lt;span style="color: blue;"&gt;1. Free stuff&lt;/span&gt;&lt;/h2&gt;When retailers offer products and services for "free" there's usually an ulterior motive. For online shops, "free" provides the initial incentive for buyers to use their web site, and may be effective in retaining customer loyalty. One of the most common uses of "free" is free delivery.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example &lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;UK-based &lt;a href="http://www.bookdepository.co.uk/"&gt;The Book Depository&lt;/a&gt; is without doubt using the power of free. The title of their home page is "Free delivery worldwide on all books from The Book Depository". This title shows up in google when searching for "book depository", along with the site's description, which is "The Book Depository offers over 8 million books with free delivery worldwide". The site's byline is "The Book Depository. Free delivery worldwide on all our books". Also in a prominent position on the home page is: "Free worldwide delivery" which links to a page listing all of the countries where they offer free delivery.&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ttUACih_4Ls/UN1SwkTGfGI/AAAAAAAAANY/L1GoTRifoWE/s1600/pricing-book-depository-free-delivery.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="281" src="http://4.bp.blogspot.com/-ttUACih_4Ls/UN1SwkTGfGI/AAAAAAAAANY/L1GoTRifoWE/s640/pricing-book-depository-free-delivery.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="color: blue;"&gt;2. Per customer limits and the perception of product scarcity&lt;/span&gt;&lt;/h2&gt;Per customer limits leads buyers to think that a product is scarce, and increases their incentive to buy now. It also entices people to buy more than they originally intended. The legitimate reason for doing this - to avoid products getting sold on the gray market - is hardly ever a real concern. Retailers will also impose a time limit during which the product is available, along with a ceiling on the number of products that can be sold, after which the deal will end.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example &lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;a href="http://www.livingsocial.com/cities/1727-san-francisco-citywide/deals/536802-laser-nail-fungus-removal-for-feet"&gt;Living Social Deal - Laser Nail Therapy Clinic - 70% Off Laser Nail Fungus Removal for Feet ($450)&lt;/a&gt;&lt;br /&gt;This group buying deal shows a "Limit 4 per customer" in the fine print. Most group buying sites have per customer limits for all their deals. In additon to the per customer limit, there is an absolute limit on how many deals can be sold, as well as the deal only being available for a limited amount of time, in this case, 7 days.&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-RPMntCr1O2Y/UN1S7sAYgsI/AAAAAAAAANg/a3sBTaOB8Ls/s1600/pricing-living-social-per-customer-limit.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-RPMntCr1O2Y/UN1S7sAYgsI/AAAAAAAAANg/a3sBTaOB8Ls/s400/pricing-living-social-per-customer-limit.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="color: blue;"&gt;3. The 9 factor - prices ending in 9, 99 or 95&lt;/span&gt;&lt;/h2&gt;Using prices that end in 9, 99, or 95 is called 'Charm Pricing' or '&lt;a href="http://en.wikipedia.org/wiki/Psychological_pricing"&gt;Psychological Pricing&lt;/a&gt;'. We've been culturally conditioned to associate these prices with discounts. And because we read numbers from left to right, we mentally encode a price like $7.99 as $7, especially when we quickly glance at the price. That's called the "left-digit effect" - it's encoded in our minds before we have finished reading all of the digits.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Pricing of the &lt;a href="https://kindle.amazon.com/"&gt;Amazon Kindle family of products&lt;/a&gt; - $499, $199, $119. &lt;br /&gt;As opposed to $500, $200, $120.&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-4kSTSWYM9rU/UN1TEs3KYuI/AAAAAAAAANo/uiZaPkNbeuM/s1600/pricing-amazon-the-magic-9.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="273" src="http://1.bp.blogspot.com/-4kSTSWYM9rU/UN1TEs3KYuI/AAAAAAAAANo/uiZaPkNbeuM/s400/pricing-amazon-the-magic-9.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="color: blue;"&gt;4. Easy math&lt;/span&gt;&lt;/h2&gt;Most sites, when putting a product on sale, will show you what price it was marked down from. It might be "was $20, now $15". You will rarely see something like, "was $20, now $14.22." The reason is that if the difference is easy to calculate, we tend to think it's a better deal. It's called "computation fluency". Another method employed by many sites is to display the amount of the total saving along with the percentage saved.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;a href="http://www.thebodyshop-usa.com/"&gt;The Body Shop USA&lt;/a&gt; - 50% off Sitewide - After Christmas Sale. Everything is 50% off, making the amount you are saving obvious; you don't need to check any prices or fineprint. Anything you buy on their site will include a significant saving. &lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-BjCI82YqDo4/UN1fMU-Ac0I/AAAAAAAAAPA/xMOTXq_pUfQ/s1600/pricing-body-shop-50-percent-off-sitewide.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="177" src="http://1.bp.blogspot.com/-BjCI82YqDo4/UN1fMU-Ac0I/AAAAAAAAAPA/xMOTXq_pUfQ/s320/pricing-body-shop-50-percent-off-sitewide.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="color: blue;"&gt;5. Sale price font size and color&lt;/span&gt;&lt;/h2&gt;A common practice in online sales is to display the sale price in a different font size and/or color to the original list price. Typically, the original list price will be shown in strike-though.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;a href="http://www.amazon.com/Best-Sellers-Electronics-Laptop-Computers/zgbs/electronics/565108/"&gt;Amazon uses red text to denote a sale price&lt;/a&gt;, shown below the original list price, which is struck out and shown in light gray. &lt;u&gt;However, products which are not on sale and are being sold at the original list price continue to use this red (sale price) font.&lt;/u&gt; One theory says that customers will become accustomed to seeing red text as a saving, and will be more inclined to buy, even when the product is actually not on sale.&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-NLbjARAcMv0/UN1aMKkitmI/AAAAAAAAAOw/Kc5wqT6leXU/s1600/pricing-amazon-font-style.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-NLbjARAcMv0/UN1aMKkitmI/AAAAAAAAAOw/Kc5wqT6leXU/s1600/pricing-amazon-font-style.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ETYLksXRSbg/UN1TTzg5zTI/AAAAAAAAANw/Ok8QJyrBrGk/s1600/pricing-amazon-font-style.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;&lt;span style="color: blue;"&gt;6. Dynamic Pricing (also known as Time-Based Pricing) &lt;/span&gt;&lt;/h2&gt;The airline industry is often cited as a &lt;a href="http://en.wikipedia.org/wiki/Dynamic_pricing"&gt;dynamic pricing&lt;/a&gt; success story. It employs the technique so well that most of the passengers on any given airplane have paid different ticket prices for the same flight. By responding to market fluctuations or large amounts of data gathered from customers - ranging from where they live to what they buy to how much they have spent on past purchases - dynamic pricing allows companies to adjust the prices of identical goods to correspond to a customer’s willingness to pay. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example 1&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;During Thanksgiving week, &lt;a href="http://www.nytimes.com/2012/12/01/business/online-retailers-rush-to-adjust-prices-in-real-time.html?_r=1&amp;amp;"&gt;The New York Times tracked the price of Dance Central 3&lt;/a&gt;, a popular Xbox game, as it dropped on Amazon from $49.96 to $24.99 to $15.&lt;/blockquote&gt;&lt;b&gt;Example 2&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Coca-Cola tested dynamic pricing in automated vending machines where prices would fluctuate based on the surrounding temperature. Their theory was a soft drink would be worth more when it is hotter outside, and correspondingly, demand for soft drinks would decrease if it were cold outside. It was an &lt;a href="http://www.johnstockmyer.com/enmu/coke.htm"&gt;unpopular idea&lt;/a&gt; and luckily, Coca-Cola abandoned it.&lt;/blockquote&gt;&lt;b&gt;Sidenote&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Oren Etzioni, a computer science professor at the University of Washington, became incensed when he found out that the traveller sitting next to him on a flight got a much better price for his ticket than he did. Etzioni started collecting online price data from all US airlines, then he created his own formula that could predict when the airlines would raise or lower their prices. His company was bought by Microsoft. And today, when you search for flights on Microsoft's &lt;a href="http://www.bing.com/travel"&gt;Bing Travel site&lt;/a&gt;, you'll see colour coded arrows (called the "price predictor") letting you know you if the price of that ticket is likely to head up or down.&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-JJJSHMhBUJ4/UN1Tb5TNoMI/AAAAAAAAAN4/XJkE3F_YpOo/s1600/pricing-bing-price-predictor.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-JJJSHMhBUJ4/UN1Tb5TNoMI/AAAAAAAAAN4/XJkE3F_YpOo/s1600/pricing-bing-price-predictor.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="color: blue;"&gt;7. Pay what you want &lt;/span&gt;&lt;/h2&gt;&lt;a href="http://en.wikipedia.org/wiki/Pay_what_you_want"&gt;Pay what you want&lt;/a&gt; is a pricing system where buyers pay any desired amount for a given product or service, sometimes including paying nothing (i.e. free). Sometimes a minimum (floor) price may be set, or a suggested price may be indicated to the buyer. The buyer can also pay an amount higher than the standard price.&lt;br /&gt;&lt;br /&gt;It has the benefit of reducing &lt;a href="http://en.wikipedia.org/wiki/Buyer%27s_remorse"&gt;buyer's remorse&lt;/a&gt;, which is what happens when you decide afterwards that you've paid too much for a product. It also can result in a viral increase in popularity or visibility for a product when used in highly competitive markets.&lt;br /&gt;&lt;br /&gt;It is often used for products which use digital delivery, such as software and music. There is usually no additional cost per download to the seller anyway, since the site's bandwidth would usually be paid for on a capped, monthly basis. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example 1&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Freeware software is often distributed under this model. For example, on the home page of &lt;a href="http://www.getpaint.net/"&gt;Paint.net&lt;/a&gt; is the message "Show your appreciation for Paint.NET and support future development by donating!". Typically, a PayPal donate button is used.&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-R8FyoVPYD_o/UN1TmPGUCHI/AAAAAAAAAOA/x-Cv7aVjzCw/s1600/pricing-paint-dot-net.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-R8FyoVPYD_o/UN1TmPGUCHI/AAAAAAAAAOA/x-Cv7aVjzCw/s1600/pricing-paint-dot-net.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Example 2&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;In October 2007, Radiohead released their seventh album, &lt;a href="http://en.wikipedia.org/wiki/In_Rainbows"&gt;In Rainbows&lt;/a&gt;, through the band's website as a digital download and requested fans just pay whatever amount they thought it was worth.&lt;/blockquote&gt;&lt;b&gt;Example 3&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Introduced during May 2010, the &lt;a href="http://www.humblebundle.com/"&gt;Humble Bundle&lt;/a&gt; was a set of six downloadable indie games which were distributed using a pay what you want system (with inclusion of a buyer-controllable charitable contribution).&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DaooPaNsk6E/UN1TwpBZ2EI/AAAAAAAAAOI/YauHiJZ4GYY/s1600/pricing-humble-bundle.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="350" src="http://4.bp.blogspot.com/-DaooPaNsk6E/UN1TwpBZ2EI/AAAAAAAAAOI/YauHiJZ4GYY/s640/pricing-humble-bundle.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="color: blue;"&gt;8. Freemium &lt;/span&gt;&lt;/h2&gt;&lt;a href="http://en.wikipedia.org/wiki/Freemium"&gt;Freemium&lt;/a&gt; is a business model that works by offering a base product or service free of charge (typically digital offerings such as software, games or online software - software as a service). A premium is then charged for advanced features, functionality, or for related products and services. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example 1&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;LinkedIn - Basic features of the social network are available for free. For the ability to see the profile of members outside your network, and to access advanced features, you'll need to pay.&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-TJTgDdFm_ks/UN1T52JFjII/AAAAAAAAAOQ/QTo3cc7uDYA/s1600/pricing-linked-in.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="334" src="http://2.bp.blogspot.com/-TJTgDdFm_ks/UN1T52JFjII/AAAAAAAAAOQ/QTo3cc7uDYA/s640/pricing-linked-in.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Example 2&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;a href="http://go.bloomberg.com/tech-blog/2012-12-20-the-new-york-times-paywall-is-working-better-than-anyone-had-guessed/"&gt;The New York Times paywall&lt;/a&gt;. A limited number of news articles can be read for free per month. To get full access to the site, you'll need to pay. &lt;/blockquote&gt;&lt;b&gt;Example 3&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Zynga publishes games for Facebook and the major smartphone/tablet app stores. Typically there are in-game actions (e.g. farming) which result in being rewarded with an in-game currency (e.g. loot/coins/points). The &lt;a href="http://en.wikipedia.org/wiki/Virtual_currency"&gt;in-game currency&lt;/a&gt; can then be used to buy additional game features, or to progress further in the game. The in-game currency can be topped up, via a payment to Zynga in real dollars via an &lt;a href="https://developer.apple.com/appstore/in-app-purchase/index.html"&gt;in-app-purchase&lt;/a&gt;.&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-VDlmMGda_I8/UN1UDbqryhI/AAAAAAAAAOY/RRqgfvvmDpE/s1600/pricing-zynga-in-app-purchase.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://1.bp.blogspot.com/-VDlmMGda_I8/UN1UDbqryhI/AAAAAAAAAOY/RRqgfvvmDpE/s400/pricing-zynga-in-app-purchase.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="color: blue;"&gt;9. No dollar signs&lt;/span&gt;&lt;/h2&gt;A 2009 &lt;a href="http://www.hotelschool.cornell.edu/research/chr/pubs/reports/abstract-15048.html"&gt;Cornell University study&lt;/a&gt; found that diners in upscale restaurants spent significantly less when menus contained the word "dollars" or the symbol "$". Restaurants use the technique of omitting dollar signs to get you to focus on the product being sold (the food) rather than the price. They may also mention or profile the chef who is cooking the food. Apart from the websites of restaurants, its difficult to see this being used much in general online retailing.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;a href="http://www.gramercytavern.com/"&gt;Gramercy Tavern, New York City&lt;/a&gt;&lt;br /&gt;According to Urbanspoon this is the most popular fine dining restaurant in New York City.There's no dollar signs at all on their website, and their &lt;a href="http://gramercytavern.com/_media/uploads/lunch_menu.pdf"&gt;a la carte lunch menu (pdf)&lt;/a&gt; doesn't feature any dollar signs either, only numbers. &lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-wfvdpWrb8MM/UN1US3xs5XI/AAAAAAAAAOg/5fVLyJuJdHk/s1600/pricing-gramercy-tavern-nyc-no-dollar-signs.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-wfvdpWrb8MM/UN1US3xs5XI/AAAAAAAAAOg/5fVLyJuJdHk/s320/pricing-gramercy-tavern-nyc-no-dollar-signs.PNG" width="298" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="color: blue;"&gt;10. "X for $X"&lt;/span&gt;&lt;/h2&gt;Buyers will often buy more of a product than they originally intended, if it means they will secure a bargain.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;a href="http://www.bathandbodyworks.com/family/index.jsp?categoryId=16110176&amp;amp;cp=15452826"&gt;Bath and Body Works - 5 for $5 sale&lt;/a&gt;&lt;br /&gt;In this case you need to buy 5 products to realise a saving of 33% off the original list price.&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/6609493629043058956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/12/pricing-hacks-of-online-retailers.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6609493629043058956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6609493629043058956'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/12/pricing-hacks-of-online-retailers.html' title='Pricing hacks of online retailers'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-ttUACih_4Ls/UN1SwkTGfGI/AAAAAAAAANY/L1GoTRifoWE/s72-c/pricing-book-depository-free-delivery.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-6135282225156458671</id><published>2012-12-16T17:59:00.000-08:00</published><updated>2012-12-16T17:59:27.302-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='code-craft'/><title type='text'>Defensive copy and paste coding</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;I've got into the habit of doing this check at the end of any     development which has involved some copy &amp;amp; pasting of     existing code.&amp;nbsp;It's been useful for me in picking up issues before     build/test/commit.&lt;/div&gt;&lt;br /&gt;    It just involves getting a reference count of all occurrences the     new variable (or function) compared with the old variable (or     function)...&lt;br /&gt;    &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Select the newly added variable (or function) name&lt;/li&gt;&lt;li&gt;Right-click to bring up the context menu&lt;/li&gt;&lt;li&gt;Select the "Find all references" option&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-852dzrs8nas/UM571PsBv_I/AAAAAAAAANA/W9ukpFmaAZ8/s1600/find_all_refs_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://3.bp.blogspot.com/-852dzrs8nas/UM571PsBv_I/AAAAAAAAANA/W9ukpFmaAZ8/s640/find_all_refs_1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div&gt;The screenshot shown is from Visual Studio, but this feature is also     available in other IDEs and editors, such as Eclipse (via the "References" context menu). Alternatively,     if you're not using an IDE, a simple text search across all files in     your project will be just as useful, assuming that the search string is unique within your project.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-exuVjULBRAU/UM5718_5UXI/AAAAAAAAANE/MHxfbZBPIDg/s1600/find_all_refs_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="264" src="http://1.bp.blogspot.com/-exuVjULBRAU/UM5718_5UXI/AAAAAAAAANE/MHxfbZBPIDg/s640/find_all_refs_2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Often, you'd expect the reference count should match with the one     you've copy &amp;amp; pasted from (as shown above). If it doesn't match, then by looking     at the references which are different, you should be able to easily     reason about why, and whether its expected or not. If its unexpected, that could mean there's an     error in your code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;So who admits to &lt;a href="http://www.codinghorror.com/blog/2009/04/a-modest-proposal-for-the-copy-and-paste-school-of-code-reuse.html"&gt;copy &amp;amp; paste coding&lt;/a&gt;&amp;nbsp;-&amp;nbsp;isn't it a sign of bad     programming? ... if you can copy &amp;amp; paste big blocks of code, followed by only a     few small changes then that's a code smell - you should probably     extract the common code into a new function and call it     twice. Agreed on that, but there is still many cases where you do     have a valid reason to copy existing code. One example is to make fine grained     changes to some logic, when it might not be worth the additional     complexity of creating a generic function to handle both cases. Or in the case shown above, when I'm copying the declaration of a collection member.&lt;br /&gt;    &lt;br /&gt;This is a pretty simple and obvious technique, and it might be well known to many already, but I thought I'd mention it anyway.&amp;nbsp;It can also be used outside of the copy &amp;amp;     paste case - just mentioning it here because that's the     case I've used it more often.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: initial;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;" /&gt;&lt;br style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;" /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: initial;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/6135282225156458671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/12/defensive-copy-and-paste-coding.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6135282225156458671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6135282225156458671'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/12/defensive-copy-and-paste-coding.html' title='Defensive copy and paste coding'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-852dzrs8nas/UM571PsBv_I/AAAAAAAAANA/W9ukpFmaAZ8/s72-c/find_all_refs_1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-4120552852321314590</id><published>2012-11-04T05:20:00.000-08:00</published><updated>2012-11-04T05:43:47.552-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>The slow decline of PCs and the fast rise of Smartphones/Tablets was predicted in 1993</title><content type='html'>&lt;br /&gt;I've just read some predictions for the future of the PC, written in 1993, by &lt;a href="http://en.wikipedia.org/wiki/Nathan_Myhrvold"&gt;Nathan P. Myhrvold&lt;/a&gt;, the former Chief Technology Officer at Microsoft.&lt;br /&gt;&lt;br /&gt;His memo is amazingly accurate. Note that his term "IHC" (Information Highway Computer) could be roughly equated with today's smartphone or tablet device, connecting to the Internet via WiFi or a cellular network. In his second last paragraph, Myhrvold predicts the winners will be those who &lt;i&gt;"own the software standards on IHCs"&lt;/i&gt; which could be roughly equated with&amp;nbsp;today's&amp;nbsp;app stores, such as those on iOS (Apple), Android (Google, Amazon) and Windows 8 (Microsoft).&lt;br /&gt;&lt;br /&gt;The only thing you could say he possibly didn't foresee would be the importance of hardware design in the new smartphone and tablet industry. I'd suggest that Apple achieved such a head start on their competition through a combination of both cutting edge hardware design along with their curated app store model for distributing software. Interestingly, Microsoft has only last month entered the hardware game with their new Surface brand tablets for Windows 8 and Windows RT, and also&amp;nbsp;&lt;a href="http://www.microsoft.com/investor/reports/ar12/shareholder-letter/index.html"&gt;announced&lt;/a&gt; a shift to focus on becoming a "Devices and Services" company.&lt;br /&gt;&lt;br /&gt;Note: the term "Cairo" used below is the code name for a Microsoft Research project which lasted from 1991 to 1996. It resulted in some features that were eventually rolled into Windows 95, IIS and SQL Server.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The below is an extract from a memo written by Nathan P. Myhrvold, titled "Road Kill on the Information Highway". September 8, 1993.&amp;nbsp;&lt;a href="http://webcache.googleusercontent.com/search?q=cache:1KhJ7zbEkSwJ:www.microsoft.com/about/companyinformation/timeline/timeline/docs/bp_ROADKILL.rtf&amp;amp;cd=6&amp;amp;hl=en&amp;amp;ct=clnk&amp;amp;gl=us&amp;amp;client=mobilesearchapp"&gt;&lt;b&gt;Full Source&lt;/b&gt;&lt;/a&gt;.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;&lt;b&gt;Personal Computers&lt;/b&gt;&lt;br /&gt;I've saved the best for last. &amp;nbsp;Our own industry is also doomed, and will be one of the more significant carcasses by the side of the information highway. &amp;nbsp;The basic tasks that PCs are used for today will continue for a long as it makes sense to predict, so it isn't a question of the category disappearing. &amp;nbsp;The question is one of who will continue to satisfy these needs and how?&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;As a case in point, consider that the fundamental category needs for mainframes and minicomputers also still exists and will continue to do so for a very long time. &amp;nbsp;Despite this, the companies involved are dying and the entire genre is likely to disappear. &amp;nbsp;The reason is that a new breed of machine - the PC - came along which out flanked them. &amp;nbsp;In the early years PCs were not particularly good at what minis and mainframes did, but they were terrific at a whole new set of problems that the traditional computing infrastructure had basically ignored.&amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;Personal productivity applications drove PCs onto millions of desks and created a very vital industry which grew faster - both in business terms and price/performance - than the mainframe and minicomputer markets. &amp;nbsp; The power conferred by this growth made PCs the tail which wagged the dog; free to ignore the standards which existed for mainframes and minis and move off on their own. &amp;nbsp; Over time the exponential growth in computing has finally (after 17 years) given the PC industry the technical ability to beat minis and mainframes in their own domain. &amp;nbsp; Although the early software platforms for PCs had to be extended to fully realize this potential (DOS to Windows to NT to Cairo), it turned out to be far easier to do this than to make mainframe or minicomputer systems address the new needs and applications. &amp;nbsp; Even within the heart of minicomputer and mainframe's domain - giant transaction processing applications etc., the old standards will not be used.&amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;I believe that the same thing will happen again with PCs playing the role of mainframes and minis, and the computing platforms of the information highway taking over the role of the challenger. &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;The technical needs of computers on the information highway, or IHCs are quite different than for PCs. &amp;nbsp;The killer applications for IHCs in the early years will include video on demand, games, video telephony and other distributed computing tasks on the highway. &amp;nbsp;It is hard to classify this as either higher tech or lower tech than the software for PCs, because the two are quite different. &amp;nbsp; Most IHCs will certainly need to be cheaper than PCs by an order of magnitude and this will inevitably cause them to be less capable in many ways, but some of their requirements are far more advanced.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;Another way to say this is that the rich environment of software for PCs is largely irrelevant for IHCs. &amp;nbsp; Windows, NT, System 7 and Cairo do not solve the really important technical problems required for IHC applications, and it is equally likely that the early generations of IHC software won't be great platforms for PC style apps. &amp;nbsp;This isn't surprising because they are driven by an orthogonal set of requirements.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;The IHC world will almost certainly grow faster than PCs, both in business terms and in price/performance. &amp;nbsp; The PC industry is already reaching saturation from a business perspective. &amp;nbsp;Technically speaking, the industry is mired in hardware standards (Intel and Motorola CISC processors) &amp;nbsp;with growth rates that are flattening out relative to the state of the art - just as the 360/3090 and VAX architectures did. &amp;nbsp; The Macintosh and Windows computing environments may be able to survive the painful transition to new RISC architectures, but they will lose time and momentum in doing so. &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;PCs will remain paramount within their domain for many years (we'll still have a computer on every desk) but IHCs will start to penetrate a larger and larger customer base on the strength of its new and unique applications. &amp;nbsp; The power of having the worlds information - and people - on line at any time is too compelling to resist. &amp;nbsp; For a long time people will still have a traditional PC to handle traditional PC tasks - in precisely the same way that they have kept their mainframes and minis for the last 17 years. &amp;nbsp; One day however people will realize that their little IHCs are more powerful and cheaper than PCs - just as we have finally done with mainframes. &amp;nbsp; There will be a challenge for the IHC software folks to write the new systems and applications software necessary to obviate PCs, just as we had to work pretty hard to come up with NT, but this battle will clearly go to the companies who own the software standards on IHCs. &amp;nbsp;The PC world won't have any more say about how this is done than the companies who created MVS or VMS did about our world. &amp;nbsp;Of course, some of the VMS people were involved, but as discussed above it is very hard for organizations to make the transition.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;This may sound like a rather dire prediction, but I think that for the most part it is inevitable. &amp;nbsp;The challenge for Microsoft is to be sufficiently involved with the software for the IHC world that we can be a strong player in that market. &amp;nbsp;If we do this then we will be able to exploit a certain degree of synergy between IHCs and PCs - there are some natural areas where there is benefit in having the two in sync. &amp;nbsp;The point made above is that those benefits are not sufficiently strong that they alone will give us a position in the new world. &amp;nbsp; We'll live or die on the strength of the technology and role that we carve out for ourselves in the brave new world of the information highway.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;Many thanks to Reddit user &lt;a href="http://www.reddit.com/user/erpettie"&gt;erpettie&lt;/a&gt; who originally submitted a &lt;a href="http://www.reddit.com/r/technology/comments/12lnh8/this_memo_from_nathan_myhrvold_at_microsoft_in/"&gt;link to this memo on /r/technology&lt;/a&gt;,which is how I came across it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;" /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;span style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"&gt;&amp;nbsp;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/4120552852321314590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/11/the-slow-decline-of-pcs-and-fast-rise.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/4120552852321314590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/4120552852321314590'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/11/the-slow-decline-of-pcs-and-fast-rise.html' title='The slow decline of PCs and the fast rise of Smartphones/Tablets was predicted in 1993'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-1931460179016608158</id><published>2012-09-08T06:50:00.000-07:00</published><updated>2013-05-23T18:05:40.141-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><category scheme='http://www.blogger.com/atom/ns#' term='code-craft'/><category scheme='http://www.blogger.com/atom/ns#' term='methodologies'/><title type='text'>Q&amp;A With Nine Great Programmers</title><content type='html'>&lt;br /&gt;&lt;b&gt;This Q&amp;amp;A article is originally from 2006, published on the blog of&amp;nbsp;Polish developer Jaroslaw "sztywny" Rzeszótko (AKA "Stiff"). &amp;nbsp;That original blog post is no longer online. Gratefully republished with his permission.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;On a hot, boring afternoon I got an idea. With the help of publicly accessible e-mail addresses, I asked 10 questions to a bunch of programmers that I consider very interesting people and I respect them for various things they created. Coming out with the questions was a 5 minute job for me - these are things I would ask about if I could speak with them personally for, let’s say, 10 minutes, and I didn’t have time for thinking too much. The last two question don’t have anything to do with programming, this is simply something I like to know about everyone I talk to, lets say that’s my hobby. Not everyone wanted to answer them, and that’s fine. It was the first "interview" I ever made, so I also made some mistakes, which went out as people started answering. But despite this, I learnt a lot of interesting stuff, so it was definitely a valuable experience.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;i&gt;Not everyone responded to my e-mail, not everyone agreed to answer the questions, maybe I will also get some answers after I published this, I didn’t have the patience to wait longer, so new things may appear here over time (Update: Bjarne Stroustrup was added on 03.08.2006).&lt;/i&gt;&lt;br /&gt;&lt;i&gt;--&amp;nbsp;Jaroslaw&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #351c75; font-size: large;"&gt;Starring&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Linus_Torvalds"&gt;&lt;b&gt;Linus Torvalds&lt;/b&gt;&lt;/a&gt;&amp;nbsp;- The &lt;a href="http://linux.org/"&gt;Linux kernel&lt;/a&gt; author.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Dave_Thomas_(programmer)"&gt;&lt;b&gt;Dave Thomas&lt;/b&gt;&lt;/a&gt; - Author of the "Pragmatic Programmer", "Programming Ruby" and other great books about programming. One can read his mainly programming-related thoughts &lt;a href="http://pragdave.pragprog.com/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/David_Heinemeier_Hansson"&gt;&lt;b&gt;David Heinemeier Hansson&lt;/b&gt;&lt;/a&gt; - Author of the &lt;a href="http://rubyonrails.org/"&gt;Rails Framework&lt;/a&gt; - the new hot web development framework. He has a blog &lt;a href="http://david.heinemeierhansson.com/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Steve_Yegge"&gt;&lt;b&gt;Steve Yegge&lt;/b&gt;&lt;/a&gt; - Probably one of the least known guys here, but he also sent most interesting answers. He has a popular &lt;a href="http://steve-yegge.blogspot.com/"&gt;blog&lt;/a&gt; about programming. He is also the author of a game called "Wyvern".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Peter_Norvig"&gt;&lt;b&gt;Peter Norvig&lt;/b&gt;&lt;/a&gt; - Research Director at Google, a well known Lisper, author of famous (in some circles at least) books about AI. See his homepage &lt;a href="http://norvig.com/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Guido_Van_Rossum"&gt;&lt;b&gt;Guido Van Rossum&lt;/b&gt;&lt;/a&gt; - The &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; language creator.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Bjarne_Stroustrup"&gt;&lt;b&gt;Bjarne Stroustrup&lt;/b&gt;&lt;/a&gt; - C++ language creator, has a homepage &lt;a href="http://www.stroustrup.com/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/James_Gosling"&gt;&lt;b&gt;James Gosling&lt;/b&gt;&lt;/a&gt; - The &lt;a href="http://java.sun.com/"&gt;Java&lt;/a&gt; language creator.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Tim_bray"&gt;&lt;b&gt;Tim Bray&lt;/b&gt;&lt;/a&gt; - One of the XML and Atom specifications author and a &lt;a href="http://www.tbray.org/ongoing/"&gt;blogger&lt;/a&gt; too.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-size: large;"&gt;&lt;b&gt;Q 1: How did you learn programming? Were any schools of any use? Or maybe you didn’t even bother with ending any schools :) ?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Steve Yegge&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I taught myself to program on an HP calculator using their RPN stack language when I was 17 years old. I’d tried to learn programming a few times before that but never really "got" it. The HP 28c and 48g scientific calculators were pretty powerful and had great docs. I wrote a 3D wireframe viewer for the 48g — I got a book on 3D graphics and painstakingly translated an example program in Pascal into the RPN stack language. It was pretty sweet when I got it running. After that I bought a PC and Turbo Pascal, and started studying programming in earnest. I was a decently good programmer by the time I went into the CS program in college.&lt;br /&gt;&lt;br /&gt;I went to the University of Washington and got an undergrad degree in CS. It was definitely worthwhile, and I recommend that all programmers should try to get a CS degree if possible.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Linus Torvalds&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I didn’t learn programming in school, but mostly on my own reading books and just doing it (initially on a Commodore VIC-20, later on a Sinclair QL).&lt;br /&gt;&lt;br /&gt;That said, I think especially University was very useful. Rather than go to an engineering school, I went to Helsinki University, which is pretty theoretical, so there the teaching concentrated not so much on programming (which was just a small part, and which I ended up doing more of "on the side" anyway), but most of the courses tended to be on fundamental concepts and things like complexity analysis.&amp;nbsp;Which can seem boring and even a waste of effort at times, but I think it was useful, and I mostly enjoyed it. And I think I’m probably a better programmer for it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;David Heinemeier Hansson&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I learned programming by starting to put together my first web page in HTML. Then I wanted to make some dynamic pieces and picked up first ASP then PHP. After I already knew how to program, I then started on a joint computer science and business administration degree.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Peter Norvig&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I took courses in high school and college, but always felt I learned more on my own.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Dave Thomas&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;During my secondary schooling I took a class in a local technical college on computers. It got me totally hooked: I fell in love with programming, and looked around for colleges offering courses in software. Eventually I went to Imperial College, part of London University. It was only the second year they’d offered a course in software, and it was absolutely marvelous: the staff and students worked together to make the materials better, and everyone learned a lot. The undergraduate course there gave me an incredibly strong background in software development. I stayed on to start a PhD, but got lured away by a startup.&lt;br /&gt;&lt;br /&gt;But the overall question is "how did you learn programming?" The real answer to that is "I’m still learning programming." I think any good developer continues to learn throughout their careers. It isn’t just a question of picking up new languages and libraries: good developers also refine their techniques and practices over the years.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Guido Van Rossum&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I went to university where they had a big mainframe and there were various computer courses. This was very important for me.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;James Gosling&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Initially, I was self-taught. I got my first programming job before I went to college. But I’m glad I did. I had a lot of fun. I kept going until I had a PhD.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Bjarne Stroustrup&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;In university (Aarhus and later Cambridge). The universities taught me much that was useful, incl. most of the bases for my future work. In addition, I learned a fair bit from programming for money - where understanding of real-world problems, correctness, maintainability, on-time delivery, etc. were more pressing than in an educational setting.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Tim Bray&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I thought I was going to be a math teacher. The math program at University required a few computer science courses.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #351c75; font-size: large;"&gt;Q 2: What do you think is the most important skill every programmer should posses?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Steve Yegge&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Written and verbal communication skills. You’ll never make it very far as a programmer in any field unless you can get your ideas across to people effectively. Programmers should read voraciously, practice writing, take writing courses, and even practice at public speaking.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Linus Torvalds&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;It’s a thing I call "taste".&lt;br /&gt;&lt;br /&gt;I tend to judge the people I work with not by how proficient they are: some people can churn out a lot of code, but more by how they react to other peoples code, and then obviously by what their own code looks like, and what approaches they chose. That tells me whether they have "good taste" or not, and the thing is, a person without "good taste" often is not very good at judging other peoples code, but his own code often ends up not being wonderfully good.&lt;br /&gt;&lt;br /&gt;But hey, it’s not the only thing. One thing that is very useful, especially in an open source project, is simply the ability to communicate well what you want to do, and how you are going to do it. The ability to explain to others why you do something a certain way is very important, and not everybody has that ability.&lt;br /&gt;&lt;br /&gt;That said, in the end there are also the people who just churn out good code. They may not be good at explaining it, and they may not even have great taste, but the code works well. Sometimes you need another person (one that does have that hard-to-define "taste") to maybe massage the code into a form where it’s useful in the bigger picture, but just the ability to write clear code for difficult problems is obviously a fairly&amp;nbsp;fundamental&amp;nbsp;part of any programmer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;David Heinemeier Hansson&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;A strong sense of value. The ability to ask yourself the question: Is it worth doing what I’m doing right now? So many programmers seem to waste oceans of time on stuff that just doesn’t matter. And not enough on the stuff that does.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Peter Norvig&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I don’t think there’s one, but let’s say concentration.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Dave Thomas&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Passion.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Guido Van Rossum&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Your questions are rather general and hard to answer. :-) I guess being able to cook an egg for breakfast is invaluable.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;James Gosling&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;To be self motivated. To be really good, you have to be in love with what you do.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Bjarne Stroustrup&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;The ability to think clearly: A programmer has to understand problems and express solutions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Tim Bray&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Ability to prefer evidence to intuition.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #351c75; font-size: large;"&gt;Q 3: Do you think mathematics and/or physics are an important skill for a programmer? Why?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Steve Yegge&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;There is a large branch of mathematics that’s very important for programmers called "discrete math" or "concrete math". It includes disciplines such as probability, combinatorics, graph theory, induction proofs, and other useful tools. I would encourage all programmers to study discrete mathematics to whatever extent they can. Even a little is better than none at all.&lt;br /&gt;&lt;br /&gt;As for more traditional math, well, I don’t use it as often, but it comes in very handy when I need it. For instance, I’ve only used calculus once in the past year as part of my job. I had to estimate loads for the peak traffic hour of the day for a service whose load "follows the sun" in an approximate sine curve. The simplest way to make the estimate was to integrate over 1/24th of the curve at a specific time. If I hadn’t known calculus, I would not have known how to make a reasonably accurate estimate.&lt;br /&gt;&lt;br /&gt;When I was writing my game, Wyvern, having a solid working knowledge of basic planar geometry was incredibly helpful. And it’s quite common to use algebra and linear algebra on a regular basis. But I rarely use trigonometry or differential equations on the job, and not much calculus either.&lt;br /&gt;&lt;br /&gt;I’d say my basic math foundation has made me maybe 5% to 10% better as a programmer. If I knew a lot more math, I’d undoubtedly be a much better programmer than I am today, so I study and practice math several hours a week.&lt;br /&gt;&lt;br /&gt;I love physics and I have an ongoing, lifelong quest to try to understand the underpinnings of quantum mechanics. But I’ve never personally found any physics very useful towards my job as a programmer. That would, of course, be diffferent if I were doing something in a physics domain, such as 3D game programming, or certain types of simulation.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Linus Torvalds&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I personally think a fairly strong math background is a good thing. I’m not as sure about the physics side, but I’m convinced that understanding math and having a good background in it helps you to be a better programmer. If only because the mental models are similar - you can build up any kind of set of rules you want, but it should be self-consistent.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;David Heinemeier Hansson&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Not at all. At least not for the kind of business programming needed for web applications. I consider it much more important that someone is a good writer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Peter Norvig&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Yes. Many ideas are inherently mathematical: induction, recursion, logic, etc.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Dave Thomas&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Maybe. But, to be honest, I haven’t seen much of a correlation either way between these types of discipline and good software developers.&lt;br /&gt;&lt;br /&gt;However, I have seen a strong correlation between people who have some music in their background and programming skills. I have no idea why, but I suspect that some of the areas of the brain that make someone musical also make them good at software development.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Guido Van Rossum&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Math, yes (for some parts; I don’t care for differential equations, but algebra and logic are important). Physics, I don’t think so except it’s always useful to be interested in many different things.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;James Gosling&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Yes! They teach you logic &amp;amp; deduction... To have an analytical eye. And there’s no replacement for mathematics when it comes to analyzing algorithms.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Bjarne Stroustrup&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Depends on the programmer and the programming tasks. Some forms of math are frequently useful; physics less often so, but then learning physics is one of the best ways of learning practical math.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Tim Bray&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;In my case, I’ve almost never used my university-level math to support my programming.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #351c75; font-size: large;"&gt;Q 4: What do you think will be the next big thing in computer programming? X-oriented programming, y language, quantum computers, what?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Steve Yegge&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I think web application programming is gradually going to become the most important client-side programming out there. I think it will mostly obsolete all other client-side toolkits: GTK, Java Swing/SWT, Qt, and of course all the platform-specific ones like Cocoa and Win32/MFC/etc.&lt;br /&gt;&lt;br /&gt;It’s not going to happen overnight. It’s very slowly been going that direction for ten years, and it could well be another ten years before web apps "win". The tools, languages, APIs, protocols, and browser technology will all have to improve far beyond what you can accomplish with them today. But each year they get a little closer, and I’ve finally decided to switch all my own app development over to browser-based programming from now on.&lt;br /&gt;&lt;br /&gt;Microsoft and Apple definitely don’t want this to happen, so a necessary first step will be for an open-source browser such as Firefox to achieve a dominant market position, which will in turn require some sort of Firefox-only killer app. (A killer app would be something like iTunes, something that everyone in the world wants to use, badly enough to download Firefox for it.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Linus Torvalds&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I don’t think we’ll see a "big jump". We’ve seen a lot of tools to help make all the everyday drudgery easier - with high-level languages and perhaps the integration of simple databases into the language being the main ones. But most of the buzz-words have been of pretty limited use.&lt;br /&gt;&lt;br /&gt;For example, I personally believe that "Visual Basic" did more for programming than "Object-Oriented Languages" did. Yet people laugh at VB and say it’s a bad language, and they’ve been talking about OO languages for decades.&lt;br /&gt;&lt;br /&gt;And no, Visual Basic wasn’t a great language, but I think the easy DB interfaces in VB were fundmantally more important than object orientation is, for example.&lt;br /&gt;&lt;br /&gt;So I think there will be a lot of incremental improvements, and the hardware improvements will make programming easier, but I don’t expect any huge productivity help or revolutions in how people do things.&lt;br /&gt;&lt;br /&gt;At least not until you start approaching real AI, and I don’t think real AI is going to be anything you will ever "program".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;David Heinemeier Hansson&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I try not to predict the future. I’m not a big believer in fortune telling. The best way to predict the future is to implement it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Peter Norvig&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Large-scale distributed processing.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Dave Thomas&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;The next big thing in computer programming will be eclipsed by the next–next big thing in programming, and so on, and so on. I’m kinda tired of the endless search for the big things, because while doing it people tend to forget about the real issues: getting the fundamentals right. We need to get a whole lot better at talking with our customers, focussing on delivering value, and taking pride in what we do. A developer who can do these things can deliver great software with any tool set, and won’t need to worry about tracking the fads and fashions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Guido Van Rossum&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Sorry, I’m not much of a crystal ball person. I predicted CGI about 5 years after it had been invented. :-)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;James Gosling&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;The two issues I’m most concerned about now are coping with parallelism and complexity.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Bjarne Stroustrup&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I don’t know, and I don’t like to guess.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Tim Bray&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;No idea.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #351c75; font-size: large;"&gt;Q 5: If you had three months to learn one&amp;nbsp;relatively&amp;nbsp;new technology, which one would you choose?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Steve Yegge&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I do happen to have 3 months (part-time), and I’m spending it learning Dojo (http://dojotoolkit.org) and advanced AJAX and DHTML. I’m learning it by writing a fairly ambitious web application. Dojo’s really cool, and I’m sure it will only improve with time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Linus Torvalds&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Hmm. I’d really love to do FPGA’s, but I’ve always been too busy to really sit down and start learning. I love the notion of playing with hardware: it’s obviously one of the reasons I ended up doing operating systems, since that (along with compilers) is about as close as you can get to playing with the hardware, without actually designing or building it yourself.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;David Heinemeier Hansson&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Cocoa programming for the Mac.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Peter Norvig&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I’d like to know Javascript better. Also flash.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Dave Thomas&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;If "new" means "new to Dave Thomas" then I think I’d take intensive piano lessons.&lt;br /&gt;&lt;br /&gt;If "new" means technology stuff, then I guess I’d choose technologies related to accessibility for people with disabilities.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Guido Van Rossum&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Snowboarding.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;James Gosling&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;For fun, I’d catch up on the latest in 3D rendering. I’d probably write a photon-map renderer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Bjarne Stroustrup&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;There are very few things of any importance that you can learn in three month. I think you must be thinking of training in a well established field.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Tim Bray&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Security, encryption, digital signatures, identity, etc. It’s a big problem for me that I’ve never learned this stuff.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-size: large;"&gt;&lt;b&gt;Q 6: What do you think makes some programmers 10 or 100 times more productive than others?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Steve Yegge&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I think if you pause to consider why not all atheletes are equally good, you’ll have your answer(s). Thomas Edison has a relevant quote about genius that might also provide you some clues.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Linus Torvalds&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I really have no idea. I think some people are just better able to concentrate on the things that matter, and I think a lot of it is just doing it. Most of the really good programmers I know started doing it fairly young.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;David Heinemeier Hansson&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;The ability to restate hard problems as easy ones.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Peter Norvig&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;The ability to fit the whole problem into their heads at one time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Dave Thomas&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;They care about what they do.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Guido Van Rossum&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Genetically different brain structure.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;James Gosling&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;They think about what they do. They don’t rush in and slap things together. They have a holistic picture of what is to be built.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Bjarne Stroustrup&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;First a general lack of professionalism and adequate training. that sets the base level too low. Secondly, some people have a combination of "smarts" (ability to think clearly and get to the heart of things), experience, and knowledge of tools. Programming leaves more scope for that because it is a combination of theory and practice - neither of which is much use without domain knowledge.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Tim Bray&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;The surprising variability of the human mind.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-size: large;"&gt;&lt;b&gt;Q 7: What are your favourite tools (operating system, programming/scripting language, text editor, version control system, shell, database engine, other tools you can’t live without) and why do you like them more than others?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Steve Yegge&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;OS: Unix! I use linux, cygwin, and darwin all about equally often now. You just can’t beat it for productivity tools. Every programmer should learn how to use every tool in /bin and /usr/bin.&lt;br /&gt;&lt;br /&gt;Scripting language: Ruby. I’m proficient with just about every major scripting language out there: Perl, Python, Tcl, Lua, Awk, Bash, and others I’m forgetting. But I’m really lazy, and Ruby’s by far the easiest, so it’s a match made in heaven.&lt;br /&gt;&lt;br /&gt;Programming language: I don’t have a favorite; I think they all suck. I tend to prefer Java because it’s a strong, portable platform with good tools and good libraries. But the Java language will evolve or die; it’s not good enough as-is to hold the lead indefinitely.&lt;br /&gt;&lt;br /&gt;Text editor: Emacs, because it’s the best thing out there today.&lt;br /&gt;&lt;br /&gt;Version control: SVN. Perforce is better, but it’s very expensive.&lt;br /&gt;&lt;br /&gt;Shell: Bash, because I’m too lazy to learn a better one.&lt;br /&gt;&lt;br /&gt;Database engine: MySQL, of course. Nothing else comes close.&lt;br /&gt;&lt;br /&gt;Others: I find the GIMP invaluable, and also maddeningly unintuitive. I’ve been using it for years and can still barely do anything with it. But I couldn’t live without it, ironically enough.&lt;br /&gt;&lt;br /&gt;Firefox is becoming an increasingly critical part of my tools lineup. I feel suffocated when I’m forced to use IE or Safari.&lt;br /&gt;&lt;br /&gt;Note that all these tools (Unix, Emacs, Firefox, GIMP, MySQL, Bash, SVN, Perforce) have something in common: they’re extensible; i.e., they all have programming APIs. Great programmers learn how to program their tools, not just use them.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Linus Torvalds&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I actually don’t end up having that many tools I work with, and for the many of them I have spent some time of my own to just make them work for me. The OS part is clearly the biggest one, but I’ve obviously also written my own version control system (git), and the text editor I use (micro-emacs) I’ve ended up customizing and extending upon too.&lt;br /&gt;&lt;br /&gt;Other than those three parts, the only thing I care deeply about is my email reader. I use "pine" - not because it’s necessarily the greatest email reader ever, but because I’m used to it, and it does what I need it to do with a minimum of fuss.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;David Heinemeier Hansson&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;OS X, TextMate, Ruby, Subversion, MySQL. That’s the combo currently keeping me happy. I like tools that exhibit good taste and a focus on the stuff that matters.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Peter Norvig&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I dislike all three major OS - Windows, Mac, Linux. I like Python and Lisp. Emacs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Dave Thomas&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I switched to Macs a couple of years ago after being a Linux person for more than 10 years. The tools are not necessarily better, but they don’t have to be sharpened or maintained as often, which lets be concentrate on just using them.&lt;br /&gt;&lt;br /&gt;I'm&amp;nbsp;not a great believer in single tools: I tend to switch around quite frequently just so I can get experience with as many tools as possible. Right now I’m using OSX, Emacs, TextMate, Rails, Ruby, SVN, CVS, Rake, make, xsltproc, TeX, MySQL, Postgres, and a whole lot of small productivity aids. Who knows what I’ll be using next year.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Guido Van Rossum&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Unix/Linux, Python, vi+emacs, Firefox.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;James Gosling&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;These days I live in NetBeans. It does everything I want, very cleanly simply and efficiently. It’s the nicest environment I’ve ever lived in.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Bjarne Stroustrup&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Unix, sam (a very simple text editor), and a good C++ compiler, of course.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Tim Bray&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I like Unix-like operating systems, dynamic languages like Python and Ruby and statically-typed languages like Java (in particular the Java APIs), Emacs, whatever, bash, whatever, NetBeans.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-size: large;"&gt;&lt;b&gt;Q 8: What is your favourite book related to computer programming?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Steve Yegge&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Man, that’s a tough one. Maybe "Gödel, Escher, Bach: an Eternal Golden Braid" (Hofstadter)? Although it’s not strictly about programming. If you specifically mean "favorite book about programming", then maybe SICP (mitpress.mit.edu).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Linus Torvalds&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Heh. When I read these days, I tend to either read fiction, or non-computer-related stuff (oldie but goodie: "The Selfish Gene" by Richard Dawkins).&lt;br /&gt;&lt;br /&gt;When it comes to programming, the only real programming book that comes to mind is actually the classic Kernighan &amp;amp; Ritchie "The C Programming Language" book, because it’s such an incredibly useful book while being so very readable and short. Considering that you can basically learn one of the most important programming languages of our times from it, the fact that it’s thin and readable is just a wonder.&lt;br /&gt;&lt;br /&gt;That said, many other books I enjoyed a lot were not about programming per se, but about computer architecture and hardware. There’s obviously Patterson &amp;amp; Hennessy’s computer architecture book, but for me personally perhaps even more Crawford &amp;amp; Gelsinger’s "Programming the 80386?, which was what I used when I started with Linux.&lt;br /&gt;&lt;br /&gt;For similar reasons, I have a soft spot for Andrew Tanenbaum’s "Operating Systems: Design and Implementation".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;David Heinemeier Hansson&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I like Extreme Programming Explained for its rejection of common thinking about programming practices and Patterns of Enterprise Application Architecture for striking the right balance of abstract and concrete.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Peter Norvig&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Structure and Interpretation of Computer Programs&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Dave Thomas&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;It depends on what you mean by "favorite." Probably the best written book I’ve read in the area is IBM’s "IBM/360 Principles of Operation."&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Guido Van Rossum&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Neil Stephenson’s Quicksilver.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;James Gosling&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Programming Pearls by Jon Bentley.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Bjarne Stroustrup&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;K&amp;amp;R.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Tim Bray&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Bentley’s Programming Pearls&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-size: large;"&gt;&lt;b&gt;Q 9: What is Your favourite book NOT related to computer programming?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Steve Yegge&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Just one book? You’re asking for the impossible. There are too many great books out there to choose just one.&lt;br /&gt;&lt;br /&gt;My favorite books that I’ve read this month are "Stardust" (Neil Gaiman) and "The Mind’s I" (Hofstadter/Dennet).&lt;br /&gt;&lt;br /&gt;My favorite writers are Kurt Vonnegut, Jr. and Jack Vance.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Linus Torvalds&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Well, I already mentioned the Selfish Gene by Dawkins. On the fictional side, there’s just a lot of books I’ve read and enjoyed, but few I’d say were my "favourite" one. I tend to not often re-read the books, and the selection would change over time. It’s mostly science fiction and fantasy, eg "Stranger in a Strange Land" by Heinlein was my favourite one as a teenager, but it’s a bit less clear-cut for me these days..&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;David Heinemeier Hansson&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;1984, George Orwell.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Guido Van Rossum&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Neil Stephenson’s Quicksilver.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;James Gosling&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Guns, Germs &amp;amp; Steel by Jared Diamond&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Bjarne Stroustrup&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;It changes over time. Currently O’Brian’s Aubrey/Maturin series.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Tim Bray&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;One Day in the Life of Ivan Denisovich&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #351c75; font-size: large;"&gt;Q 10: What are your favourite music bands/performers/composers?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Steve Yegge&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Favourite genres: classical, anime soundtracks, video-game music&lt;br /&gt;Favourite composers: Rachmaninoff, Chopin, Bach&lt;br /&gt;Favourite performers: David Russell (classical guitar), Sviatoslav Richter&amp;nbsp;(piano)&lt;br /&gt;Favourite anime OSTs: Last Exile, Haibane Renmei&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Linus Torvalds&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I'm actually not very much into music, but when I listen to it, I tend to listen to various classic-rockish things, ranging from Pink Floyd to the Beatles to Queen and The Who.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;David Heinemeier Hansson&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I like a lot of genres. Beth Orton, Aimee Mann, Jewel, Lauryn Hill. Actually, all those examples would fit under Girls with Guitars ;).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Guido Van Rossum&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Philip Glass.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;James Gosling&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;I tend to like folk musicians: Christine Lavin, Woody Guthrie, Pete Seeger...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Bjarne Stroustrup&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Band: The Dixie Chicks. Composer: Beethoven.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Tim Bray&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Read my blog.&lt;br /&gt;&lt;br /&gt;. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .&lt;br /&gt;. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Postscript&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;How I found this:&amp;nbsp;I was reading this post by Jeff Atwood, titled "&lt;a href="http://www.codinghorror.com/blog/2006/07/linus-torvalds-visual-basic-fan.html"&gt;Linus Torvalds, Visual Basic Fan&lt;/a&gt;"&amp;nbsp;where the source article he linked to was: "&lt;a href="http://sztywny.titaniumhosting.com/2006/07/23/stiff-asks-great-programmers-answers/"&gt;STIFF ASKS, GREAT PROGRAMMERS ANSWER&lt;/a&gt;".&amp;nbsp;But that link was dead, and doing a search didn't find any trace of it anywhere on the net.&amp;nbsp;So I resorted to an archive.org search and sure enough, up popped this incredible blog post by Jaroslaw Rzeszótko.&lt;br /&gt;&lt;br /&gt;Due to it no longer being available on the net,&amp;nbsp;I thought it should reposted again so others can enjoy reading it. I requested permission from the original author to do this, and he happily obliged - thanks again&amp;nbsp;Jaroslaw!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;" /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://coolshell.cn/articles/8275.html"&gt;Read a Chinese translation of this blog post&lt;/a&gt;&amp;nbsp; &amp;lt;&amp;lt; Thanks to the guys at CoolShell.cn for this!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://chocotech.blogspot.com.au/2009/01/bilgisayar-duayenleri-ile-yaplms-guzel.html"&gt;Read a Turkish translation of this blog post&lt;/a&gt;&amp;nbsp; &amp;lt;&amp;lt; Thanks to Seval for this!&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/1931460179016608158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/09/q-with-nine-great-programmers.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/1931460179016608158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/1931460179016608158'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/09/q-with-nine-great-programmers.html' title='Q&amp;A With Nine Great Programmers'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-4723221605902694830</id><published>2012-08-24T21:45:00.000-07:00</published><updated>2012-08-24T21:53:50.209-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='startups'/><title type='text'>Startups for Dummies</title><content type='html'>The problem with Steve Blank’s &lt;a href="http://steveblank.com/2011/09/22/how-to-build-a-web-startup-lean-launchpad-edition/"&gt;How to Build        a Web Startup (Lean Launchpad Edition)&lt;/a&gt;&amp;nbsp;article ...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;There’s little to no focus on the actual product being built.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Only          1 out of 50 points listed is actually about building a         product: Its listed under step 7, which is: &lt;i&gt;“Add the backend code to           make the site work”.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;The          rest is mostly cruft and admin type work that an outsourced         worker could do. No doubt its important, but 98% compared to 2%?&lt;br /&gt;&lt;br /&gt;The article comes across as a guide to building an         over-hyped marketing vehicle, solely to receive funding, rather         than actually building something useful that people want to use.&amp;nbsp;There’s no mention of innovation or of making         people’s lives easier. This is Startups For Dummies.&lt;br /&gt;&lt;br /&gt;Full respect to &lt;a href="http://en.wikipedia.org/wiki/Steve_Blank"&gt;Steve Blank&lt;/a&gt; (a 34 year         veteran of Silicon Valley) and his views, but in my view, this         particular article has a glaring weakness.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Some further reading on the topic:&lt;br /&gt;&lt;br /&gt;This&amp;nbsp;&lt;a href="http://www.paulgraham.com/start.html"&gt;Starting a Startup&lt;/a&gt;&amp;nbsp;article by Paul Graham&amp;nbsp;is simple but contains three great points he says you should         focus on:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;People/a         good team&lt;/li&gt;&lt;li&gt;A         product that customers want&lt;/li&gt;&lt;li&gt;Low         overheads&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This&amp;nbsp;&lt;a href="http://www.startupsmart.com.au/planning/2011-08-18/12-ways-to-make-your-web-start-up-investable.html"&gt;12 Ways To Make Your Web Startup Investable&lt;/a&gt; article by StartupSmart, recommends:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;People/a         good team&lt;/li&gt;&lt;li&gt;A         clear market gap (i.e. a product that customers want)&lt;/li&gt;&lt;li&gt;Timing         is everything&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;Incidentally, Steve Blank has just announced he is giving a free online course over at Udacity -&amp;nbsp;&lt;a href="http://www.udacity.com/overview/Course/ep245/CourseRev/1"&gt;Entrepreneurship: The Lean Lanchpad (EP245)&lt;/a&gt;. It starts on 14 September, 2012.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;" /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;/div&gt;&lt;o:p&gt;&lt;/o:p&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/4723221605902694830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/08/startups-for-dummies.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/4723221605902694830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/4723221605902694830'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/08/startups-for-dummies.html' title='Startups for Dummies'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-2793657811987696330</id><published>2012-08-23T05:37:00.000-07:00</published><updated>2012-08-24T18:31:37.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcp-ip'/><category scheme='http://www.blogger.com/atom/ns#' term='sockets'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>TCP/IP Sockets in .NET 4</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Transmission_Control_Protocol"&gt;TCP&lt;/a&gt; is one of the core protocols of the Internet and is a bi-directional, client/server protocol. In .NET you can use the &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener"&gt;TcpListener Class&lt;/a&gt; for the server component, which provides simple methods that listen for and accept incoming connection requests from clients. You can use the &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient"&gt;TcpClient Class&lt;/a&gt; for the client component, which provides client connections to TCP server components; it provides simple methods for connecting, sending, and receiving stream-based data over the network. &lt;br /&gt;&lt;br /&gt;Here's a standalone C# 4.0 app that demonstrates how to setup a TCP/IP sockets based client and server in .NET. It uses a command line option to determine whether to run the client or server. There's no external files or libraries needed, just the standard ones you get with a C# 4.0 console project.&amp;nbsp;I've tested it with Visual Studio 2010 in Windows, and it will also work unchanged with Mono.&lt;br /&gt;&lt;br /&gt;To run the server, from the command prompt...&lt;br /&gt;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;SocketsTest -server&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To run the client, from another command prompt ...&lt;br /&gt;&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;SocketsTest -client&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Below is the source code ... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush: csharp; gutter: false"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Net;&lt;br /&gt;using System.Net.Sockets;&lt;br /&gt;using System.Threading.Tasks;&lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Standalone TCP/IP sockets example using C#.NET 4.0&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;/// &lt;remarks&gt;&lt;br /&gt;/// Compile as a C#.NET console mode application&lt;br /&gt;/// &lt;br /&gt;/// Command line usage:&lt;br /&gt;///   SocketsTest -client   =&gt; run the client&lt;br /&gt;///   SocketsTest -server   =&gt; run the server&lt;br /&gt;/// &lt;/remarks&gt;&lt;br /&gt;class SocketsTest&lt;br /&gt;{&lt;br /&gt;    static TcpListener listener;&lt;br /&gt;&lt;br /&gt;    // Sample high score table data&lt;br /&gt;    static Dictionary&amp;lt;string, int&amp;gt; highScoreTable = new Dictionary&amp;lt;string, int&amp;gt;() { &lt;br /&gt;            { "john", 1001 }, &lt;br /&gt;            { "ann", 1350 }, &lt;br /&gt;            { "bob", 1200 }, &lt;br /&gt;            { "roxy", 1199 } &lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    static int Port = 4321;&lt;br /&gt;    static IPAddress IP_ADDRESS = new IPAddress(new byte[] { 127, 0, 0, 1 });&lt;br /&gt;    static string HOSTNAME = "127.0.0.1";&lt;br /&gt;    static int MAX_CLIENTS = 5;&lt;br /&gt;&lt;br /&gt;    public static void Main(string[] args)&lt;br /&gt;    {&lt;br /&gt;        if (args.Contains("-server"))&lt;br /&gt;        {&lt;br /&gt;            ServerMain();&lt;br /&gt;        }&lt;br /&gt;        else if (args.Contains("-client"))&lt;br /&gt;        {&lt;br /&gt;            ClientMain();&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Usage: SocketsTest -client   =&gt; run the client");&lt;br /&gt;            Console.WriteLine("       SocketsTest -server   =&gt; run the server");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// Server receives player name requests from the client and responds with the score.&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    private static void ServerMain()&lt;br /&gt;    {&lt;br /&gt;        listener = new TcpListener(IP_ADDRESS, Port);&lt;br /&gt;        listener.Start();&lt;br /&gt;        Console.WriteLine("Server running, listening to port " + Port + " at " + IP_ADDRESS);&lt;br /&gt;        Console.WriteLine("Hit Ctrl-C to exit");&lt;br /&gt;        var tasks = new List&lt;Task&gt;();&lt;br /&gt;        for (int i = 0; i &lt; MAX_CLIENTS; i++)&lt;br /&gt;        {&lt;br /&gt;            Task task = new Task(Service, TaskCreationOptions.LongRunning);&lt;br /&gt;            task.Start();&lt;br /&gt;            tasks.Add(task);&lt;br /&gt;        }&lt;br /&gt;        Task.WaitAll(tasks.ToArray());&lt;br /&gt;        listener.Stop();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void Service()&lt;br /&gt;    {&lt;br /&gt;        while (true)&lt;br /&gt;        {&lt;br /&gt;            Socket socket = listener.AcceptSocket();&lt;br /&gt;&lt;br /&gt;            Console.WriteLine("Connected: {0}", socket.RemoteEndPoint);&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                // Open the stream&lt;br /&gt;                Stream stream = new NetworkStream(socket);&lt;br /&gt;                StreamReader sr = new StreamReader(stream);&lt;br /&gt;                StreamWriter sw = new StreamWriter(stream);&lt;br /&gt;                sw.AutoFlush = true;&lt;br /&gt;&lt;br /&gt;                sw.WriteLine("{0} stats available", highScoreTable.Count);&lt;br /&gt;                while (true)&lt;br /&gt;                {&lt;br /&gt;                    // Read name from client&lt;br /&gt;                    string name = sr.ReadLine();&lt;br /&gt;                    if (name == "" || name == null) break;&lt;br /&gt;&lt;br /&gt;                    // Write score to client&lt;br /&gt;                    if (highScoreTable.ContainsKey(name))&lt;br /&gt;                        sw.WriteLine(highScoreTable[name]);&lt;br /&gt;                    else&lt;br /&gt;                        sw.WriteLine("Player '" + name + "' was not found.");&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;                stream.Close();&lt;br /&gt;            }&lt;br /&gt;            catch (Exception e)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(e.Message);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Console.WriteLine("Disconnected: {0}", socket.RemoteEndPoint);&lt;br /&gt;            socket.Close();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// Client requests a player name's score from the server.&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    private static void ClientMain()&lt;br /&gt;    {&lt;br /&gt;        TcpClient client = new TcpClient(HOSTNAME, Port);&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            // Open the stream&lt;br /&gt;            Stream stream = client.GetStream();&lt;br /&gt;            StreamReader sr = new StreamReader(stream);&lt;br /&gt;            StreamWriter sw = new StreamWriter(stream);&lt;br /&gt;            sw.AutoFlush = true;&lt;br /&gt;&lt;br /&gt;            // Read and output the first line from the service, which&lt;br /&gt;            // contains the number of players listed in the table.&lt;br /&gt;            Console.WriteLine(sr.ReadLine());&lt;br /&gt;&lt;br /&gt;            while (true)&lt;br /&gt;            {&lt;br /&gt;                // Input player name&lt;br /&gt;                Console.Write("Enter player name: ");&lt;br /&gt;                string name = Console.ReadLine();&lt;br /&gt;&lt;br /&gt;                // Write name to server&lt;br /&gt;                sw.WriteLine(name);&lt;br /&gt;                if (name == "") break;&lt;br /&gt;&lt;br /&gt;                // Read score from server&lt;br /&gt;                Console.WriteLine(sr.ReadLine());&lt;br /&gt;            }&lt;br /&gt;            stream.Close();&lt;br /&gt;        }&lt;br /&gt;        finally&lt;br /&gt;        {&lt;br /&gt;            // Close the connection&lt;br /&gt;            client.Close();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/2793657811987696330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/08/tcpip-sockets-in-net-4.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/2793657811987696330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/2793657811987696330'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/08/tcpip-sockets-in-net-4.html' title='TCP/IP Sockets in .NET 4'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-2448529501587316436</id><published>2012-08-11T23:29:00.000-07:00</published><updated>2012-08-11T23:29:10.907-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='startups'/><title type='text'>EMPORI: The original Amazon Locker from 12 years ago</title><content type='html'>&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/help/customer/display.html/?nodeId=200689010"&gt;Amazon Locker&lt;/a&gt; is a new delivery option offered by Amazon which provides secure, self-service pick-up stations located in a select number of cities in the US and UK. Once your package is delivered to the Amazon Locker, you receive an e-mail informing you that your package is available for pick-up.&lt;br /&gt;&lt;br /&gt;This Amazon service came about &lt;a href="http://blogs.wsj.com/canadarealtime/2012/08/08/digits-bufferbox-amazon-lockers-we-had-that-idea-first/"&gt;1 year after&lt;/a&gt; a Canadian startup called &lt;a href="http://www.bufferbox.com/"&gt;BufferBox&lt;/a&gt; started offering a similar secure dropbox service. BufferBox has lockers installed in two locations in Waterloo, one at the university and another a nearby corporate office. The company is nearing a launch in Toronto and plans to roll out lockers across Canadian and U.S. cities.&lt;br /&gt;&lt;br /&gt;But back in 2000, another Canadian company launched a similar service. On July 24, 2000, Canadian property management company &lt;a href="http://en.wikipedia.org/wiki/Oxford_Properties"&gt;Oxford Properties Group&lt;/a&gt; launched a startup called EMPORI.COM. Customers could order products from affiliated online retailers via&amp;nbsp; Empori.com, which were then delivered on the same or next day to a secure depot containing lockers. The original depot was located in an office building in Toronto (Royal Bank Plaza) and over the course of a year this expanded to three more sites around Toronto. Oxford Properties Group saw this as a way for their commercial real estate customers to get additional value out of their prime inner city locations. The idea was that city workers would order products online and then, after receiving an email notification with the locker location and locker combination, would pick their order up at the end of the day, on their way home from work. A host of a products from 31 vendors were offered, from books to running shoes to groceries and even liquor.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-58dURgzE8ZM/UCdKQIBDGeI/AAAAAAAAAMU/D2nU1FmYSGY/s1600/empori-storage-lockers-2000.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-58dURgzE8ZM/UCdKQIBDGeI/AAAAAAAAAMU/D2nU1FmYSGY/s400/empori-storage-lockers-2000.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The upmarket secure lockers offered by Empori&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;From the &lt;a href="http://www.thefreelibrary.com/EMPORI.COM+Launches+World+First+Combination+of+Traditional+and...-a063623407"&gt;launch press release&lt;/a&gt;: &lt;i&gt;&lt;b&gt;"Empori.com is the one-of-a-kind retail solution to those barriers that discourage people from purchasing online. Our delivery system addresses the online shopping fulfillment problem."&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Less than 1 year later, on July 17, 2001,&amp;nbsp; &lt;a href="http://web.archive.org/web/20010802074122/http://www.nationalpost.com/home/story.html?f=/stories/20010717/620483.html"&gt;Empori.com&amp;nbsp;closed after a $5 million loss&lt;/a&gt;. The blame was initially placed on the general business environment which included the bursting of the dot com bubble:&amp;nbsp;&lt;i&gt;&lt;b&gt;"With recent changes in the dot-com environment, [Empori] was unable to find another strategic and financial partner to support further development of the business-to-consumer business,"&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;As the &lt;a href="http://www.backbonemag.com/Magazine/B2C_07050601.asp"&gt;dust settled&lt;/a&gt; it looked like the single biggest factor in Empori’s failure was its inability to secure a critical mass of online retailers. &amp;nbsp;They tried to do too much - secure depots for&amp;nbsp;pick-up&amp;nbsp;was only one piece of their ambitious plan - they were also reselling goods via their website, which was the sole point of contact to access their secure depots. In effect they were trying to launch a new online retail site, coming off a base of zero customers, while in the general dot com gloom of 2000/01. Maybe what they should have done is to focus solely on their unique selling point - the secure depot - and offered it as a service, available to any online retailer, much as BufferBox is doing today.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-lHV6QoIajqY/UCdKPVSnrUI/AAAAAAAAAMM/hlJoZZRTyNU/s1600/empori-entrance.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-lHV6QoIajqY/UCdKPVSnrUI/AAAAAAAAAMM/hlJoZZRTyNU/s400/empori-entrance.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The business burned $5 million in one year before closing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;i&gt;As of today, the Empori.com domain name is offered for outright sale for&amp;nbsp;&lt;/i&gt;&lt;i&gt;€&lt;/i&gt;&lt;i&gt;3540 ($4351) by a European domain reseller. "Empori" is Italian for "Stores".&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;div style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;a href="http://twitter.com/dodgy_coder" style="color: #7d181e; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;/div&gt;&lt;div style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #fefdfa; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="color: #7d181e; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/2448529501587316436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/08/empori-original-amazon-locker-from-12.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/2448529501587316436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/2448529501587316436'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/08/empori-original-amazon-locker-from-12.html' title='EMPORI: The original Amazon Locker from 12 years ago'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-58dURgzE8ZM/UCdKQIBDGeI/AAAAAAAAAMU/D2nU1FmYSGY/s72-c/empori-storage-lockers-2000.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-5896838462989802863</id><published>2012-07-21T03:11:00.000-07:00</published><updated>2012-07-21T06:20:44.263-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><category scheme='http://www.blogger.com/atom/ns#' term='code-craft'/><category scheme='http://www.blogger.com/atom/ns#' term='methodologies'/><title type='text'>Old school developers - achieving a lot with little</title><content type='html'>&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ubGuJoE3b7Y/UAp9iBihjPI/AAAAAAAAALw/H6Uo8_klRA8/s1600/ken_thompson.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-ubGuJoE3b7Y/UAp9iBihjPI/AAAAAAAAALw/H6Uo8_klRA8/s1600/ken_thompson.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Ken Thompson&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;I was reading through bits of the excellent &lt;/span&gt;&lt;a href="http://www.amazon.com/gp/product/1430219483/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1430219483&amp;amp;linkCode=as2&amp;amp;tag=intsecdb-20" style="background-color: white;"&gt;Coders at Work&lt;/a&gt;&lt;span style="background-color: white;"&gt;&amp;nbsp;book by &lt;/span&gt;&lt;a href="http://twitter.com/peterseibel" style="background-color: white;"&gt;Peter Seibel&lt;/a&gt;&lt;span style="background-color: white;"&gt; and found it interesting that the (what I'd call respectfully) old school developers, such as&amp;nbsp;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Ken_Thompson" style="background-color: white;"&gt;Ken Thompson&lt;/a&gt;,&lt;span style="background-color: white;"&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="http://www.codersatwork.com/joe-armstrong.html" style="background-color: white;"&gt;Joe Armstrong&lt;/a&gt;&amp;nbsp;and&lt;span style="background-color: white;"&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Jamie_Zawinski" style="background-color: white;"&gt;Jamie Zawinski&lt;/a&gt;&lt;span style="background-color: white;"&gt;&amp;nbsp;use hardly any modern tools and techniques while developing software.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;br /&gt;Ken Thompson was the designer of the &lt;a href="http://en.wikipedia.org/wiki/B_(programming_language)"&gt;B programming language&lt;/a&gt; (the precursor to C) and also the &lt;a href="http://en.wikipedia.org/wiki/Go_(programming_language)"&gt;Go programming language&lt;/a&gt; (with &lt;a href="http://en.wikipedia.org/wiki/Rob_Pike"&gt;Rob Pike&lt;/a&gt;). He also worked alongside&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Dennis_Ritchie"&gt;Dennis Ritchie&lt;/a&gt; to develop the &lt;a href="http://en.wikipedia.org/wiki/C_programming_language"&gt;C programming language&lt;/a&gt; and the original &lt;a href="http://en.wikipedia.org/wiki/Unix"&gt;Unix&lt;/a&gt; operating system while working at Bell Labs. After designing the &lt;a href="http://en.wikipedia.org/wiki/Utf-8"&gt;UTF-8&lt;/a&gt;&amp;nbsp;method of character encoding &lt;a href="http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt"&gt;on a placemat in a New Jersey diner&lt;/a&gt;, he worked overnight to implement full UTF-8 support in Bell Lab's &lt;a href="http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs"&gt;Plan 9 operating system&lt;/a&gt;. &lt;/span&gt;&lt;span style="background-color: white;"&gt;Regarding his programming style, he debugs only via printf statements, hardly ever uses unit tests, starts his projects by designing the data structures and then works bottom up, with throwaway test stubs.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-yN2grqsHSXY/UAp9ufNojqI/AAAAAAAAAL4/YJh6sWN_5f8/s1600/joe_armstrong.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-yN2grqsHSXY/UAp9ufNojqI/AAAAAAAAAL4/YJh6sWN_5f8/s1600/joe_armstrong.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Joe Armstrong&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Joe Armstrong developed the &lt;a href="http://en.wikipedia.org/wiki/Erlang_(programming_language)"&gt;Erlang programming language&lt;/a&gt; and the open source &lt;a href="http://en.wikipedia.org/wiki/Open_Telecom_Platform"&gt;Open Telecom Platform&lt;/a&gt; (OTP) framework for Ericsson.&amp;nbsp;&lt;span style="background-color: white;"&gt;When designing software he prefers to rigorously document as much as possible up front before starting to write code, especially for difficult projects such as those involving real-time networking protocols. He uses prototypes to solve the hard problems first, and for debugging, just uses print statements.&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white;"&gt;He is a &lt;a href="http://harmful.cat-v.org/software/OO_programming/why_oo_sucks"&gt;critic of Object Oriented Programming&lt;/a&gt;, and favours functional programming languages like Haskell. He never uses an IDE, preferring just Emacs and the command line (no mouse required).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jamie Zawinski worked in MIT's AI lab with &lt;a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)"&gt;Lisp&lt;/a&gt;, then moved onto leading the development of Lucid Emacs, also in Lisp, which later became known as &lt;a href="http://en.wikipedia.org/wiki/Xemacs"&gt;XEmacs&lt;/a&gt;.&amp;nbsp;&lt;span style="background-color: white;"&gt;After this he joined &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Netscape" style="background-color: white;"&gt;Netscape&lt;/a&gt;&lt;span style="background-color: white;"&gt; and worked on the front-end for the Unix version of Netscape Navigator, and later led the development of Netscape Mail (both projects were in C). He too prefers to just use print statements to debug his code. His process is either to write code top down or bottom up, let the code evolve naturally, then refactor it when necessary. During development he hardly ever uses unit tests, believing it slows things down - he thinks there's a lot to be said for getting the code right first time. In his view, its a matter of priorities, "do you want this to be good software or do you want it to be done next week - pick one because you can't have both".&lt;/span&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ZusxvRskcOQ/UAp96rUsDQI/AAAAAAAAAMA/OIwoHy2zB4M/s1600/Jamie_Zawinski.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-ZusxvRskcOQ/UAp96rUsDQI/AAAAAAAAAMA/OIwoHy2zB4M/s1600/Jamie_Zawinski.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Jamie Zawinski&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;So what tools and techniques do you actually need to be a great programmer? Are these modern techniques of TDD, BDD, Scrum, Agile, Design Patterns, XP etc. just window dressing or do they serve a higher purpose? Is it just a fact that a gifted programmer will always find a way to be a great programmer, no matter what tools he or she works with?&lt;br /&gt;&lt;br /&gt;My own view is that some level of TDD and a reliance upon a decent set of unit tests is invaluable. Maybe then these modern techniques should just be seen as advances to make our job a little easier and more productive, especially for those who are not a genius-level developer, like these guys.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/5896838462989802863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/07/old-school-developers-achieving-lot.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/5896838462989802863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/5896838462989802863'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/07/old-school-developers-achieving-lot.html' title='Old school developers - achieving a lot with little'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ubGuJoE3b7Y/UAp9iBihjPI/AAAAAAAAALw/H6Uo8_klRA8/s72-c/ken_thompson.png' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-460315798960072893</id><published>2012-06-27T04:49:00.000-07:00</published><updated>2012-06-27T20:35:42.451-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Being a great tester</title><content type='html'>&lt;br /&gt;I just wanted to post a great little nugget of information from the end of Unit 1 of&amp;nbsp;&lt;a href="http://www.udacity.com/overview/Course/cs258/CourseRev/1"&gt;Software Testing: How to Make Software Fail (CS258) on Udacity&lt;/a&gt;, which is being taught by John Regehr and Sean Bennett.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="background-color: white;"&gt;&lt;i&gt;The developer's attitude is "&lt;b&gt;I want the code to succeed&lt;/b&gt;".&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: white;"&gt;&lt;i&gt;The tester's attitude is "&lt;b&gt;I want the code to fail&lt;/b&gt;".&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: white;"&gt;&lt;i&gt;Although they seem contradictory, understand that you are both aiming to create more robust, higher quality software.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: white;"&gt;&lt;i&gt;The developer aims to write quality code first time.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: white;"&gt;&lt;i&gt;The tester aims to identify bugs which can then be fixed, thereby improving the robustness of the code.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Great testers ...&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="background-color: white;"&gt;&lt;i&gt;Test creatively - use their knowledge of the software under test to be creative in their test methods and test structure.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;span style="background-color: white;"&gt;Don't ignore small glitches that are easy to overlook or ignore, but may hint at larger problems, which when followed up&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white;"&gt;can often lead to major issues.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Watch the snippet on YouTube: &lt;a href="http://www.youtube.com/watch?v=44jNVvWhA-Q"&gt;Being a great tester&lt;/a&gt;&amp;nbsp;(2 min, 33 sec)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/460315798960072893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/06/being-great-tester.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/460315798960072893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/460315798960072893'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/06/being-great-tester.html' title='Being a great tester'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-1850566069898170854</id><published>2012-06-03T01:52:00.000-07:00</published><updated>2012-06-24T17:36:28.815-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='sqa'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>Applying hardware testing concepts to software</title><content type='html'>&lt;br /&gt;I've recently been testing a desktop application I built with WPF and .NET 4 which collects data from the serial port and draws various charts on screen in real time. The volume of data isn't immense, one data frame of approx 200 bytes arriving every 200 milliseconds, but there is additional processing happening in the background. One of the steps being performed is regression analysis on various data points to construct curves of best fit.&lt;br /&gt;&lt;br /&gt;In production this process will be run for likely not more than 30 minutes, but during testing I wanted to test the limits of the application by running the process for 2 hours, to be sure there was no memory leaks or performance issues. I was surprised when after just 1 hour the UI just became totally unresponsive, dramatically quickly.&lt;br /&gt;&lt;br /&gt;I did find the issue and made the fix, but this got me thinking about where else this sort of issue could occur in software - because all I'd done was apply a simple form of software performance testing, known as &lt;a href="http://en.wikipedia.org/wiki/Software_performance_testing#Endurance_testing_.28soak_testing.29"&gt;endurance testing&lt;/a&gt;, which just involved running the software for significantly longer than normal. The endurance test has something in common with its hardware equivalent, &lt;a href="http://en.wikipedia.org/wiki/Soak_testing"&gt;soak testing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-AW-_m4Q1C-w/T8sWqZ8SwtI/AAAAAAAAALk/EU7wCDi4Rik/s1600/Bathtub_curve.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="282" src="http://1.bp.blogspot.com/-AW-_m4Q1C-w/T8sWqZ8SwtI/AAAAAAAAALk/EU7wCDi4Rik/s400/Bathtub_curve.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The bathtub curve. The name derives from the cross-sectional shape of a bathtub. Image source:&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/File:Bathtub_curve.svg"&gt;wikipedia&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;This leads to another hardware concept which I think can be partially applied to software - the &lt;a href="http://en.wikipedia.org/wiki/Bathtub_curve"&gt;bathtub curve&lt;/a&gt;, as shown above. The bathtub curve is used in reliability engineering to describe a particular form of the hazard function which comprises three parts.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Applied to hardware&lt;/b&gt;&lt;/u&gt;, the bathtub curve means: &lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The first part is a decreasing failure rate, known as early failures. &lt;a href="http://en.wikipedia.org/wiki/Burn-in"&gt;Burn in&lt;/a&gt; testing aims to detect (and discard) products which fail at this stage. If the burn-in period is made sufficiently long (and artificially stressful), the system can then be trusted to be mostly free of further early failures once the burn-in test is complete.&lt;/li&gt;&lt;li&gt;The second part is a constant failure rate, known as random failures. These are like the "background" level of failures, which can usually never be totally eliminated from the production process. QC managers will often aim for a low level of failure here, via various quality control measures (such as &lt;a href="http://en.wikipedia.org/wiki/Total_quality_management"&gt;TQM&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Six_Sigma"&gt;Six Sigma&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;The third part is an increasing failure rate, known as wear-out failures. These can be detected via &lt;a href="http://en.wikipedia.org/wiki/Soak_testing"&gt;soak testing&lt;/a&gt;.&amp;nbsp; In electronics, soak testing involves testing a system up to or above its maximum ratings for a long period of time. Often, a soak test can continue for months, while also applying additional stresses like extreme temperatures and/or pressures, depending on the intended environment.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;u&gt;&lt;br /&gt;&lt;b&gt;Applied to software&lt;/b&gt;&lt;/u&gt;, the bathtub curve might show bug count on the y-axis and total application run-time on the x-axis. Then, the three parts could mean:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;First part (early failures): In software, this could apply to bugs which break the software's &lt;a href="http://en.wikipedia.org/wiki/Functional_requirements"&gt;functional requirements&lt;/a&gt; or specifications, and might be tested with various functional testing methods such as &lt;a href="http://en.wikipedia.org/wiki/Software_testing#Unit_testing"&gt;unit testing&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Software_testing#Integration_testing"&gt;integration testing&lt;/a&gt;. These are normally found early in the test cycle.&lt;/li&gt;&lt;li&gt;Second part (random failures): Might apply to random bugs which are hard to detect, occur in specific conditions, and are outside the existing test coverage. An example might be a &lt;a href="http://en.wikipedia.org/wiki/Heisenbug"&gt;heisenbug&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Third part (wear-out failures): Bugs which appear due to memory leaks or performance degredation. These can be tested with endurance testing. During &lt;a href="http://en.wikipedia.org/wiki/Software_performance_testing#Endurance_testing_.28soak_testing.29"&gt;endurance tests&lt;/a&gt;, memory utilization is monitored to detect potential memory leaks, and throughput/response times are monitored to detect performance degradation.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;&lt;br /&gt;Further Reading&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Since writing the above I've found some other articles (listed below) about this concept which assume time on the bathtub curve to mean the software development&amp;nbsp;life cycle's time, as opposed to my idea of being the individual run-time of a real-time application. I've listed them here for reference:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ece.cmu.edu/%7Ekoopman/des_s99/sw_reliability/#bathtub"&gt;The bathtub curve for software reliability&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/737918/does-bathtub-curve-apply-to-modern-software"&gt;Does the bathtub curve apply to modern software?&lt;/a&gt;&lt;br /&gt;&lt;a href="http://gigasquidsoftware.com/wordpress/?p=385"&gt;The Software Bathtub Curve&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ijcaonline.org/volume10/number5/pxc3871990.pdf"&gt;Improving Software Reliability using Software Engineering Approach - A Review&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;+ - - - - - - - - - - - - - - - - - - - - - - - &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;+&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;| &lt;/span&gt;&lt;a href="http://harriswalker.net/" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Harris Walker Real Estate, Perth, WA, AUS&lt;/a&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;| Specialists in residential housing sales and&amp;nbsp; |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;| property management in Perth, Australia.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;+ - - - - - - - - - - - - - - - - - - - - - - - &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;+&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/1850566069898170854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/06/applying-hardware-testing-concepts-to.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/1850566069898170854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/1850566069898170854'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/06/applying-hardware-testing-concepts-to.html' title='Applying hardware testing concepts to software'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-AW-_m4Q1C-w/T8sWqZ8SwtI/AAAAAAAAALk/EU7wCDi4Rik/s72-c/Bathtub_curve.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-5598278627333576202</id><published>2012-05-05T22:56:00.000-07:00</published><updated>2012-05-08T19:26:05.264-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='terminology'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Why was .NET called .NET?</title><content type='html'>&lt;br /&gt;Microsoft started development on the .NET Framework in the late 1990s, originally under the name of "Next Generation Windows Services" (NGWS).&lt;br /&gt;&lt;br /&gt;So why did Microsoft choose the name .NET?&lt;br /&gt;&lt;br /&gt;This is a bit of mystery, but the below answers are the best I've come across so far...&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;b&gt;1)&lt;/b&gt; .NET enabled Microsoft's marketing people to emphasise the "Network"-ing aspect of its technologies, and was also a reaction to the marketing blitz by Sun Microsystems at the time, whose theme was "&lt;a href="http://en.wikipedia.org/wiki/John_Gage"&gt;The network is the computer&lt;/a&gt;". The term "Dot Com" was synonymous with the Internet at the time, and "Dot Net" was a play on that term.&lt;br /&gt;I don't think it is a bad name at all, the problem was that Microsoft initially named so many products with the ".NET" nomenclature like ".NET My Services" and ".NET Enterprise Servers", where the latter had nothing to do with the Internet. It caused so much confusion. Only later did Microsoft correct itself by limiting the .NET name to technologies related to the managed software framework.&lt;br /&gt;- &lt;a href="http://stackoverflow.com/users/75468/stanley-siu"&gt;Stanley Siu&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;b&gt;2)&lt;/b&gt; I was a dev at Microsoft at the time, and I have no idea whose ass the name .NET was pulled from. Anyone I talked to thought it was a lousy name for all the reasons already enumerated. At least it's pronounceable, unlike NGWS.&lt;br /&gt;- &lt;a href="http://stackoverflow.com/users/6364/george-v-reilly"&gt;George V. Reilly&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;b&gt;3)&lt;/b&gt; The early marketing thrust of .NET was web services. .NET was supposed to make it easy both to write and consume web services. In particular, it was supposed to make it easier to call the web services that Microsoft was going to provide, and that everyone would then use: the ".NET My Services".&lt;br /&gt;Of course, that fell apart very quickly, but the name remained. It was at least better than "COM++" or "ActiveXX".&lt;br /&gt;- &lt;a href="http://stackoverflow.com/users/76337/john-saunders"&gt;John Saunders&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4) &lt;/b&gt;I was Summer intern at Microsoft in 2001 and back then the  interns went to Bill Gates's house for a bbq near the end of the Summer.  One of the interns asked "what other names did you think of before  coming up with .NET?"&lt;br /&gt;&lt;br /&gt;To the best of my memory, Bill's answer was something like:&lt;br /&gt;"&lt;i&gt;I didn't actually like the name .NET.&amp;nbsp; It makes people wonder if we  are finally just starting to learn about the Internet.&amp;nbsp; Sadly, the other  proposed name was even worse. Our mission statement at the time was  'work Anywhere, Anytime, on Any device,' so the proposal was AAAWare.&lt;/i&gt;"&lt;br /&gt;- &lt;a href="http://news.ycombinator.com/user?id=leelin"&gt;leelin&lt;/a&gt;&lt;a href="http://stackoverflow.com/users/76337/john-saunders"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;Up until a couple of days ago, a Q&amp;amp;A on this topic was available &lt;a href="http://stackoverflow.com/questions/628145/why-was-net-called-net"&gt;here&lt;/a&gt; on StackOverflow, which is&amp;nbsp;still the top Google result for: &lt;a href="http://www.google.com/search?q=why+was+.net+called+.net"&gt;why was .net called .net&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The question was deemed to be offtopic for&amp;nbsp;StackOverflow, and was recently deleted, even though it had been visible (as 'Closed') for about three years or so. Just before it was deleted, I had edited the accepted answer (by &lt;a href="http://stackoverflow.com/users/75468/stanley-siu"&gt;Stanley Siu&lt;/a&gt;) to make some grammatical corrections. Then, briefly after my edit was accepted by a moderator, the whole question was deleted. So I thought it would be worthy of this brief blog post here, in case someone else wants to find out the answer, as I did ;-).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE (7-May-2012):&lt;/b&gt; somehow (maybe due to a bit of attention from this post?), the original question on StackOverflow has been un-deleted and is once again available at its original location &lt;a href="http://stackoverflow.com/questions/628145/why-was-net-called-net"&gt;here&lt;/a&gt;. Thanks SO moderators!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/5598278627333576202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/05/why-was-net-called-net.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/5598278627333576202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/5598278627333576202'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/05/why-was-net-called-net.html' title='Why was .NET called .NET?'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-6041045298238779146</id><published>2012-04-29T04:54:00.000-07:00</published><updated>2012-04-30T22:08:51.312-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming-languages'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Programming language inventors on twitter</title><content type='html'>&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Andrei_Alexandrescu"&gt;Andrei Alexandrescu&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/D_%28programming_language%29"&gt;D&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/incomputable"&gt;&lt;span style="color: blue;"&gt;@incomputable&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Joe Armstrong (&lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/joeerl"&gt;&lt;span style="color: blue;"&gt;@joeerl&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Jeremy Ashkenas (&lt;a href="http://en.wikipedia.org/wiki/CoffeeScript"&gt;CoffeeScript&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/jashkenas"&gt;&lt;span style="color: blue;"&gt;@jashkenas&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Christopher Bertels (&lt;a href="http://en.wikipedia.org/wiki/Fancy_%28programming_language%29"&gt;Fancy&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/bakkdoor"&gt;&lt;span style="color: blue;"&gt;@bakkdoor&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Henri Binsztok (&lt;a href="http://en.wikipedia.org/wiki/Opa_%28programming_language%29"&gt;Opa&lt;/a&gt;) - &lt;a href="http://twitter.com/henri_opa"&gt;&lt;span style="color: blue;"&gt;@henri_opa&lt;/span&gt;&lt;/a&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Gilad_Bracha"&gt;Gilad Bracha&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Newspeak_%28programming_language%29"&gt;Newspeak&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/Gilad_Bracha"&gt;&lt;span style="color: blue;"&gt;@Gilad_Bracha&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Walter_Bright"&gt;Walter Bright&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/D_%28programming_language%29"&gt;D&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/WalterBright"&gt;&lt;span style="color: blue;"&gt;@WalterBright&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Nicolas Cannasse (&lt;a href="http://en.wikipedia.org/wiki/HaXe"&gt;HaXe&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/ncannasse"&gt;&lt;span style="color: blue;"&gt;@ncannasse&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/John_Carmack"&gt;John Carmack&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/QuakeC"&gt;QuakeC&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/ID_AA_Carmack"&gt;&lt;span style="color: blue;"&gt;@ID_AA_Carmack&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Alan_Cooper"&gt;Alan Cooper&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Visual_Basic"&gt;VisualBasic&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/MrAlanCooper"&gt;&lt;span style="color: blue;"&gt;@MrAlanCooper&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Rodrigo_B._De_Oliveira"&gt;Rodrigo B. De Oliveira&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Boo_%28programming_language%29"&gt;Boo&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/nocastes"&gt;&lt;span style="color: blue;"&gt;@nocastes&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Steve Dekorte (&lt;a href="http://en.wikipedia.org/wiki/Io_%28programming_language%29"&gt;Io&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/stevedekorte"&gt;&lt;span style="color: blue;"&gt;@stevedekorte&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Brendan_Eich"&gt;Brendan Eich&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/BrendanEich"&gt;&lt;span style="color: blue;"&gt;@BrendanEich&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Andy Frank (&lt;span style="color: blue;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Fantom_%28programming_language%29"&gt;Fantom&lt;/a&gt;&lt;/span&gt;) - &lt;a href="http://twitter.com/afrankvt" style="color: blue;"&gt;@afrankvt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Brian Frank (&lt;span style="color: blue;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Fantom_%28programming_language%29"&gt;Fantom&lt;/a&gt;&lt;/span&gt;) - &lt;a href="http://twitter.com/briansfrank" style="color: blue;"&gt;@briansfrank&lt;/a&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Rich Hickey (&lt;a href="http://en.wikipedia.org/wiki/Clojure"&gt;Clojure&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/richhickey"&gt;&lt;span style="color: blue;"&gt;@richhickey&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Graydon Hoare (&lt;a href="http://en.wikipedia.org/wiki/Rust_%28programming_language%29"&gt;Rust&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/graydon_moz"&gt;&lt;span style="color: blue;"&gt;@graydon_moz&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Stefan Karpinski (&lt;a href="http://en.wikipedia.org/wiki/Julia_%28programming_language%29"&gt;Julia&lt;/a&gt;) - &lt;a href="http://twitter.com/StefanKarpinski"&gt;&lt;span style="color: blue;"&gt;@stefankarpinski&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;&lt;li&gt;Guillaume Laforge (&lt;a href="http://en.wikipedia.org/wiki/Groovy_%28programming_language%29"&gt;Groovy&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/glaforge"&gt;&lt;span style="color: blue;"&gt;@glaforge&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Rasmus_Lerdorf"&gt;Rasmus Lerdorf&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/PHP"&gt;PHP&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/rasmus"&gt;&lt;span style="color: blue;"&gt;@rasmus&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Yukihiro_Matsumoto"&gt;Yukihiro Matsumoto&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Ruby_%28programming_language%29"&gt;Ruby&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/yukihiro_matz"&gt;&lt;span style="color: blue;"&gt;@yukihiro_matz&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Bertrand_Meyer"&gt;Bertrand Meyer&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Eiffel_%28programming_language%29"&gt;Eiffel&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/Bertrand_Meyer"&gt;&lt;span style="color: blue;"&gt;@Bertrand_Meyer&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Martin_Odersky"&gt;Martin Odersky&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Scala_%28programming_language%29"&gt;Scala&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/odersky"&gt;&lt;span style="color: blue;"&gt;@odersky&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Ray_Ozzie"&gt;Ray Ozzie&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Formula_language"&gt;@Formula&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/rozzie"&gt;&lt;span style="color: blue;"&gt;@rozzie&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Slava_Pestov"&gt;Slava Pestov&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Factor_%28programming_language%29"&gt;Factor&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/slava_pestov"&gt;&lt;span style="color: blue;"&gt;@slava_pestov&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Simon_Peyton_Jones"&gt;Simon Peyton Jones&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Haskell_%28programming_language%29"&gt;Haskell&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/simonpj0"&gt;&lt;span style="color: blue;"&gt;@simonpj0&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Rob_Pike"&gt;Rob Pike&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Go_%28programming_language%29"&gt;Go&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/rob_pike"&gt;&lt;span style="color: blue;"&gt;@rob_pike&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C.E.B._Reas"&gt;Casey Reas&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Processing_%28programming_language%29"&gt;Processing&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/REAS"&gt;&lt;span style="color: blue;"&gt;@REAS&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Carl_Sassenrath"&gt;Carl Sassenrath&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/REBOL"&gt;REBOL&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/rebol3"&gt;&lt;span style="color: blue;"&gt;@rebol3&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/James_Strachan_%28programmer%29"&gt;James Strachan&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Groovy_%28programming_language%29"&gt;Groovy&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/jstrachan"&gt;&lt;span style="color: blue;"&gt;@jstrachan&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Bjarne_Stroustrup"&gt;Bjarne Stroustrup&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/stroustrup"&gt;&lt;span style="color: blue;"&gt;@stroustrup&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Don_Syme"&gt;Don Syme&lt;/a&gt;&lt;span style="color: black;"&gt; (&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/F_Sharp_%28programming_language%29"&gt;F#&lt;/a&gt;&lt;span style="color: black;"&gt;) - &lt;/span&gt;&lt;/span&gt;&lt;a class="account-group js-user-profile-link" href="http://twitter.com/dsyme" style="color: blue;"&gt;&lt;span class="username js-action-profile-name"&gt;@dsyme&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Tim_Sweeney_%28game_developer%29"&gt;Tim Sweeney&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/UnrealScript"&gt;UnrealScript&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/6ix7even"&gt;&lt;span style="color: blue;"&gt;@6ix7even&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Guido_van_Rossum"&gt;Guido van Rossum&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29"&gt;Python&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/gvanrossum"&gt;&lt;span style="color: blue;"&gt;@gvanrossum&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Larry_Wall"&gt;Larry Wall&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;Perl&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/TimToady"&gt;&lt;span style="color: blue;"&gt;@TimToady&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/John_Warnock"&gt;John Warnock&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/PostScript"&gt;PostScript&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/jewarnock"&gt;&lt;span style="color: blue;"&gt;@jewarnock&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Stephen_Wolfram"&gt;Stephen Wolfram&lt;/a&gt;&amp;nbsp;(&lt;a href="http://en.wikipedia.org/wiki/Mathematica"&gt;Mathematica&lt;/a&gt;) -&amp;nbsp;&lt;a href="http://twitter.com/stephen_wolfram"&gt;&lt;span style="color: blue;"&gt;@stephen_wolfram&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If I've missed any others, please let me know via the comments at the bottom of this page, and I'll update the list.&lt;br /&gt;&lt;br /&gt;I've added a twitter list with all of the above included here -&amp;nbsp;&lt;a href="http://twitter.com/dodgy_coder/prog-lang-inventors"&gt;twitter.com/dodgy_coder/prog-lang-inventors&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;        Programming Languages A-Z&lt;/h2&gt;&lt;br /&gt;Here's a list of programming languages in alphabetical order. Once again, if I've missed any significant ones, please let me know via the comments at the bottom and I'll update it.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/ActionScript"&gt;ActionScript&lt;/a&gt; (1998)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Gary_Grossman"&gt;Gary Grossman&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/A%2B_%28programming_language%29"&gt;A+&lt;/a&gt;&amp;nbsp;(1988)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Arthur_Whitney_%28computer_scientist%29"&gt;Arthur Whitney&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/APL_%28programming_language%29"&gt;APL&lt;/a&gt; (1964)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Kenneth_E._Iverson"&gt;Kenneth E. Iverson&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Ada_%28programming_language%29"&gt;Ada&lt;/a&gt;&amp;nbsp;(1980)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Jean_Ichbiah"&gt;Jean Ichbiah&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/AWK"&gt;AWK&lt;/a&gt;&amp;nbsp;(1977)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Alfred_Aho"&gt;Alfred Aho&lt;/a&gt;,&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Peter_J._Weinberger"&gt;Peter Weinberger&lt;/a&gt;,&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Brian_Kernighan"&gt;Brian Kernighan&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/BASIC"&gt;BASIC&lt;/a&gt;(1964)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/John_George_Kemeny"&gt;John George Kemeny&lt;/a&gt;,&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Thomas_Eugene_Kurtz"&gt;Thomas Eugene Kurtz&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/BCPL"&gt;BCPL&lt;/a&gt;(1966)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Martin_Richards_%28computer_scientist%29"&gt;Martin Richards&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Boo_%28programming_language%29"&gt;Boo&lt;/a&gt;(2003)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Rodrigo_B._De_Oliveira"&gt;Rodrigo B. De Oliveira&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/nocastes"&gt;&lt;span style="color: blue;"&gt;@nocastes&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt;(1972)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Dennis_Ritchie"&gt;Dennis Ritchie&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt;(1983)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Bjarne_Stroustrup"&gt;Bjarne Stroustrup&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/stroustrup"&gt;&lt;span style="color: blue;"&gt;@stroustrup&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29"&gt;C#&lt;/a&gt;(2001)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Caml"&gt;Caml&lt;/a&gt;(1985)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/G%C3%A9rard_Huet"&gt;Gérard Huet&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Clojure"&gt;Clojure&lt;/a&gt;(2006)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Rich Hickey -&amp;nbsp;&lt;a href="http://twitter.com/richhickey"&gt;&lt;span style="color: blue;"&gt;@richhickey&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/COBOL"&gt;COBOL&lt;/a&gt;(1959)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Grace_Hopper"&gt;Grace Hopper&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Cobra_%28programming_language%29"&gt;Cobra&lt;/a&gt;(2008)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Chuck Esterbrook &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/CoffeeScript"&gt;CoffeeScript&lt;/a&gt;(2009)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Jeremy Ashkenas -&amp;nbsp;&lt;a href="http://twitter.com/jashkenas"&gt;&lt;span style="color: blue;"&gt;@jashkenas&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/ColdFusion"&gt;ColdFusion&lt;/a&gt;(1995)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Jeremy_Allaire"&gt;Jeremy Allaire&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/JJ_Allaire"&gt;Joseph. J. Allaire&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/D_%28programming_language%29"&gt;D&lt;/a&gt;(2001)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Walter_Bright"&gt;Walter Bright&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/WalterBright"&gt;&lt;span style="color: blue;"&gt;@WalterBright&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Andrei_Alexandrescu"&gt;Andrei Alexandrescu&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/incomputable"&gt;&lt;span style="color: blue;"&gt;@incomputable&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Dart_%28programming_language%29"&gt;Dart&lt;/a&gt;(2011)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Google -&amp;nbsp;&lt;a href="http://twitter.com/dart_lang"&gt;&lt;span style="color: blue;"&gt;@dart_lang&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Delphi_%28programming_language%29"&gt;Delphi&lt;/a&gt;(1996)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Niklaus_Wirth"&gt;Niklaus Wirth&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Eiffel_%28programming_language%29"&gt;Eiffel&lt;/a&gt;(1986)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Bertrand_Meyer"&gt;Bertrand Meyer&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/Bertrand_Meyer"&gt;&lt;span style="color: blue;"&gt;@Bertrand_Meyer&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Erlang_%28programming_language%29"&gt;Erlang&lt;/a&gt;(1986)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Joe Armstrong -&amp;nbsp;&lt;a href="http://twitter.com/joeerl"&gt;&lt;span style="color: blue;"&gt;@joeerl&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;&lt;a href="http://en.wikipedia.org/wiki/F_Sharp_%28programming_language%29"&gt;F#&lt;/a&gt; &lt;/span&gt;(2005)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Don_Syme"&gt;Don Syme&lt;/a&gt;&lt;/span&gt; - &lt;a class="account-group js-user-profile-link" href="http://twitter.com/dsyme" style="color: blue;"&gt;&lt;span class="username js-action-profile-name"&gt;@dsyme&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Factor_%28programming_language%29"&gt;Factor&lt;/a&gt; (2003)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Slava_Pestov"&gt;Slava Pestov&lt;/a&gt; -&amp;nbsp;&lt;a href="http://twitter.com/slava_pestov"&gt;&lt;span style="color: blue;"&gt;@slava_pestov&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Fancy_%28programming_language%29"&gt;Fancy&lt;/a&gt;(2010)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Christopher Bertels -&amp;nbsp;&lt;a href="http://twitter.com/bakkdoor"&gt;&lt;span style="color: blue;"&gt;@bakkdoor&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Fantom_%28programming_language%29"&gt;Fantom&lt;/a&gt; &lt;/span&gt;(2005)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Brian Frank - &lt;a href="http://twitter.com/briansfrank" style="color: blue;"&gt;@briansfrank&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Andy Frank - &lt;a href="http://twitter.com/afrankvt" style="color: blue;"&gt;@afrankvt&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Formula_language"&gt;@Formula&lt;/a&gt;(1983)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Ray_Ozzie"&gt;Ray Ozzie&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/rozzie"&gt;&lt;span style="color: blue;"&gt;@rozzie&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Forth_%28programming_language%29"&gt;Forth&lt;/a&gt;(1973)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Charles_H._Moore"&gt;Charles H. Moore&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Fortran"&gt;FORTRAN&lt;/a&gt;(1957)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/John_Backus"&gt;John Backus&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Fortress_%28programming_language%29"&gt;Fortress&lt;/a&gt;(2007)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Guy_L._Steele,_Jr."&gt;Guy L. Steele, Jr.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Go_%28programming_language%29"&gt;Go&lt;/a&gt;(2009)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Robert Griesemer &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Rob_Pike"&gt;Rob Pike&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/rob_pike"&gt;&lt;span style="color: blue;"&gt;@rob_pike&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Ken_Thompson"&gt;Ken Thompson&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Groovy_%28programming_language%29"&gt;Groovy&lt;/a&gt;(2003)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Guillaume Laforge -&amp;nbsp;&lt;a href="http://twitter.com/glaforge"&gt;&lt;span style="color: blue;"&gt;@glaforge&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/James_Strachan_%28programmer%29"&gt;James Strachan&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/jstrachan"&gt;&lt;span style="color: blue;"&gt;@jstrachan&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Haskell_%28programming_language%29"&gt;Haskell&lt;/a&gt;(1990)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Simon_Peyton_Jones"&gt;Simon Peyton Jones&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/simonpj0"&gt;&lt;span style="color: blue;"&gt;@simonpj0&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/HaXe"&gt;HaXe&lt;/a&gt;(2005)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Nicolas Cannasse -&amp;nbsp;&lt;a href="http://twitter.com/ncannasse"&gt;&lt;span style="color: blue;"&gt;@ncannasse&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Inform"&gt;Inform&lt;/a&gt;(1993)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Graham_Nelson"&gt;Graham Nelson&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Io_%28programming_language%29"&gt;Io&lt;/a&gt;(2002)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Steve Dekorte -&amp;nbsp;&lt;a href="http://twitter.com/stevedekorte"&gt;&lt;span style="color: blue;"&gt;@stevedekorte&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/ISWIM"&gt;ISWIM&lt;/a&gt;(1966)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Peter_J._Landin"&gt;Peter J. Landin&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29"&gt;Java&lt;/a&gt;(1995)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/James_Gosling"&gt;James Gosling&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;(1995)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Brendan_Eich"&gt;Brendan Eich&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/BrendanEich"&gt;&lt;span style="color: blue;"&gt;@BrendanEich&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Joy_%28programming_language%29"&gt;Joy&lt;/a&gt;(2000)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Manfred_von_Thun"&gt;Manfred von Thun&lt;/a&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Julia_%28programming_language%29"&gt;Julia&lt;/a&gt; (2009)&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    &lt;span class="author"&gt;               Jeff Bezanson&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="author"&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;Stefan Karpinski - &lt;/span&gt;&lt;a href="http://twitter.com/StefanKarpinski"&gt;&lt;span style="color: blue;"&gt;@stefankarpinski&lt;/span&gt;&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;span class="author"&gt;               Viral Shah&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="author"&gt;               Alan Edelman&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Karel_%28programming_language%29"&gt;Karel&lt;/a&gt;(1981)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Richard_E._Pattis"&gt;Richard E. Pattis&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Lisp_%28programming_language%29"&gt;Lisp&lt;/a&gt;(1958)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/John_McCarthy_%28computer_scientist%29"&gt;John McCarthy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Steve_Russell"&gt;Steve Russell&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Logo_%28programming_language%29"&gt;Logo&lt;/a&gt;(1967)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Wally_Feurzeig"&gt;Wally Feurzeig&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Seymour_Papert"&gt;Seymour Papert&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Lua_%28programming_language%29"&gt;Lua&lt;/a&gt;(1993)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Roberto_Ierusalimschy"&gt;Roberto Ierusalimschy&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Mathematica"&gt;Mathematica&lt;/a&gt;(1988)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Stephen_Wolfram"&gt;Stephen Wolfram&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/stephen_wolfram"&gt;&lt;span style="color: blue;"&gt;@stephen_wolfram&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/MATLAB"&gt;MATLAB&lt;/a&gt;(1984)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Cleve_Moler"&gt;Cleve Moler&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Miranda_%28programming_language%29"&gt;Miranda&lt;/a&gt;(1985)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/David_Turner_%28computer_scientist%29"&gt;David Turner&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/ML_%28programming_language%29"&gt;ML&lt;/a&gt;(1973)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Robin_Milner"&gt;Robin Milner&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Newspeak_%28programming_language%29"&gt;Newspeak&lt;/a&gt;(2006)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Gilad_Bracha"&gt;Gilad Bracha&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/Gilad_Bracha"&gt;&lt;span style="color: blue;"&gt;@Gilad_Bracha&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Objective-C"&gt;Objective-C&lt;/a&gt;(1983)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Tom Love&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Brad_Cox"&gt;Brad Cox&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/GNU_Octave"&gt;Octave&lt;/a&gt;(1988)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/John_W._Eaton"&gt;John W. Eaton&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Opa_%28programming_language%29"&gt;Opa&lt;/a&gt; (2011)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Henri Binsztok - &lt;a href="http://twitter.com/henri_opa"&gt;&lt;span style="color: blue;"&gt;@henri_opa&lt;/span&gt;&lt;/a&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Oz_%28programming_language%29"&gt;Oz&lt;/a&gt;(1991)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Gert Smolka &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Pascal_%28programming_language%29"&gt;Pascal&lt;/a&gt;(1970)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Niklaus_Wirth"&gt;Niklaus Wirth&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Perl"&gt;Perl&lt;/a&gt;(1987)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Larry_Wall"&gt;Larry Wall&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/TimToady"&gt;&lt;span style="color: blue;"&gt;@TimToady&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/PHP"&gt;PHP&lt;/a&gt;(1995)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Rasmus_Lerdorf"&gt;Rasmus Lerdorf&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/rasmus"&gt;&lt;span style="color: blue;"&gt;@rasmus&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/PostScript"&gt;PostScript&lt;/a&gt;(1982)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/John_Warnock"&gt;John Warnock&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/jewarnock"&gt;&lt;span style="color: blue;"&gt;@jewarnock&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Chuck_Geschke"&gt;Chuck Geschke&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Processing_%28programming_language%29"&gt;Processing&lt;/a&gt;(2001)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C.E.B._Reas"&gt;Casey Reas&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/REAS"&gt;&lt;span style="color: blue;"&gt;@REAS&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Benjamin_Fry"&gt;Benjamin Fry&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Prolog"&gt;Prolog&lt;/a&gt;(1972)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Alain_Colmerauer"&gt;Alain Colmerauer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Pure_%28programming_language%29"&gt;Pure&lt;/a&gt;&amp;nbsp;(2008)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Albert Gräf &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29"&gt;Python&lt;/a&gt;(1991)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Guido_van_Rossum"&gt;Guido van Rossum&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/gvanrossum"&gt;&lt;span style="color: blue;"&gt;@gvanrossum&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/QuakeC"&gt;QuakeC&lt;/a&gt;(1996)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/John_Carmack"&gt;John Carmack&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/ID_AA_Carmack"&gt;&lt;span style="color: blue;"&gt;@ID_AA_Carmack&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/R_%28programming_language%29"&gt;R&lt;/a&gt;(1993)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Ross_Ihaka"&gt;Ross Ihaka&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Robert_Gentleman_%28statistician%29"&gt;Robert Gentleman&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/REBOL"&gt;REBOL&lt;/a&gt;(1997)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Carl_Sassenrath"&gt;Carl Sassenrath&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/rebol3"&gt;&lt;span style="color: blue;"&gt;@rebol3&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Ruby_%28programming_language%29"&gt;Ruby&lt;/a&gt;(1995)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Yukihiro_Matsumoto"&gt;Yukihiro Matsumoto&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/yukihiro_matz"&gt;&lt;span style="color: blue;"&gt;@yukihiro_matz&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Rust_%28programming_language%29"&gt;Rust&lt;/a&gt;(2006)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Graydon Hoare&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/graydon_moz"&gt;&lt;span style="color: blue;"&gt;@graydon_moz&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Scala_%28programming_language%29"&gt;Scala&lt;/a&gt;(2003)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Martin_Odersky"&gt;Martin Odersky&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/odersky"&gt;&lt;span style="color: blue;"&gt;@odersky&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Scheme_%28programming_language%29"&gt;Scheme&lt;/a&gt;(1975)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Guy_L._Steele,_Jr."&gt;Guy L. Steele, Jr.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Gerald_Jay_Sussman"&gt;Gerald Jay Sussman&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Simula"&gt;Simula&lt;/a&gt;(1967)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Ole-Johan_Dahl"&gt;Ole-Johan Dahl&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Kristen_Nygaard"&gt;Kristen Nygaard&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Smalltalk"&gt;Smalltalk&lt;/a&gt;(1972)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Alan_Kay"&gt;Alan Kay&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Dan_Ingalls"&gt;Dan Ingalls&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Adele_Goldberg_%28computer_scientist%29"&gt;Adele Goldberg&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt;(1974)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Donald_D._Chamberlin"&gt;Donald D. Chamberlin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Raymond_F._Boyce"&gt;Raymond F. Boyce&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Tcl"&gt;Tcl&lt;/a&gt;(1988)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/John_Ousterhout"&gt;John Ousterhout&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Tea_%28programming_language%29"&gt;Tea&lt;/a&gt;(1997)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Jorge Nunes &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/UnrealScript"&gt;UnrealScript&lt;/a&gt;(1998)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Tim_Sweeney_%28game_developer%29"&gt;Tim Sweeney&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/6ix7even"&gt;&lt;span style="color: blue;"&gt;@6ix7even&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Verilog"&gt;Verilog&lt;/a&gt;(1983)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Phil_Moorby"&gt;Phil Moorby&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Prabhu Goel&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Visual_Basic"&gt;VisualBasic&lt;/a&gt;(1991)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Alan_Cooper"&gt;Alan Cooper&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href="http://twitter.com/MrAlanCooper"&gt;&lt;span style="color: blue;"&gt;@MrAlanCooper&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/WebDNA"&gt;WebDNA&lt;/a&gt;(1995)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Grant Hulbert &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/X10_%28programming_language%29"&gt;X10&lt;/a&gt;(2004)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Kemal Ebcioglu&lt;/li&gt;&lt;li&gt;Vijay Saraswat&lt;/li&gt;&lt;li&gt;Vivek Sarkar&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Yorick_%28programming_language%29"&gt;Yorick&lt;/a&gt;(1996)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/David_H._Munro"&gt;David H. Munro&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/ZPL_%28programming_language%29"&gt;ZPL&lt;/a&gt;(1993)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Brad Chamberlain &lt;/li&gt;&lt;li&gt;Sung-Eun Choi &lt;/li&gt;&lt;li&gt;E Christopher Lewis &lt;/li&gt;&lt;li&gt;Calvin Lin &lt;/li&gt;&lt;li&gt;Jason Secosky &lt;/li&gt;&lt;li&gt;Larry Snyder &lt;/li&gt;&lt;li&gt;W. Derrick Weathersby&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/6041045298238779146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/04/programming-language-inventors-on.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6041045298238779146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6041045298238779146'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/04/programming-language-inventors-on.html' title='Programming language inventors on twitter'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-6411868278419986357</id><published>2012-04-09T02:41:00.000-07:00</published><updated>2012-04-10T06:00:31.094-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web-development'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><title type='text'>Scalability lessons from Google, YouTube, Twitter, Amazon, eBay, Facebook and Instagram</title><content type='html'>&lt;br /&gt;I've gathered together in one place a few lessons in scalability from seven of the most highly trafficked websites around. I've grabbed this primarily from various articles on the excellent &lt;a href="http://highscalability.com/"&gt;High Scalability Blog&lt;/a&gt;&amp;nbsp;and have summarized the main points from each company below.&lt;br /&gt;&lt;br /&gt;Here are some common ideas I've noticed across all seven companies ...&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Keep it simple&lt;/b&gt; - complexity will come naturally over time.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Automate everything&lt;/b&gt;, including failure recovery.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Iterate your solutions&lt;/b&gt; - be prepared to throw away a working component when you want to scale it up to the next level.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Use the right tool for the job&lt;/b&gt;, but don't be afraid to roll your own solution.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Use caching&lt;/b&gt;, where appropriate.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Know when to&amp;nbsp;favor&amp;nbsp;data consistency over data availability&lt;/b&gt;, and vice versa.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ApW4L-bTDg8/T4KtQ-ux1fI/AAAAAAAAAKs/ONEfhcQk9IY/s1600/logo-google.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-ApW4L-bTDg8/T4KtQ-ux1fI/AAAAAAAAAKs/ONEfhcQk9IY/s1600/logo-google.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Google&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reliable storage&lt;/b&gt;&lt;br /&gt;Reliable scalable storage is a core need of any application. The Google File System (GFS) is Google's core storage platform - its a large distributed log structured file system into which they throw a lot of data. Why did they build it instead of using something off the shelf? Because they control everything about it, and it's the platform that distinguishes them from everyone else. From GFS, they gain: high reliability across data centers, scalability to thousands of network nodes, huge read/write bandwidth, support for large blocks of data which are gigabytes in size and an efficient distribution of operations across nodes to reduce bottlenecks.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Infrastructure as a competitive advantage&lt;/b&gt;&lt;br /&gt;Google can roll out new internet services faster, cheaper, and at scale at few others can compete with. Many companies take a completely different approach by treating infrastructure as an expense. Each group will use completely different technologies and there will be little planning and commonality of how to build systems.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Build applications on top of a platform&lt;/b&gt;&lt;br /&gt;An under appreciated advantage of a platform approach is that junior developers can quickly and confidently create robust applications. If every project needs to create the same distributed infrastructure you'll quickly run into difficulty because the people who know how to do this are relatively rare. Synergy isn't always crap. By making all parts of a system work together an improvement in one helps them all. Improve the file system and everyone benefits immediately and transparently. If every project uses a different file system then there's no continual incremental improvement across the entire stack.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Automation and recovery&lt;/b&gt;&lt;br /&gt;Build self-managing systems that work without having to take the system down. This allows you to more easily rebalance resources across servers, add more capacity dynamically, bring machines off line, and gracefully handle upgrades.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Create a Darwinian infrastructure&lt;/b&gt;&lt;br /&gt;Perform a time consuming (CPU bound) operation in parallel and take the winner. This is especially useful when you have spare CPU capacity but limited IO.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Don't ignore the Academy&lt;/b&gt;&lt;br /&gt;Academia has a lot of good ideas that don't get translated into production environments. Most of what Google has done has prior art, just not prior large scale deployment.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Consider data compression&lt;/b&gt;&lt;br /&gt;Compression is a good option when you have a lot of CPU to throw around and limited IO.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CMWnfnzdu_0/T4KtYKTyNTI/AAAAAAAAAK0/4Vh5tbLHRwE/s1600/logo-youtube.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-CMWnfnzdu_0/T4KtYKTyNTI/AAAAAAAAAK0/4Vh5tbLHRwE/s1600/logo-youtube.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;YouTube&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Keep it simple&lt;/b&gt;&lt;br /&gt;Look for the simplest thing that will address the problem space. There are lots of complex problems, but the first solution doesn’t need to be complicated. The complexity will come naturally over time. Choose the simplest solution possible with the loosest guarantees that are practical. The reason you want all these things is you need flexibility to solve problems. The minute you over specify something you paint yourself into a corner. You aren’t going to make those guarantees. Your problem becomes automatically more complex when you try and make guarantees - you leave yourself no way out.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cheat: know how to fake data&lt;/b&gt;&lt;br /&gt;The fastest function call is the one that doesn’t happen. When you have a consistently increasing counter, like a view count, you would need to do a database call every update. Or you could do a call every once in awhile, and update by a random amount in between - people will believe it’s real. Know how to fake data.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Jitter: add entropy back into your system&lt;/b&gt;&lt;br /&gt;If your system doesn’t jitter then you get thundering herds of people all requesting the same resource at the same time. For a popular video, they cache things as best they can. The most popular video they might cache for 24 hours. If everything expires at the same time, then every machine will calculate the expiration at the same time. This creates a thundering herd. By jittering you are saying randomly expire between 18-30 hours. That prevents things from happening at the same time and spreads requests out over a long period of time.&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;b&gt;Approximate correctness&lt;/b&gt;&lt;br /&gt;The state of the system is that which the user sees. If a user can’t tell a part of the system is skewing and inconsistent, then it’s not. If you write a comment and someone loads the page at the same time, they might not get it for half a second, the user who is just reading the page won’t care. The writer of the comment will care though, so you make sure the user who wrote the comment will see it immediately. This allows you to cheat a little bit. When it comes to comments, your system doesn’t have to have globally consistent transactions. That would be super expensive and overkill. Comments are not financial transaction - know when you can cheat.&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-UIuNLU7kh_4/T4Kteh6heHI/AAAAAAAAAK8/y14Kua6cNvo/s1600/logo-twitter.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-UIuNLU7kh_4/T4Kteh6heHI/AAAAAAAAAK8/y14Kua6cNvo/s1600/logo-twitter.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;Twitter&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Implement an API&lt;/b&gt;&lt;br /&gt;Twitter's API Traffic is ten times that of Twitter’s Website alone. The API is the most important thing Twitter did to grow their user base. Keeping the service simple allowed developers to build on top of their infrastructure and come up with app ideas that are way better than Twitter could come up with. You can never do all the work your user's can do and you probably won't be as creative. So open up your application and make it as easy as possible for others to integrate your application with theirs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Use what you know&lt;/b&gt;&lt;br /&gt;Twitter uses messaging a lot. Producers produce messages, which are queued, and then are distributed to consumers. Twitter's main functionality is to act as a messaging bridge between different formats (SMS, web, IM, etc). Send a message to invalidate a friend's cache in the background instead of doing it all individually, synchronously. Twitter developers were most familiar with Ruby, so they moved from DRb to Starling, a distributed queue written in Ruby. Distributed queues were made to survive system crashes by writing them to disk. In Twitter's experience, most performance improvements come not from the choice of language, but from an application's design.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Know when and what to cache&lt;/b&gt;&lt;br /&gt;For example, getting your friends status is complicated. There are security and other issues. So rather than doing a database query, a friend's status is updated in cache instead. It never touches the database. 90% of requests are API requests. So they don't do any page caching for the front-end. Twitter pages are so time sensitive it doesn't do any good. Twitter only caches API requests.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Defend yourself against abuse&lt;/b&gt;&lt;br /&gt;Understand how people will try to bust your system. Put in reasonable limits and detection mechanisms to protect your system from being killed by bots. Build tools to detect abuse so you can pinpoint when and where they are happening. Be ruthless. Delete them as users.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-vCPqZeD8HLs/T4KtkaU7lMI/AAAAAAAAALE/NxhNz4WjAgY/s1600/logo-amazon.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-vCPqZeD8HLs/T4KtkaU7lMI/AAAAAAAAALE/NxhNz4WjAgY/s1600/logo-amazon.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;Amazon&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Use SOA&lt;/b&gt;&lt;br /&gt;Amazon's architecture is loosely coupled and built around services. A service-oriented architecture (SOA) gave them the isolation that would allow building many software components rapidly and independently of each other, allowing fast time to market. The application that renders the Amazon.com Web pages is one such application server. So are the applications that serve the Web-services interface, the customer service application, and the seller interface.&lt;br /&gt;&lt;br /&gt;Open up your system with APIs and you'll create an ecosystem around your application. Organizing around services gives you agility - you can now do things in parallel is because the output of everything is a service. Prohibit direct database access by clients. This means you can make you service scale and be more reliable without involving your clients. This is much like Google's ability to independently distribute improvements in their stack to the benefit of all applications.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Know when to favour consistency over availability and vice versa&lt;/b&gt;&lt;br /&gt;To scale you have to partition, so you are left with choosing either high consistency or high availability for a particular system. You must find the right overlap of availability and consistency. Choose a specific approach based on the needs of the service. For the checkout process you always want to honor requests to add items to a shopping cart because it's revenue producing. In this case you choose high availability. Errors are hidden from the customer and sorted out later. When a customer submits an order you favor consistency because several services (credit card processing, shipping and handling, reporting) are simultaneously accessing the data and each rely on their data to be consistent.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Embrace failure&lt;/b&gt;&lt;br /&gt;Take it for granted stuff fails, that's reality, embrace it. For example, go more with a fast reboot and fast recover approach. With a decent spread of data and services you might get close to 100%. Create a self-healing, self-organizing, lights-out type operation.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Only use what you need&lt;/b&gt;&lt;br /&gt;Keep things simple by making sure there are no hidden requirements and hidden dependencies in the design. Cut technology to the minimum you need to solve the problem you have. It doesn't help the company to create artificial and unneeded layers of complexity. Not stuck with one particular approach or technology stack. Some places they use jboss/java, but they use only servlets, not the rest of the J2EE stack. C++ is uses to process requests. Perl/Mason is used to build content.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Base decisions on customer feedback&lt;/b&gt;&lt;br /&gt;Use measurement and objective debate to separate the good from the bad. Expose real customers to a choice and see which one works best and to make decisions based on those tests. This is done with techniques like A/B testing and Web Analytics. If you have a question about what you should do - code it up, let people use it, and see which alternative gives you the results you want.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scalability as a competitive advantage&lt;/b&gt;&lt;br /&gt;Infrastructure for Amazon, like for Google, is a huge competitive advantage. They can build very complex applications out of primitive services that are by themselves relatively simple. They can scale their operation independently, maintain unparalleled system availability, and introduce new services quickly without the need for massive reconfiguration.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/--ASxDBzItxk/T4KtqysRfMI/AAAAAAAAALM/-nD9y9xewT0/s1600/logo-ebay.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/--ASxDBzItxk/T4KtqysRfMI/AAAAAAAAALM/-nD9y9xewT0/s1600/logo-ebay.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;eBay&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Partition everything&lt;/b&gt;&lt;br /&gt;If you can't split it, you can't scale it. Split everything into manageable chunks by function and data.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Asynchrony everywhere&lt;/b&gt;&lt;br /&gt;Connect independent components through event-driven queues and pipelines.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Embrace failure&lt;/b&gt;&lt;br /&gt;Monitor everything, provide service even when parts start failing. Minimize and control dependencies, use abstract interfaces and virtualization, components have an SLA, consumers responsible for recovering from SLA violations. Automate everything. Components should automatically adjust and the system should learn and improve itself.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Embrace inconsistency&lt;/b&gt;&lt;br /&gt;Pick for each feature where you need to be on the CAP continuum, no distributed transactions, inconsistency can be minimized by careful operation ordering, become eventually consistent through async recovery and reconciliation.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Save all your data&lt;/b&gt;&lt;br /&gt;Data drives finding optimization opportunities, predictions, recommendations, so save it all. Know which data is authoritative, which data isn't, and treat it accordingly.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Infrastructure: use the right tool for the right job&lt;/b&gt;&lt;br /&gt;Need to maximize utilization of every resource: data (memory), processing (CPU), clock time (latency), power. One size rarely fits all, particularly at scale. Compose from orthogonal, commodity components.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-HkuKNMLgFeo/T4KtwtHqF-I/AAAAAAAAALU/4WwfyjTFl1I/s1600/logo-facebook.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-HkuKNMLgFeo/T4KtwtHqF-I/AAAAAAAAALU/4WwfyjTFl1I/s1600/logo-facebook.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;Facebook&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scaling takes multiple iterations&lt;/b&gt;&lt;br /&gt;Solutions often work in the beginning, but you'll have to modify them as you go on - what works in year one may not work later. A good example is photos. Facebook currently serves 1.2 million photos a second. The first generation was built the easy way - don't worry about scaling that much - focus on getting the functionality right. The uploader stored the file in NFS and the meta-data was stored in MySQL. It only worked for the first 3 months but this didn't matter because time to market was the biggest competitive advantage they had. Having the feature was more important than making sure it was a fully thought out, scalable solution. The second generation was optimized - different access patterns were optimized for. Smaller images were accessed more frequently so those became cached. They also started using a CDN (Content Delivery Network). The third generation is an overlay system that creates a file that is a blob stored in the file system. Images are stored in a binary blob and you know the byte offset of the photo in the blob - so there's only one disk IO per photo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Don't over design a solution - keep it simple&lt;/b&gt;&lt;br /&gt;Just use what you need to use as you scale your system out. Figure out where you need to iterate on a solution, optimize something, or completely build a part of the stack yourself. Facebook spent a lot of time trying to optimize PHP, and ended up writing HipHop, a tool to convert PHP into C++. This generated a massive amount of memory and CPU savings. You don't have to do this on day one, but you may have to. Focus on the product first before you write an entire new language.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Choose the right tool for the job, but accept that your choice comes with overhead&lt;/b&gt;&lt;br /&gt;If you really need to use Python then go ahead and do so, but realize with that choice there is overhead, usually across deployment, monitoring and operations. If you choose to use a service oriented architecture (SOA) you'll have to build most of the backend yourself and that often takes quite a bit of time. With the LAMP stack you get a lot for free. Once you move away for the LAMP stack, how you do things like service configuration and monitoring is up to you. As you go deeper into the services approach you have to reinvent the wheel.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Get the culture right&lt;/b&gt;&lt;br /&gt;Build an environment internally which promotes building the right thing first and then fixing as needed, not worrying about innovating, not worrying about breaking things, thinking big, thinking what is the next thing you need to build after the building the first thing. You can get the code right, you can get the products right, but you need to get the culture right first. If you don't get the culture right then your company won't scale.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PqscbbDaQbU/T4Qr8RaObII/AAAAAAAAALc/XnqMtCuEKE4/s1600/instagram-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-PqscbbDaQbU/T4Qr8RaObII/AAAAAAAAALc/XnqMtCuEKE4/s1600/instagram-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;Instagram&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Make use of existing cloud infrastructure&lt;/b&gt;&lt;br /&gt;Don't reinvent the wheel when you can use solid and proven technology. Instagram runs 100+ instances of Ubuntu 11.04 on Amazon's EC2 cloud computing infrastructure. They also use Amazon's ELB (Elastic Load Balancer), which comprises three NGINX instances, with automatic failure recovery. The photos themselves go straight to Amazon S3 storage and they use Amazon CloudFront as their  CDN (Content Delivery Network), which helps with image load times from users around the world (like  in Japan, their second most-popular country).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Asynchronous task queuing&lt;/b&gt;&lt;br /&gt;When a user decides to share out an Instagram photo to Twitter or Facebook, or when they need to notify a Real-time subscriber of a new photo posted, they push the task into the open source &lt;a href="http://gearman.org/"&gt;Gearman&lt;/a&gt; task management framework. Doing it  asynchronously through a task queue means that media uploads can  finish quickly, while the ‘heavy lifting’ can run in the background. There's about 200 workers, written in Python, consuming the task queue  at any given time, split between the services they share to.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Push notifications&lt;/b&gt;&lt;br /&gt;They use an open source Apple Push Notification Service (APNS) provider called &lt;a href="https://github.com/samuraisam/pyapns"&gt;pyapns&lt;/a&gt;, which is based on Twisted. It has handled over a billion push notifications for Instagram, and they report that its been rock-solid.&lt;br /&gt;&lt;br /&gt;  &lt;b&gt;Real-time system-wide monitoring&lt;/b&gt;&lt;br /&gt;With 100+ EC2 instances, it’s important to keep on top of what’s going on across the board. They use &lt;a href="http://munin-monitoring.org/"&gt;Munin&lt;/a&gt; to graph metrics system-wide, which sends an alert if  anything is outside of its normal operating range. They write custom Munin  plugins, building on top of &lt;a href="http://samuelks.com/python-munin/"&gt;Python-Munin&lt;/a&gt;, to graph metrics that aren’t system-level (for example, signups per minute, photos posted per second, etc). They use &lt;a href="http://pingdom.com/"&gt;Pingdom&lt;/a&gt; for external monitoring of the service, and &lt;a href="http://pagerduty.com/"&gt;PagerDuty&lt;/a&gt; for handling notifications and incidents. For Python error reporting, they use &lt;a href="http://pypi.python.org/pypi/django-sentry"&gt;Sentry&lt;/a&gt;,  an open-source Django app. At  any given time, they can sign-on and see what errors are happening across their system, in real time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Selective use of NoSQL technology (like Redis)&lt;/b&gt; &lt;br /&gt;&lt;a href="http://redis.io/"&gt;Redis&lt;/a&gt; powers the main feed, the activity feed, the sessions system (&lt;a href="https://gist.github.com/910392"&gt;here’s their Django session backend&lt;/a&gt;), and other &lt;a href="http://instagram-engineering.tumblr.com/post/12202313862/storing-hundreds-of-millions-of-simple-key-value-pairs"&gt;related systems&lt;/a&gt;.  All of Redis’ data needs to fit in memory, so they run several  Quadruple Extra-Large Memory instances on EC2 for Redis, and occasionally  shard across a few Redis instances for any given subsystem.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;i&gt;Sidenote on CAP&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;b&gt;&lt;u&gt;Eric Brewer's CAP Theorem or "the three properties of systems"&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There are three properties of a system: consistency, availability and tolerance to network partitions (partitionability).&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;ul&gt;&lt;li&gt;You can have at most two of these three properties for any shared-data system.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: 800;"&gt;&lt;b&gt;Consistency:&amp;nbsp;&lt;/b&gt;&lt;/span&gt;write a value and then when you read the value you get the same value back. In a partitioned system there are time windows where that's not true.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Availability:&lt;/b&gt;&amp;nbsp;you may not always be able to write or read. The system may prevent you from writing because it wants to keep the system consistent.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Partitionability:&lt;/b&gt;&amp;nbsp;divide nodes into small groups that can see other groups, but they can't see everyone.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/6411868278419986357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/04/scalability-lessons-from-google-youtube.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6411868278419986357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6411868278419986357'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/04/scalability-lessons-from-google-youtube.html' title='Scalability lessons from Google, YouTube, Twitter, Amazon, eBay, Facebook and Instagram'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-ApW4L-bTDg8/T4KtQ-ux1fI/AAAAAAAAAKs/ONEfhcQk9IY/s72-c/logo-google.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-6507565013895414583</id><published>2012-03-03T03:58:00.000-08:00</published><updated>2012-03-03T03:58:45.644-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><category scheme='http://www.blogger.com/atom/ns#' term='game-development'/><title type='text'>Every software project I’ve worked on has used the "Spanish Theory" of project management, and its likely yours have too</title><content type='html'>The "Spanish Theory" says that management's job is to extract the maximum resources (= developer effort) &amp;nbsp;from the smallest amount of money (= developer salary). In practice what this often means for the developer is unpaid overtime (also known as "crunch time"), something very familiar to game developers, and also common in traditional software development, as the project nears its deadline. But those unpaid hours are actually costing you, the developer, because you can't get them back. You've sacrificed time in your personal life with your family and instead have chosen to work on the company's project - something of large value has been sacrificed for something of lesser value. If this imbalance continues past a reasonable level and unpaid overtime becomes the norm, then many developers will become dissatisfied and leave the company, increasing the company's staff turnover (churn) rate.&lt;br /&gt;&lt;br /&gt;The book describing these harmful effects in the software industry was first published back in 1987. So why are many software development managers and PMs still&amp;nbsp;practicing&amp;nbsp;this method, some 25 years later? The reason I believe is a lack of foresight, an unquestioning acceptance of previous methods, a short term project oriented view, a limited understanding of the harm that comes to a company from a high churn rate, and finally, developers that are willing to accept these conditions. In moderation, some unpaid overtime is probably ok, but when it becomes the norm, from week to week and is just expected of all developers, then maybe that's a sign something is wrong,&amp;nbsp;and could even be considered a&amp;nbsp;&lt;a href="http://programmers.stackexchange.com/questions/39772/is-this-job-smell"&gt;job smell&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The attitude of government and corporations around the world towards unpaid overtime&amp;nbsp;is changing, as can be seen by some recent initiatives out of Britain (&lt;a href="http://www.worksmart.org.uk/workyourproperhoursday/"&gt;Work your proper hours day&lt;/a&gt;). Similarly in Australia, there's now a &lt;a href="http://www.gohomeontimeday.org.au/"&gt;National go home on time day&lt;/a&gt;&amp;nbsp;held every November. The US-based International Game Developers Association (&lt;a href="http://www.igda.org/"&gt;IGDA&lt;/a&gt;) is also active in promoting &lt;a href="http://www.igda.org/quality-life"&gt;quality of life&lt;/a&gt; in the workplace through various publications and &lt;a href="http://www.igda.org/qol/events"&gt;events&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Below I've quoted the extracts from chapter 3 of the book which gave me the idea for this brief blog post - I highly recommend you have a read of this book, or if not, then at least read through this small extract here which I thought was outstanding ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Peopleware: Productive Projects and Teams (Second Edition)&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Amazon Link:&lt;/b&gt; &lt;a href="http://www.amazon.com/gp/product/0932633439/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=intsecdb-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0932633439"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Authors:&lt;/b&gt;&amp;nbsp;&lt;a href="http://www.dorsethouse.com/authors/demarco.html"&gt;Tom Demarco&lt;/a&gt; and &lt;a href="http://www.dorsethouse.com/authors/lister.html"&gt;Timothy Lister&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;"Historians long ago formed an abstraction about different theories of value: The Spanish Theory, for one, held that only a fixed amount of value existed on earth, and therefore the path to the accumulation of wealth was to learn to extract it more efficiently from the soil or from people's backs.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Then there was the English Theory that held that value could be created through ingenuity and technology. So the English had an Industrial Revolution, while the Spanish spun their wheels trying to exploit the land and the Indians in the New World. They moved huge quantities of gold across the ocean, and all they got for their effort was enormous inflation (too much gold money chasing too few usable goods).&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;The Spanish Theory of Value is alive and well among managers everywhere. You see that whenever they talk about productivity. Productivity ought to mean achieving more in an hour of work, but all too often it has come to mean extracting more for an hour of pay. There is a large difference. The Spanish Theory managers &amp;nbsp;dream of attaining new productivity levels through the simple mechanism of unpaid overtime. They divide whatever work is done in a week by forty hours, not by the eighty or ninety hours that the worker actually put in.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;That's not exactly productivity — it's more like fraud — but it's the state of the art for many American managers. They bully and cajole their people into long hours. They impress upon them how important the delivery date is (even though it may be totally arbitrary; the world isn't going to stop &amp;nbsp;just because a project completes a month late). They trick them into accepting hopelessly tight schedules, shame them into sacrificing any and all to meet the deadline, and do anything to get them to work longer and harder.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Overtime for salaried workers is a figment of the naive manager's imagination. Oh, there might be some benefit in a few extra hours worked on Saturday to meet a Monday deadline, but that's almost always followed by an equal &amp;nbsp;period of compensatory "undertime" while the workers catch up with their lives. Throughout the effort there will be more or less an hour of undertime for every hour of overtime. The trade-off might work to your advantage for the short term, but for the long term it will cancel out.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Just as the unpaid overtime was largely invisible to the Spanish Theory manager &amp;nbsp;(who always counts the week as &amp;nbsp;forty &amp;nbsp;hours regardless of how much time the people put in), so too is the undertime invisible. You never see it on anybody's time sheet. &amp;nbsp;It's time spent on the phone or in bull sessions or just resting. &amp;nbsp;Nobody can really work much more than forty hours, at least not continually and with the level of &amp;nbsp;intensity required for creative work. Overtime is &amp;nbsp;like sprinting: It makes some &amp;nbsp;sense for the last hundred yards of the marathon for &amp;nbsp;those with any energy left, but if you start sprinting in the first mile, you're just wasting time. Trying to get people to sprint too much can only result in loss of respect for the manager. The best workers have been through it all before; they know enough to keep silent and roll their eyes while the manager raves on that the job has got to get done by April. Then they take their compensatory undertime when they can, and end up putting in forty hours of real work each week. The best workers react &amp;nbsp;that way; the others are workaholics.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;b&gt;People under time pressure don't work better; they just work faster.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;b&gt;In order to work faster, they may have to sacrifice the quality of the product and their own job satisfaction.&lt;/b&gt;"&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/6507565013895414583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/03/every-software-project-ive-worked-on.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6507565013895414583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6507565013895414583'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/03/every-software-project-ive-worked-on.html' title='Every software project I’ve worked on has used the &quot;Spanish Theory&quot; of project management, and its likely yours have too'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-3619419264893462947</id><published>2012-02-11T01:45:00.000-08:00</published><updated>2012-02-13T01:27:50.208-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='game-development'/><title type='text'>Coding tricks of game developers</title><content type='html'>If you've got any real world programming experience then no doubt at some point you've had to resort to some quick and dirty fix to get a problem solved or a feature implemented while a deadline loomed large. Game developers often experience a horrific "crunch" (also known as a "death march"), which happens in the last few months of a project leading up to the game's release date. Failing to meet the deadline can often mean the project gets cancelled or even worse, you lose your job. So what sort of tricks do they use while they're under the pump, doing 12+ hour per day for weeks on end?&lt;br /&gt;&lt;br /&gt;Below are some classic anecdotes and tips - many thanks to &lt;a href="http://www.gamasutra.com/view/authors/543/Brandon_Sheffield.php"&gt;Brandon Sheffield&lt;/a&gt; who originally put together &lt;a href="http://www.gamasutra.com/view/feature/4111/dirty_coding_tricks.php"&gt;this article&lt;/a&gt; on Gamasutra. I have reposted a few of his stories and also added some more from newer sources.&amp;nbsp;I have also linked on each story to the author's home page or blog wherever possible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;1. The programming antihero - &lt;a href="http://gamesfromwithin.com/"&gt;Noel Llopis&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I was fresh out of college, still wet behind the ears, and about to enter the beta phase of my first professional game project -- a late-90s PC title. It had been an exciting rollercoaster ride, as projects often are. All the content was in and the game was looking good. There was one problem though: We were way over our memory budget.&lt;br /&gt;&lt;br /&gt;Since most memory was taken up by models and textures, we worked with the artists to reduce the memory footprint of the game as much as possible. We scaled down images, decimated models, and compressed textures. Sometimes we did this with the support of the artists, and sometimes over their dead bodies.&lt;br /&gt;&lt;br /&gt;We cut megabyte after megabyte, and after a few days of frantic activity, we reached a point where we felt there was nothing else we could do. Unless we cut some major content, there was no way we could free up any more memory. Exhausted, we evaluated our current memory usage. We were still 1.5 MB over the memory limit!&lt;br /&gt;&lt;br /&gt;At this point one of the most experienced programmers in the team, one who had survived many years of development in the "good old days," decided to take matters into his own hands. He called me into his office, and we set out upon what I imagined would be another exhausting session of freeing up memory.&lt;br /&gt;&lt;br /&gt;Instead, he brought up a source file and pointed to this line:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;static char buffer[1024*1024*2];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"See this?" he said. And then deleted it with a single keystroke. Done!&lt;br /&gt;&lt;br /&gt;He probably saw the horror in my eyes, so he explained to me that he had put aside those two megabytes of memory early in the development cycle. He knew from experience that it was always impossible to cut content down to memory budgets, and that many projects had come close to failing because of it. So now, as a regular practice, he always put aside a nice block of memory to free up when it's really needed.&lt;br /&gt;&lt;br /&gt;He walked out of the office and announced he had reduced the memory footprint to within budget constraints -- he was toasted as the hero of the project.&lt;br /&gt;&lt;br /&gt;As horrified as I was back then about such a "barbaric" practice, I have to admit that I'm warming up to it. I haven't gotten into the frame of mind where I can put it to use yet, but I can see how sometimes, when you're up against the wall, having a bit of memory tucked away for a rainy day can really make a difference. Funny how time and experience changes everything.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;2. Cache it up - &lt;a href="http://gamedev.stackexchange.com/users/288/andrew-russell"&gt;Andrew Russell&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To improve performance when you are processing things in a tight loop, you want to make the data for each iteration as small as possible, and as close together as possible in memory. That means the ideal is an array or vector of objects (not pointers) that contain only the data necessary for the calculation.&lt;br /&gt;&lt;br /&gt;This way, when the CPU fetches the data for the first iteration of your loop, the next several iterations worth of data will get loaded into the cache with it.&lt;br /&gt;&lt;br /&gt;There's not really much you can do with using fewer and faster instructions because the CPU is as fast as its going to get, and the compiler can't be improved. Cache coherence is where it's at - &lt;a href="http://supercomputingblog.com/optimization/taking-advantage-of-cache-coherence-in-your-programs/"&gt;this article&lt;/a&gt;&amp;nbsp;contains a good example of getting cache coherency for an algorithm that doesn't simply run through data linearly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;3. Plan your distractions - &lt;a href="http://rampantgames.com/blog/?p=3881"&gt;Jay Barnson&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Internet is one of the greatest tools ever invented for both improving and destroying productivity. Twitter and forums and blogs and instructional websites can be extremely motivational and educational, but they can also be a distraction that completely destroys all hope of ever getting anything done. One thing I’ve done in the past which has proven pretty successful is to stick to a plan for when I can spend some minutes checking email and Twitter, or play a quick game or something. Either at the completion of a task, or after a period of time (say one five-minute break every hour). Otherwise, the browser’s only use is for reading reference manual pages, if necessary. That way I turn a potential distraction into a motivating tool.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;4. Collateral damage - Jim Van Verth (&lt;a href="https://twitter.com/#%21/cthulhim"&gt;@cthulhim&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Don't know how many remember Force 21, but it was an early 3D RTS which used a follow cam to observe your current platoon. Towards the end of the project we had a strange bug where the camera would stop following the platoon -- it would just stay where it was while your platoon moved on and nothing would budge it. The apparent cause was random because we couldn't find a decent repro case. Until, finally, one of the testers noticed that it happened more often when an air strike occurred near your vehicles. Using that info I was able to track it down.&lt;br /&gt;&lt;br /&gt;Because the camera was using velocity and acceleration and was collidable, I derived it from our PhysicalObject class, which had those characteristics. It also had another characteristic: PhysicalObjects could take damage. The air strikes did enough damage in a large enough radius that they were quite literally "killing" the camera.&lt;br /&gt;&lt;br /&gt;I did fix the bug by ensuring that cameras couldn't take damage, but just to be sure, I boosted their armor and hit points to ridiculous levels. I believe I can safely say we had the toughest camera in any game.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;5. The blind leading the blind - &lt;a href="http://blog.agfgames.com/"&gt;Maurício Gomes&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;At university there was a team that made a FPS flash game. For some bizarre reason, the programmer, instead of checking if the character was colliding with the wall and stop you going there, he did the inverse, he checked if there was a wall, and only allowed you to move parallel to it!&lt;br /&gt;&lt;br /&gt;This sparked a bizarre bug: in crossings or T junctions in the level, you could not actually cross, only turn to the passage on your left or right. The deadline was closing, and they had no idea on how to fix it.&lt;br /&gt;&lt;br /&gt;Then the team writer fixed the issue; he told the artist to add an animation of hands touching the walls, and then he added in the background story that the main character was blind and needed to constantly touch the walls to know where he was going.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;6. You wouldn't like me when I'm angry - &lt;a href="http://www.nickwaanders.com/"&gt;Nick Waanders&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I once worked at THQ studio Relic Entertainment on The Outfit, which some may remember as one of the earlier games for the Xbox 360. We started with a PC engine (single-threaded), and we had to convert it to a complete game on a next-gen multi-core console in about 18 months. About three months before shipping, we were still running at about 5 FPS on the 360. Obviously this game needed some severe optimization.&lt;br /&gt;&lt;br /&gt;When I did some performance measurements, it became clear that as much as the code was slow and very "PC," there were also lots of problems on the content side as well. Some models were too detailed, some shaders were too expensive, and some missions simply had too many guys running around.&lt;br /&gt;&lt;br /&gt;It's hard to convince a team of 100 people that the programmers can't simply "fix" the performance of the engine, and that some of the ways people had gotten used to working to needed to be changed. People needed to understand that the performance of the game was everybody's problem, and I figured the best way to do this is with a bit of humor that had a bit of hidden truth behind it.&lt;br /&gt;&lt;br /&gt;The solution took maybe an hour. A fellow programmer took four pictures of my face -- one really happy, one normal, one a bit angry, and one where I am pulling my hair out. I put this image in the corner of the screen, and it was linked to the frame rate. If the game ran at over 30fps, I was really happy, if it ran below 20, I was angry.&lt;br /&gt;&lt;br /&gt;After this change, the whole FPS issue transformed from, "Ah, the programmers will fix it." to, "Hmm, if I put this model in, Nick is going to be angry! I'd better optimize this a little first." People could instantly see if a change they made had an impact on the frame rate, and we ended up shipping the game at 30fps.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;7. Its not a bug, its a feature! - &lt;a href="http://gamedev.stackexchange.com/users/305/philip-tan"&gt;Philip Tan&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I worked on an RPG in which we were trying to get the NPCs (Non-player Characters) to spot when you were in range, walk up to you, and strike up a conversation with you by activating the dialog system.&lt;br /&gt;&lt;br /&gt;We forgot to add code to distinguish NPCs from PCs (Player Characters), so we'd walk into town and all the NPCs would be talking with each other. Because all NPC AI code used the same dialog template, they actually got a few sentences in before the conversations became nonsensical. And because character dialog was broadcast, you could read everything they said if you were in range.&lt;br /&gt;&lt;br /&gt;We decided to turn that bug into a major feature.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;8. Dirty deeds - Tim Randall (Developer @ &lt;a href="http://www.encore.com/"&gt;Encore&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The engine team at Gremlin Interactive used to keep a single glove in their office. When someone asked why it was there, they were told it was only used when someone was about to type some really dirty code. It wasn't so much a case of not wanting to leave fingerprints but rather not wanting to actually touch the dirtiest fixes!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;9. Explicit conditional hinting - &lt;a href="http://www.mandible.net/"&gt;ZorbaTHut&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A very, very low-level tip, but one that can come in handy... most compilers support some form of explicit conditional hinting. GCC has a function called __builtin_expect which lets you inform the compiler what the value of a result probably is. GCC can use that data to optimize conditionals to perform as quickly as possible in the expected case, with slightly slower execution in the unexpected case.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;if(__builtin_expect(entity-&amp;gt;extremely_unlikely_flag, 0)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // code that is rarely run&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've seen a 10-20% speedup with proper use of this.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;10. Object-ive oriented programming - Anonymous&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Back at a game studio, I think it was near the end of the project, we had an object in one of the levels that needed to be hidden. We didn't want to re-export the level and we did not use checksum names. So right smack in the middle of the engine code we had something like the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;if( level == 10 &amp;amp;&amp;amp; object == 56 )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; HideObject();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The game shipped with this in.&lt;br /&gt;&lt;br /&gt;Maybe a year later, an artist using our engine came to us very frustrated about why an object in their level was not showing up after exporting. The level they had a problem with resolved to level 10. I wonder why?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;11. Stack vs Heap - &lt;a href="http://stackoverflow.com/users/21182/torbjorn-gyllebring"&gt;Torbjörn Gyllebring&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Stack allocation is much faster than heap allocation since all it really does is move the stack pointer. Using memory pools, you can get comparable performance out of heap allocation, but that comes with a slight added complexity and its own headaches.&lt;br /&gt;&lt;br /&gt;Also, stack vs heap is not only a performance consideration; it also tells you a lot about the expected lifetime of objects. The stack is always hot, the memory you get is much more likely to be in cache than any far heap allocated memory.&lt;br /&gt;&lt;br /&gt;Downside of the stack is that it is actually a stack. You can't free a chunk of memory used by the stack unless it is on top of it. There's no management, you push or pop things on it. On the other hand, the heap memory is managed: it asks the kernel for memory chunks, maybe splits them, merges thems, reuses them and frees them. The stack is really meant for fast and short allocations.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;12. I'm a programmer, not an artist - &lt;a href="http://divillysausages.com/"&gt;Damian Connolly&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For indie / solo developers who are working on an iPhone or Android game on their own, while you're looking for an artist etc, you should be developing your game at the same time. Use programmer art, stand-ins, free sprites anything. Most of the time, before even thinking about final assets, I just want something up and running quickly to see if it's fun. Prototype the crap out of it and find the game. Then, when the gameplay's locked down, you can start putting in the proper art. Doing it the other way around leads to lost money, and work that needs to be redone multiple times, which aside from harming your project, sucks your motivation to finish it (and if you're making a game to get a job, showing that you can finish a project is a good thing). Another tip if you're lacking upfront finance is to find a freelance game artist who will accept a revenue sharing deal, e.g. typically something like 30% of game revenue, payable once it gets published to the AppStore.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;13. Remove unnecessary branches - &lt;a href="http://gamedev.stackexchange.com/users/259/tenpn"&gt;tenpn&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On some platforms and with some compilers, branches can throw away your whole pipeline, so even insignificant if() blocks can be expensive.&lt;br /&gt;&lt;br /&gt;The PowerPC architecture (PS3/x360) offers the floating-point select instruction, fsel. This can be used in the place of a branch if the blocks are simple assignments:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;float result = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;if (foo &amp;gt; bar) { result = 2.0f; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;else { result = 1.0f; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Becomes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;float result = fsel(foo-bar, 2.0f, 1.0f);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When the first parameter is greater than or equal to 0, the second parameter is returned, else the third. The price of losing the branch is that both the if{} and the else{} block will be executed, so if one is an expensive operation or dereferences a NULL pointer this optimisation is not suitable. Sometimes your compiler has already done this work, so check your assembly first.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;14. Hack the stack - &lt;a href="http://stevedefrisco.com/"&gt;Steve DeFrisco&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I was one of a few interns at IMAGIC in 1982-83. We were all doing Intellivision carts. One of the programmers had to leave to go back to school, and I was chosen to fix the random crash bug in his game. It turned out to be a stack overflow in the timer interrupt handler. Since the only reason for the handler was to update the *display* of the on-screen timer, I added some code to test the depth of the stack at the beginning of the interrupt routine. If we were in danger of overflowing the stack, return without doing anything. Since the handler was called multiple times per second, the player never noticed, and the crash was fixed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;15. Meet my dog, "Patches" - &lt;a href="http://www.gamasutra.com/view/authors/1181/Mick_West.php"&gt;Mick West&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There's an old joke that goes something like this:&lt;br /&gt;&lt;br /&gt;Patient: "Doctor, it hurts when I do this."&lt;br /&gt;Doctor: "Then stop doing it."&lt;br /&gt;&lt;br /&gt;Funny, but are these also wise words when applied to fixing bugs? Consider the load of pain I found myself in when working on the port of a 3D third person shooter from the PC to the original PlayStation.&lt;br /&gt;&lt;br /&gt;Now, the PS1 has no support for floating point numbers, so we were doing the conversion by basically recompiling the PC code and overloading all floats with fixed point. That actually worked fairly well, but where it fell apart was during collision detection.&lt;br /&gt;&lt;br /&gt;The level geometry that was supplied to us worked reasonably well in the PC version of the game, but when converted to fixed point, all kinds of seams, T-Junctions and other problems were nudged into existence by the microscopic differences in values between fixed and floats. This problem would manifest itself in one case with the main character touching a particular type of door in a particular level in a particular location; rather than fix the root cause of the problem, I simply made it so that if he ever touched the door, then I'd move him away, and pretend it never happened. Problem solved.&lt;br /&gt;&lt;br /&gt;Looking back I find this code quite horrifying. It was patching bugs and not fixing them. Unfortunately the real fix would have been to go and rework the entire game's geometry and collision system specifically with the PS1 fixed point limitations in mind. The schedule was initially aggressive, and since we always seemed close to finishing, the quick patch option won over against a comprehensive (but expensive) fix.&lt;br /&gt;&lt;br /&gt;But it did not go well. Hundreds of patches were needed, and then the patches themselves started causing problems, so more patches were added to turn off the patches in hyper-specific circumstances. The bugs kept coming, and I kept beating them back with patches. Eventually I won, but at a cost of shipping several months behind schedule, and working 14 hour days for all of those several months.&lt;br /&gt;&lt;br /&gt;That experience soured me against "the patch." Now I always try to dig right down to the root cause of a bug, even if a simple, and seemingly safe, patch is available. I want my code to be healthy. If you go to the doctor and tell him "it hurts when I do this," then you expect him to find out why it hurts, and to fix that. Your pain and your code's bugs might be symptoms of something far more serious. The moral: Treat your code like you would want a doctor to treat you; fix the cause, not the symptoms.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;16. Identity crisis - &lt;a href="http://gamesfromwithin.com/"&gt;Noel Llopis&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This scene is familiar to all game developers: It's the day we're sending out the gold candidate for our Xbox 1 game. The whole team is playtesting the game all day long, making sure everything looks good. It's fun, it's solid, it's definitely a go in our minds.&lt;br /&gt;&lt;br /&gt;In the afternoon, we make the last build with the last few game-balancing tweaks, and do one last playthrough session when disaster strikes: The game crashes hard! We all run to our workstations, fire up the debugger, and try to figure out what's going on. It's not something trivial, like an assert, or even something moderately hard to track down, like a divide by zero. It looks like memory is garbage in a few places, but the memory reporting comes out clean. What's going on?&lt;br /&gt;&lt;br /&gt;One dinner and many hours later, our dreams of getting out on time shattered, we manage to track it down to one data file being loaded in with the wrong data. The wrong data? How's that possible? Our resource system boiled down every asset to a 64-bit identifier made out of the CRC32 of the full filename and the CRC32 of all the data contents. That was also our way of collapsing identical resource files into a single one in the game. With tens of thousands of files, and two years of development, we never had a conflict. Never.&lt;br /&gt;&lt;br /&gt;Until now, that is.&lt;br /&gt;&lt;br /&gt;It turns out that one of the innocent tweaks the designers had checked in that afternoon made it so a text file had the exact same filename and data CRC as another resource file, even though they were completely different!&lt;br /&gt;&lt;br /&gt;Our hearts sank to our feet when we recognized the problem. There's no way we could change the resource indexing system in such a short period of time. Even if we pulled an all-nighter, there was no way to know for sure that everything would be stable in the morning.&lt;br /&gt;&lt;br /&gt;Then, as quickly as despair swept over us, we realized how we could fix this on time for the gold candidate release. We opened up the text file responsible for the conflict, added a space at the end, and saved it. We looked at each other with huge grins on our faces and said:&lt;br /&gt;&lt;br /&gt;"Ship it!"&lt;br /&gt;&lt;br /&gt;The extra space meant the CRC32 checksum of the text file was altered and therefore no longer conflicted with the other resource.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;17. HexEdit to the rescue - &lt;a href="http://ken.demarest.com/bio/bio.html"&gt;Ken Demarest&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Back on Wing Commander 1 we were getting an exception from our EMM386 memory manager when we exited the game. We'd clear the screen and a single line would print out, something like "EMM386 Memory manager error. Blah blah blah." We had to ship ASAP. So I hex edited the error in the memory manager itself to read "Thank you for playing Wing Commander." &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;18. 8-bit audio stomper - &lt;a href="http://news.ycombinator.com/user?id=toonse"&gt;Toonse&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For a launch product of a certain console I had a nasty bug report from QA that took 20+ hours to reproduce. Finally (with 24 hours left to go to hit console launch) tracked it down to some audio drivers in the firmware that were erroneously writing 1 random byte "somewhere" at random times where the "somewhere" was always in executable code space. I finally figured out that any given run of the game that "somewhere" was always the same place, luckily. 1st party said sorry, can't fix it in time as we don't know why it's being caused! So I shipped that game with stub code at the very start of main that immediately saved off the 1 byte from the freshly loaded executable in the place I knew it would overwrite for that particular version of the exe. There was then code that would run each frame after audio had run and restore that byte back to what it should be just in case it had been stomped that frame. Good times! We hit launch.&lt;br /&gt;&lt;br /&gt;To this day I still feel very very dirty about this hack, but it was needed to achieve the objectives and harmed no-one :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;19. Rainy day server pool - &lt;a href="http://news.ycombinator.com/user?id=potatolicious"&gt;Potatolicious&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I used to work for a company that had a horrific hardware requisition policy. If your team needed a server, it had to go through a lengthy and annoying approvals process - and even then, it took months before Infrastructure would actually provide said servers.&lt;br /&gt;&lt;br /&gt;In other words, when a project gets handed down from above to launch in, say, 3 months, there's no way in hell you can get the servers requisitioned, approved, and installed in that time. It became standard practice for each team to slightly over-request server capacity with each project and throwing the excess hosts into a rainy day pool, immediately available and repurposeable as required.&lt;br /&gt;&lt;br /&gt;New servers will still get requested for these projects, but since they took so long to approve, odds are they'd go right into the pool whenever they actually arrived, which sometimes took up to a year.&lt;br /&gt;&lt;br /&gt;Of course, it was horrifyingly inefficient. Just on my team alone I think we had easily 50 boxes sitting around doing nothing (and powered on to boot) waiting to pick up the slack of a horrendously broken bureaucracy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;20. Bit shifting magic - &lt;a href="http://hbfs.wordpress.com/"&gt;Steven Pigeon&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In order to avoid stalls in the processor pipeline due to branching, one can often use a branchless equivalent, that is, code transformed to remove the if-then-elses and therefore jump prediction uncertainties. E.g. a straightforward implementation of abs( ) in C might be&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;inline int abs(int x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (x&amp;lt;0) ? -x : x;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Which is simple enough but contains an inline if-then-else. As the argument, x, isn’t all that likely to follow a pattern that the branch prediction unit can detect, this simple function becomes potentially costly as the jump will be mispredicted quite often. &lt;br /&gt;&lt;br /&gt;How can we remove the if-then-else, then? One solution is to use the right shift operator (&amp;gt;&amp;gt;) and the bitwise XOR operator (^) as following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;inline int abs_no_branch(int x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int m = (x &amp;gt;&amp;gt; (8 * sizeof(int)-1));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; return ((x ^ m) - m);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Where the expression (8 * sizeof(int) - 1) evaluates to 15, 31, or 63 depending on the size of integers on the target computer.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Further detailed reading about this technique here: &lt;a href="http://hbfs.wordpress.com/2008/08/05/branchless-equivalents-of-simple-functions/"&gt;Branchless Equivalents of Simple Functions&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default" style="background-color: #fefdfa; color: #7d181e; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px; text-decoration: none;"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/3619419264893462947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/02/coding-tricks-of-game-developers.html#comment-form' title='31 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/3619419264893462947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/3619419264893462947'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/02/coding-tricks-of-game-developers.html' title='Coding tricks of game developers'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>31</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-3884860463275981066</id><published>2012-01-15T02:26:00.000-08:00</published><updated>2012-01-16T01:34:42.157-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><category scheme='http://www.blogger.com/atom/ns#' term='3d'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>The Promise of HTML5</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-pAbcG8T4qeQ/TxKotb2m33I/AAAAAAAAAKQ/lerTLII81lY/s1600/html5-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-pAbcG8T4qeQ/TxKotb2m33I/AAAAAAAAAKQ/lerTLII81lY/s200/html5-logo.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Anyone wanting evidence of what &lt;a href="http://en.wikipedia.org/wiki/HTML5"&gt;HTML5&lt;/a&gt; can achieve needs only to browse through the many excellent demos around the place, such as at &lt;a href="http://chromeexperiments.com/"&gt;chromeexperiments.com&lt;/a&gt;; these run inside &lt;a href="http://en.wikipedia.org/wiki/Webgl"&gt;WebGL&lt;/a&gt; enabled browsers, such as Google Chrome and Firefox. One of the driving forces of HTML5 is to make it easy to include and handle multimedia and graphical content on the web without having to resort to proprietary plugins and APIs; the new &amp;lt;canvas&amp;gt;, &amp;lt;svg&amp;gt;, &amp;lt;video&amp;gt;, &amp;lt;audio&amp;gt; tags allow for much of this. WebGL is a context of the canvas HTML element that provides a 3D computer graphics API without the use of plug-ins. WebGL is currently supported by all major desktop browsers, except for Internet Explorer where it is currently only supported via a plugin (named&amp;nbsp;&lt;a href="http://iewebgl.com/"&gt;IEWebGL&lt;/a&gt;). Support on mobile devices is a bit patchy though, with it being limited to Mobile Firefox on Android along with some specific Nokia, Sony Ericsson and Blackberry models. On the iPhone, there is a &lt;a href="http://atnan.com/blog/2011/11/03/enabling-and-using-webgl-on-ios/"&gt;workaround / hack&lt;/a&gt;&amp;nbsp;to develop apps with WebGL, and its expected Apple will support it in a future version.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-h0L7ZRJDuOk/TxKo1qeL_BI/AAAAAAAAAKY/AphNaEhOmKQ/s1600/webgl-water-sphere-pool-demo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="150" src="http://1.bp.blogspot.com/-h0L7ZRJDuOk/TxKo1qeL_BI/AAAAAAAAAKY/AphNaEhOmKQ/s200/webgl-water-sphere-pool-demo.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;This &lt;a href="http://www.chromeexperiments.com/detail/webgl-water-simulation/"&gt;demo by Evan Wallace&lt;/a&gt;&amp;nbsp;shows off the power of WebGL - a pool of water rendered with reflection, refraction, caustics, and ambient occlusion. You can create ripples on the water and also move the sphere around, both in and out of the water.&lt;br /&gt;&lt;br /&gt;A popular lightweight framework has sprung up on top of WebGL called &lt;a href="http://en.wikipedia.org/wiki/Three.js"&gt;three.js&lt;/a&gt;.The aim of the project is to create a lightweight 3D engine with a very low level of complexity; in other words, for developers who are not experienced with 3D graphics coding. The engine can render using &amp;lt;canvas&amp;gt;, &amp;lt;svg&amp;gt; and also WebGL. &amp;nbsp;It is one of the most comprehensive WebGL frameworks, covering matrices, scenes, meshes, materials, shadows, voxels, fog, and more. Many of the Chrome WebGL demos linked above use it and there's a list of demos on the &lt;a href="https://github.com/mrdoob/three.js"&gt;three.js github page&lt;/a&gt;. &amp;nbsp;These demos are absolutely mind blowing - I ran them inside Chrome with a reasonably old graphics card (a three year old GEForce 9600 GT) and the results were incredible - all ran at around 60 frames per second.&lt;br /&gt;&lt;br /&gt;A couple of real standouts here:&lt;br /&gt;&lt;a href="http://mrdoob.github.com/three.js/examples/webgl_materials_shaders_fresnel.html"&gt;Floating soap bubbles&lt;/a&gt;&amp;nbsp;- fresnel shader demo (rotate view with mouse)&lt;br /&gt;&lt;a href="http://mrdoob.github.com/three.js/examples/webgl_materials_normalmap2.html"&gt;Model of a head&lt;/a&gt;&amp;nbsp;- normalmap demo (rotate view with mouse)&lt;br /&gt;&lt;a href="http://mrdoob.github.com/three.js/examples/webgl_materials_cubemap.html"&gt;Model of Walt Disney&lt;/a&gt; - cube mapping and texture demo (rotate view with mouse)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-zAbKsZ7xA6U/TxKo_xrBzOI/AAAAAAAAAKg/abbX7eDUR-E/s1600/three-js-head-demo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-zAbKsZ7xA6U/TxKo_xrBzOI/AAAAAAAAAKg/abbX7eDUR-E/s320/three-js-head-demo.png" width="271" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/3884860463275981066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/01/promise-of-html5.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/3884860463275981066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/3884860463275981066'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/01/promise-of-html5.html' title='The Promise of HTML5'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-pAbcG8T4qeQ/TxKotb2m33I/AAAAAAAAAKQ/lerTLII81lY/s72-c/html5-logo.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-7335685054357615132</id><published>2012-01-04T02:06:00.000-08:00</published><updated>2012-01-08T20:00:33.075-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='app-development'/><category scheme='http://www.blogger.com/atom/ns#' term='app-store'/><category scheme='http://www.blogger.com/atom/ns#' term='cross-platform'/><category scheme='http://www.blogger.com/atom/ns#' term='web-development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Modern Cross Platform Development</title><content type='html'>&lt;i&gt;Why isn't there a modern technology available for using the same codebase to produce native apps on all of the currently popular platforms - I'm talking iOS (iPhone/iPad/iPod Touch), Android, Windows, Mac and Linux?&lt;/i&gt; &lt;br /&gt;&lt;br /&gt;That was my original question before I started looking, and since then I've discovered there actually are plenty of new options out there for cross platform development catering for all of the above platforms.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;A Brief History of Desktop UI Toolkits&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the 1980's the problem of a cross platform desktop user interface was for the most part solved by the &lt;a href="http://en.wikipedia.org/wiki/X_Window_System"&gt;X Window system&lt;/a&gt;, known as X11, (1984-) along with one of the first widget toolkits, Motif (1989-), which was built on top of X11. Back then, the dominant platforms used by business were Microsoft Windows and the various flavours of Unix, like Sun Solaris, HP-UX, IBM's AIX etc (later Linux came along and maintained full support for X11 and Motif). Developers who wanted to target multiple platforms such as these had this option of developing one codebase, usually written in C/C++, using X11 and/or Motif. &amp;nbsp;The UI code for the most part could remain the same and the application just needed to be recompiled with the provided X11 libraries.&lt;br /&gt;&lt;br /&gt;Since then Motif has pretty much faded into the background and been replaced with newer widget toolkits, still built on top of X11, including &lt;a href="http://en.wikipedia.org/wiki/Qt_%28framework%29"&gt;Qt&lt;/a&gt; (1991-), &lt;a href="http://en.wikipedia.org/wiki/WxWidgets"&gt;wxWidgets&lt;/a&gt; (1992-) and &lt;a href="http://en.wikipedia.org/wiki/GTK%2B"&gt;GTK+&lt;/a&gt; (1998-). These now run on many different platforms and bindings are available for many, many languages, including for their native C or C++.&lt;br /&gt;&lt;br /&gt;These three free open source toolkits have been successful for the desktop application case but looking towards mobile and tablet platforms, these toolkits don't currently have the support there to take them into the future.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://qt.nokia.com/"&gt;&lt;b&gt;Qt&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Native language&lt;/b&gt;: C++&lt;br /&gt;&lt;b&gt;Platforms&lt;/b&gt;: iOS (unofficial), Windows, Mac, Linux.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-family: inherit;"&gt;Probably the C++ based Qt widget toolkit is the most well established way of writing desktop cross platform applications. Smartphone support isn't really there yet, but there is an unofficial port to iOS. Linux's KDE desktop environment is written with the Qt toolkit. Many significant apps have been developed with Qt, including Autodesk Maya, VLC media player, Mathematica, Virtual Box and Skype. Qt is now owned by Nokia (although is still open source), and there was a release of a new version recently (Qt 4.8).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gtk.org/"&gt;&lt;b&gt;GTK+&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Native language&lt;/b&gt;: C&lt;br /&gt;&lt;b&gt;Platforms&lt;/b&gt;: HTML5 (unofficial), Windows, Mac, Linux.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-family: inherit;"&gt;The C-based GTK+ widget toolkit is also a very well established way of writing cross platform desktop apps. Smartphone support isn't there, but there is an unofficial port to HTML5. GTK+ powers Chromium on Linux, the open source forerunner to Google's Chrome browser. The GNOME desktop environment is written with the GTK+ toolkit. The other notable app written with GTK+ is the one that launched the toolkit itself, GIMP, an open source bitmap image editor.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wxwidgets.org/"&gt;&lt;b&gt;wxWidgets&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Native language&lt;/b&gt;: C++&lt;br /&gt;&lt;b&gt;Platforms&lt;/b&gt;: iOS, Windows, Mac, Linux.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-family: inherit;"&gt;A C++ native mode toolkit that provides a thin abstraction to a platform's native widgets. It was originally developed as a desktop GUI toolkit in the same vein as GTK+ and Qt and support for iOS is still beta. There are a number of notable apps developed with wxWidgets including BitTorrent, Audacity, TortoiseCVS and RapidSVN.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Java and Silverlight&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sun's Java Swing UI Library (1997-) and Microsoft's Silverlight (2007-) were both attempts at "write once, run anywhere" (WORA) technology that provided a rich user interface library. Although technically successful, they failed in their attempt to become the ubiquitous technology that everyone uses to develop UIs. They both attempted to replace the 'native' look of apps developed on a particular platform and instead impose their own look and feel based on graphical primitives, which although being more powerful for developers, users on the whole didn't like. &lt;br /&gt;&lt;br /&gt;As Johannes Fahrenkrug &lt;a href="http://www.springenwerk.com/2011/09/thoughts-on-mobile-ui-design.html"&gt;discusses here&lt;/a&gt;, people actually want to run Windows apps that look like Windows apps, and run MacOS apps that look like MacOS apps. To be fair, the Java Swing UI has actually undergone a lot of advances since it was first released and can now generate apps that do look perfectly native on all desktop platforms. The problem may be however that people's original experience of early Swing apps having a slow and inconsistent UI might have put them off using other Java apps and so contributed to its demise.&lt;br /&gt;&lt;br /&gt;In the case of Microsoft's Silverlight and WPF, although not officially dead yet, they are now taking a back seat to newer technologies that were released by Microsoft at the September 2011 Build conference; Windows 8 allow developers to create new style 'Metro' applications by using either web technology (HTML5/JavaScript/CSS) or a traditional language - C#, VB.NET or C/C++ paired up with XAML for describing the UI.&amp;nbsp;There's more detail about this topic on StackOverflow&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/7416826/how-does-the-new-windows-8-runtime-winrt-compare-to-silverlight-and-wpf"&gt;here&lt;/a&gt;&amp;nbsp;for those interested.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;The Rise of Web Applications and the App Store&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The two big changes since the desktop UI toolkit days has been the rise of browser-based web applications and more recently the rise of downloadable apps running on smartphones and tablets such as Apple's iOS (powering the iPod touch, iPhone and iPad devices) along with Google's Android (powering a vast array of different smartphones and tablets from many hardware vendors). Google's recent Chrome OS also deserves a mention for creating an OS around the browser itself. These new class of devices offer a quick method of downloading, paying for and installing apps (often with just one click) and appear in the easy to use 'App Store' on iOS and 'Android Marketplace' on Android. &lt;br /&gt;&lt;br /&gt;Microsoft is getting in on the App Store action a little late with its 'Windows Store' for Windows 8, which will be appearing some time in 2012. Its &lt;a href="http://hal2020.com/2011/11/04/windows-phone-8-and-windows-8-cousins-or-siblings/"&gt;thought&lt;/a&gt; by&amp;nbsp;&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; color: #252525; line-height: 18px;"&gt;&lt;a href="http://www.linkedin.com/pub/hal-berenson/4/4a1/b8"&gt;Hal Berenson&lt;/a&gt; (a former Distinguished Engineer at Microsoft)&amp;nbsp;&lt;/span&gt;t&lt;/span&gt;hat the upcoming Windows Phone 8 OS will be based on the same&amp;nbsp;technology&amp;nbsp;as&amp;nbsp;Windows 8 and hence will unify &amp;nbsp;the development platform for Microsoft's desktop, tablet and smartphone operating systems. This will likely be announced some time in 2012, probably at the same time Microsoft launches the 'Windows Store'.&amp;nbsp;This will mean Windows 8's new 'Metro' style apps on the Windows Store will run on phones, desktops and tablets - something that neither Apple nor Google can lay claim to, just yet. Add in the &lt;a href="http://arstechnica.com/microsoft/news/2011/07/ask-ars-windows-everywhere-or-windows-nowhere-what-is-microsofts-single-ecosystem.ars"&gt;possibility&lt;/a&gt; of an XBox update which adds support for running Metro apps, and you have a huge carrot which will make the unified Windows 8 platform very attractive to both application and game developers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Choosing Your Platform - Desktop, Web or Mobile Application?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When choosing your platform, if you need full access the underlying file system, or access to hardware devices like serial ports, microphones, webcams, etc, then you may be better off staying with a desktop application. If you need platform independence on top of this then you can go with one of the traditional widget library technologies like wxWidgets, GTK+ or Qt to provide a full cross platform UI solution.&lt;br /&gt;&lt;br /&gt;Alternatively, if you don't need so much access to hardware and can remain restricted to the browser, then HTML5 and JavaScript may be the way to go. Browser based web applications have their own set of problems however, including the browser incompatibilities, varying support for the HTML/CSS web standards and the Document Object Model (DOM). In addition, web application development generally makes it harder to create rich UI apps than for desktop or mobile applications. HTML5 will provide massive improvements, but web apps are still running in a browser and so will always remain sandboxed and limited in what they can achieve (no access to file system, serial ports, microphone, webcam, etc.).&lt;br /&gt;&lt;br /&gt;The main advantage of the browser app however, and its a massive one, is that its everwhere and supported by every device, so if HTML5 takes off, then it could become the defacto standard for developing apps of any kind, desktop or not. As Jeff Atwood discusses in his seminal blog post &lt;a href="http://www.codinghorror.com/blog/2009/08/all-programming-is-web-programming.html"&gt;All Programming is Web Programming&lt;/a&gt;; &lt;i&gt;"the web is the most efficient, most pervasive, most immediate distribution network for software ever created - its almost completely frictionless"&lt;/i&gt;. &amp;nbsp;As Atwood mentions, more and more users gravitate towards preferring to run their apps inside the browser, on smartphones and on tablets where things 'just work' and there's generally nowhere near as much friction caused by the traditional desktop software setup and update process.&lt;br /&gt;&lt;br /&gt;A third option available now is the cross platform mobile development SDK as detailed below (Mono, Appcelerator Titanium, Rhodes, PhoneGap, MoSync, Moai, Corona SDK and JUCE). Smartphone and tablet based applications are taking off, and these SDKs allow you to write once and run on any of these new class of devices, as well as in some cases also being able to run on the traditional desktop. These would seem to offer some of the 'power' of the desktop in terms of native code execution speed and access to hardware functionality, along with the enourmous 'frictionless' benefit that you get when publishing to an app store, where installing an app is literally a one click operation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mono-project.com/"&gt;Mono&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Native language&lt;/b&gt;: C#&lt;br /&gt;&lt;b&gt;Platforms&lt;/b&gt;: iOS, Android, Windows, Mac, Linux, Browser (e.g. via ASP.NET WebForms or MVC).&lt;br /&gt;&lt;b&gt;Cost:&lt;/b&gt; Windows, Mac &amp;amp; Linux: free. Android and iOS: from US$399 each. Free trial available.&lt;br /&gt;&lt;b&gt;License:&lt;/b&gt;&amp;nbsp;&lt;a href="http://www.mono-project.com/FAQ:_Licensing"&gt;LGPL/GPL/X11 combination&lt;/a&gt;.&amp;nbsp;Commercial license available.&lt;br /&gt;&lt;b&gt;Source&lt;/b&gt;: Mono for Windows/Mac/Linux is open source. Mono for iOS/Android is closed source.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-family: inherit;"&gt;The C# based Mono cross platform library allows apps to be built using purely C#. However this is not strictly a cross platform UI library, since each supported platform has its own different set of Mono C# UI libaries, each with their own capabilities. The idea is that you build your software using the MVC (Model View Controller) pattern, so that the Model and Controller components (both written in C#) can be shared across all platforms without any changes. Only the View component needs to be re-written for each platform (again, in C#). Mono targets both mobile and desktop apps, however if you are just looking at developing a desktop application, then Mono probably isn't a big improvement over GTK+ or Qt, after all a well written C++ Library (with a Model and Controller component for example) will enjoy the same capability to be shared across more than one platform if you use Qt or GTK+ and then you wouldn't need a different UI library on each platform to create your view. There are several advantages that Mono has over Qt or GTK+ however - firstly in leveraging a team's existing knowledge (and codebase) of C# which is a popular language. Secondly, being able to target iOS, Android and the browser. Lastly, via Mono's .NET CLR implementation (Common Language Runtime), code is compiled into modules of bytecode, which are binary compatible across all the supported platforms. &lt;br /&gt;&lt;br /&gt;There is also an open source library for Mono called &lt;a href="http://monogame.codeplex.com/"&gt;MonoGame&lt;/a&gt; which lets you port with minimal effort XNA based games (which originally target the .NET platform and run only on Windows Mobile, Windows and XBox) to any of the Mono platforms such as MacOS, Linux, iOS and Android.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.appcelerator.com/products/titanium-cross-platform-application-development/"&gt;Appcelerator Titanium&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Native language&lt;/b&gt;: JavaScript, Python and Ruby&lt;br /&gt;&lt;b&gt;Platforms&lt;/b&gt;: iOS, Android, Windows, Mac, Linux.&lt;br /&gt;&lt;b&gt;Cost:&lt;/b&gt; Community Edition is free. Indie Edition (extra APIs, help, support): US$499 per year.&lt;br /&gt;&lt;b&gt;License&lt;/b&gt;:&amp;nbsp;&lt;span style="font-family: inherit;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Apache_License" style="background-attachment: initial; background-clip: initial; background-color: #f9f9f9; background-image: none; background-origin: initial; color: #0b0080; line-height: 16px; text-align: left;" title="Apache License"&gt;Apache Public License v2&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Source: &lt;/b&gt;Open source&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-family: inherit;"&gt;An open-source solution which allows you to use web development languages (HTML, JavaScript, CSS, Python and Ruby) to build mobile and desktop apps. App data can be stored in the cloud or on the device, and apps can take full advantage of hardware, particularly camera and video camera capability. Appcelerator apps go through a complex compilation and optimization process which result in it creating apps that look, feel, and perform just like native apps, because you are using native UI components... so an iPhone app developed with Titanium will actually feel like an iPhone app. They also offer an &lt;a href="https://marketplace.appcelerator.com/"&gt;API repository marketplace&lt;/a&gt; to buy and sell code to extend Titanium. One of the downloadable components allows you to develop your app using an MVC (Model View Controller) pattern. There is an active &lt;a href="http://developer.appcelerator.com/questions/newest"&gt;developer community Q&amp;amp;A site for Titanium developers&lt;/a&gt; which is similar in usage to StackOverflow.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rhomobile.com/"&gt;Rhodes&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Native language&lt;/b&gt;: Ruby&lt;br /&gt;&lt;b&gt;Platforms&lt;/b&gt;: iOS, Android, Windows Mobile, Blackberry.&lt;br /&gt;&lt;b&gt;Cost:&lt;/b&gt; Free&lt;br /&gt;&lt;b&gt;License&lt;/b&gt;: &lt;a href="http://rhomobile.com/mitlicense/"&gt;MIT License&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Source&lt;/b&gt;: Open source&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-family: inherit;"&gt;Rhodes is an open source, Ruby-based framework that allows the development of native apps for a wide range of smartphone devices and operating systems. The framework lets you write your code once and use it to quickly build apps for every major smartphone. Apps can take full advantage of available hardware, including GPS and camera, as well as location data. Rhodes enforces a strict MVC (Model View Controller) pattern on your apps. Views are written in HTML5 while Controllers and Models are written in Ruby.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Native language&lt;/b&gt;: HTML5/JavaScript&lt;br /&gt;&lt;b&gt;Platforms&lt;/b&gt;: iOS, Android, Windows Mobile, Blackberry, Symbian, Palm.&lt;br /&gt;&lt;b&gt;Cost:&lt;/b&gt;&amp;nbsp;Free &lt;br /&gt;&lt;b&gt;License&lt;/b&gt;: &lt;a href="http://phonegap.com/about/license/"&gt;Apache License, Version 2.0&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Source&lt;/b&gt;: Open source&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-family: inherit;"&gt;PhoneGap is an open source framework that helps you develop apps for smartphones using web development languages such as JavaScript and HTML5. It also allows for access to hardware features including GPS/location data, accelerometer, camera, sound and more. PhoneGap lets you take a web app, run it in a UIWebView, and through javascript you can access iPhone features such as the camera an accelerometer. This means that it won't necessarily have the look and feel of a native app (like the other cross platform SDKs listed here). The idea is that you develop your web app like you normally do, and then use PhoneGap to 'bridge the gap' to the phone, and give you access to phone's hardware, that traditionally you couldn't access from a web-only app.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mosync.com/"&gt;MoSync&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Native language&lt;/b&gt;: C++&lt;br /&gt;&lt;b&gt;Platforms&lt;/b&gt;: iOS, Android, Windows Mobile, Blackberry, Symbian.&lt;br /&gt;&lt;b&gt;Cost:&lt;/b&gt; Free for Indie developers. From €199 (Euros) per year for Enterprise developers.&lt;br /&gt;&lt;b&gt;License&lt;/b&gt;: &lt;a href="http://www.mosync.com/mosync-dual-licence-model"&gt;GPL v2&lt;/a&gt;. Commercial license available.&lt;br /&gt;&lt;b&gt;Source&lt;/b&gt;: Open source &lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-family: inherit;"&gt;The MoSync Mobile SDK is a cross-platform mobile application development SDK which allows the development of native apps. Free open-source, it is based on C++ but allows development also in HTML5 and JavaScript. MoSync provides access to a wide range of underlying device functionality, via a C++ SDK or optionally via JavaScript. &amp;nbsp;It requires probably a greater degree of software skill from the developer, but in principle can enable a rich variety of different kinds of application.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://getmoai.com/"&gt;Moai&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Native language&lt;/b&gt;: Lua&lt;br /&gt;&lt;b&gt;Platforms&lt;/b&gt;: iOS, Android, Chrome Web Store, Windows, Mac, Linux.&lt;br /&gt;&lt;b&gt;Cost:&lt;/b&gt; Free&lt;br /&gt;&lt;b&gt;License:&lt;/b&gt;&amp;nbsp;&lt;a href="http://www.opensource.org/licenses/cpal_1.0"&gt;Common Public Attribution License Version 1.0 (CPAL)&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Source&lt;/b&gt;: Open source &lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75; font-family: inherit;"&gt;Although intended to be a mobile game development SDK, I think it deserves a mention here due to its unique scripted approach to cross platform development. Games developed with Moai run on iOS and Android as well as the Chrome Web Store, Windows, Mac and Linux. Designed to be programmed with the Lua scripting language, Moai is designed for experienced game developers who wish to use Lua for mobile development. The Moai framework itself is written in C++ and is intended to be called from the Lua scripting language, but can also be called from any other language supported by the host platform.&amp;nbsp;&lt;span style="background-color: white; line-height: 19px;"&gt;The Lua script is run as interpreted byte code, but since very few Lua instructions are processed among all the input handling, this means that rendering, animation, collision detection, and physics math runs natively&lt;/span&gt;. Moai's physics engine for example is the &lt;a href="http://box2d.org/about/"&gt;Box2D&lt;/a&gt; open source C++ library. Moai is free and open source, however to build apps for iOS devices you'll need the iOS SDK and the Xcode IDE (presumably running on MacOS) and be a member of the Apple iOS developer program (US$99/year). To build apps for Android you'll need the Android SDK, the Eclipse IDE and an Android device.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.anscamobile.com/"&gt;Corona SDK&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Native language&lt;/b&gt;: Lua&lt;br /&gt;&lt;b&gt;Platforms&lt;/b&gt;: iOS, Android, Kindle Fire, Nook Color.&lt;br /&gt;&lt;b&gt;Cost:&lt;/b&gt; US$199/year for Android. US$199/year for iOS. $349/year for all platforms. Free trial available.&lt;br /&gt;&lt;b&gt;License&lt;/b&gt;: Commercial, price as above.&lt;br /&gt;&lt;b&gt;Source&lt;/b&gt;: Closed source &lt;br /&gt;&lt;br /&gt;&lt;span style="color: #351c75;"&gt;A similar toolkit to Moai in that its primarily aimed at game developers, and apps are written with the Lua scripting language. Corona SDK was developed by two former Adobe mobile engineers and has been in development since 2007. It features a p&lt;span style="font-family: inherit;"&gt;&lt;span style="background-color: white; line-height: 19px;"&gt;roprietary&amp;nbsp;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/OpenGL-ES"&gt;OpenGL-ES&lt;/a&gt;&lt;span style="background-color: white; line-height: 19px;"&gt;&amp;nbsp;rendering engine, which allows for full hardware acceleration of graphics, including sprites that animate at full&amp;nbsp;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/GPU"&gt;GPU&lt;/a&gt;&lt;span style="background-color: white; line-height: 19px;"&gt;&amp;nbsp;speed. The Corona physics engine is built around &lt;a href="http://box2d.org/about/"&gt;Box2D&lt;/a&gt; as with Moai. Its free to try Corona and run your apps in a simulator on your desktop computer, but to build an app and publish it to an App Store, you'll need to pay a yearly subscription fee (of either US$199 per year for Android or iOS or the premium subscription of US$349 for all platforms). Your apps are built "in the cloud" on Corona's server. Note that if you are developing for iOS you'll still need to pay the yearly Apple iOS developer program fee which is currently US$99. There seems to be extensive &lt;a href="http://developer.anscamobile.com/resources/docs"&gt;documentation&lt;/a&gt; available for Corona and an active &lt;a href="http://developer.anscamobile.com/forum/"&gt;developer community forum&lt;/a&gt;. There has been a recent push to promote Corona for use not only for developing games but also for &lt;a href="http://www.anscamobile.com/corona/apps/"&gt;general apps&lt;/a&gt; and also &lt;a href="http://www.anscamobile.com/corona/ebooks/"&gt;interactive ebooks&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rawmaterialsoftware.com/juce.php"&gt;JUCE&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Native language&lt;/b&gt;: C++&lt;br /&gt;&lt;b&gt;Platforms&lt;/b&gt;: Windows, MacOS, Linux, iOS, Android (Note that Android support is a work in progress).&lt;br /&gt;&lt;b&gt;Cost:&lt;/b&gt;&amp;nbsp;Free for GPL license. Commercial license from&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&lt;span style="background-color: white;"&gt;£399 (UK pounds) per product.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;License&lt;/b&gt;: &lt;a href="http://www.rawmaterialsoftware.com/jucelicense.php"&gt;GPL. Commercial license available.&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Source&lt;/b&gt;: Open source&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: white; margin-bottom: 1.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span style="color: #351c75;"&gt;&lt;span style="font-family: inherit; line-height: 1.3em;"&gt;JUCE is an all-encompassing C++ class library for developing cross-platform software.&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 1.3em;"&gt;&lt;span style="font-family: inherit;"&gt;Its designed to contain everything you're likely to need to create most applications, and is particularly well-suited for building highly-customised GUIs, and for handling graphics and sound. JUCE is developed by Raw Material Software and consists of a small team of &lt;span style="font-family: inherit;"&gt;developers based in London, England, founded by Julian Storer in 1999, who is still the primary developer today. It would probably be best suited to experienced C++ developers. Julian Storer himself is a professional C++ coder with over 15 years of C++ experience; he takes pride in the fact the source for JUCE is literate, coherent, cross-platform and high quality.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: transparent; line-height: 20px;"&gt;Adding JUCE to your C++ application is very simple - the easiest way involves simply including juce.h in your files and adding a single .cpp file to your project. No need to compile any libraries or worry about dependencies.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/7335685054357615132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2012/01/modern-cross-platform-development.html#comment-form' title='34 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/7335685054357615132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/7335685054357615132'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2012/01/modern-cross-platform-development.html' title='Modern Cross Platform Development'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-2138810700867654137</id><published>2011-11-27T02:44:00.000-08:00</published><updated>2011-12-13T19:21:19.299-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>"Yoda Conditions", "Pokémon Exception Handling" and other programming classics</title><content type='html'>Just reading through some of the excellent answers to this &lt;a href="http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined"&gt;question &lt;/a&gt;posed on &lt;a href="http://stackoverflow.com/"&gt;StackOverflow.com&lt;/a&gt; by &lt;a href="http://stackoverflow.com/users/179972/john-k"&gt;John K&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;What programming terms have you coined that have taken off in your own circles (i.e. have heard others repeat it)? It might be within your own team, workplace or garnered greater popularity on the Internet.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Reposting some of the best ones below ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-M61Y-VuCCSM/TtIQMTYPNrI/AAAAAAAAAGM/YtTOGRknF1s/s1600/yoda-conditions.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="116" src="http://2.bp.blogspot.com/-M61Y-VuCCSM/TtIQMTYPNrI/AAAAAAAAAGM/YtTOGRknF1s/s320/yoda-conditions.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Yoda Conditions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Using if(constant == variable) instead of if(variable == constant), like if(4 == foo).&lt;br /&gt;&lt;br /&gt;Because it's like saying "if blue is the sky" or "if tall is the man".&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/251153/zneak"&gt;[zneak]&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Originally, yoda conditions might have been introduced to reduce the potential of coding errors in the form &lt;b&gt;if (5 = count)&lt;/b&gt; which would be picked up at compile time.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-dkywl8jyDsE/TtIRTqSZBhI/AAAAAAAAAG0/ejKitc2c3eY/s1600/pokemon-exception-handling.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232" src="http://1.bp.blogspot.com/-dkywl8jyDsE/TtIRTqSZBhI/AAAAAAAAAG0/ejKitc2c3eY/s320/pokemon-exception-handling.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Pokémon Exception Handling&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For when you just Gotta Catch 'Em All.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp; &amp;nbsp; // do something&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;catch&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp; &amp;nbsp; // catch em all&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;}&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/205426/woot4moo"&gt;[woot4moo]&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-w3QG1xDtQWM/TtIQcSMhL-I/AAAAAAAAAGc/IsOoCDIuhFg/s1600/egyptian-brackets.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-w3QG1xDtQWM/TtIQcSMhL-I/AAAAAAAAAGc/IsOoCDIuhFg/s320/egyptian-brackets.jpg" width="272" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Egyptian brackets&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The style of brackets where the opening brace goes on the end of the current line ...&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;if (a == b) {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;&amp;nbsp; &amp;nbsp; printf("hello");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New',Courier,monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This style of brackets is used in Kernighan and Ritchie's book The C Programming Language, so it's known by many as K&amp;amp;R style.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/215403/computronium"&gt;[computronium]&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Refer to the Wikipedia entry on &lt;a href="http://en.wikipedia.org/wiki/Indent_style"&gt;Indent style&lt;/a&gt; for further reading, including 1TBS (The One True Brace Style), Allman style (also known as ANSI style) and Whitesmiths style.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Different kinds of bug reports&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Smug Report&lt;/b&gt; - a bug submitted by a user who thinks he knows a lot more about the system's design than he really does. Filled with irrelevant technical details and one or more suggestions (always wrong) about what he thinks is causing the problem and how we should fix it. &lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/38360/aaronaught"&gt;[aaronaught]&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Drug Report&lt;/b&gt; - a report so utterly incomprehensible that whoever submitted it must have been smoking crack. The lesser version is a chug report, where the submitter is thought to have had one too many. &lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/38360/aaronaught"&gt;[aaronaught]&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Shrug Report&lt;/b&gt; - a bug report with no error message or repro steps and only a vague description of the problem. Usually contains the phrase "doesn't work." &lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/38360/aaronaught"&gt;[aaronaught]&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fermat's Last Post&lt;/b&gt; - a post to a bug tracker/email list/forum in which the author claims to  have found a simple fix or workaround for a bug, but never says what it  is and never shows up again to explain it (even after others have been  puzzling over the bug for years). &lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://www.blogger.com/profile/06989545937343493984"&gt;[alan moore]&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Floater &lt;/b&gt;- the case in a bug tracking system where a bug report remains "floating" at the top of the queue, but never gets assigned to a developer, maybe because there is a workaround in place.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Refuctoring&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The process of taking a well-designed piece of code and, through a series of small, reversible changes, making it completely unmaintainable by anyone except yourself.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/21849/dan-vinton"&gt;[dan-vinton]&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;A play on the term &lt;a href="http://refactoring.com/"&gt;Refactoring&lt;/a&gt; which was popularized by Martin Fowler in his book of the same name.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Stringly Typed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;An implementation that needlessly relies on strings when programmer and refactor friendly options are available. For example, method parameters that take strings when other more appropriate types should be used. Excessively stringly typed code is usually a pain to understand and detonates at runtime with errors that the compiler would normally find.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/83891/mark-simpson"&gt;[mark-simpson]&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;A play on the term &lt;a href="http://en.wikipedia.org/wiki/Strong_typing"&gt;Strongly Typed&lt;/a&gt;, code which restricts the mixing of different or incompatible data types, allowing errors be picked up at compile time.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Different kinds of bugs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Heisenbug&amp;nbsp;&lt;/b&gt;- a bug that disappears or alters its characteristics when an attempt is made to study it.&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/71131/jacob"&gt;[jacob]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Higgs-Bugson&lt;/b&gt; - a&amp;nbsp;hypothetical bug predicted to exist based on a small number of possibly related event log entries and vague anecdotal reports from users, but it is difficult (if not impossible) to reproduce on a dev machine because you don't really know if it's there, and if it is there what is causing it. To find these you will need to invest in a Large Hadron debugger. &lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/231999/runrunraygun"&gt;[runrunraygun]&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-urlJJk7s74A/TudRbjRt7AI/AAAAAAAAAHM/Og3QqWk4D70/s1600/large_hadron_debugger_higgs_bugson_yoda_condition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://3.bp.blogspot.com/-urlJJk7s74A/TudRbjRt7AI/AAAAAAAAAHM/Og3QqWk4D70/s320/large_hadron_debugger_higgs_bugson_yoda_condition.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Hindenbug &lt;/b&gt;- a&amp;nbsp;catastrophic data destroying bug - "Oh the humanity!".&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/43687/mike-robinson"&gt;[mike-robinson]&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Counterbug &lt;/b&gt;- a&amp;nbsp;bug you present when presented with a bug caused by the person presenting the bug.&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/43687/mike-robinson"&gt;[mike-robinson]&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bloombug &lt;/b&gt;- a&amp;nbsp;bug that accidentally generates money.&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/43687/mike-robinson"&gt;[mike-robinson]&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Schrödinbug &lt;/b&gt;- refers to a function/feature that appears to fluctuate between buggy and correct (like Schrödinger's cat, fluctuating between alive and dead), until somebody looks at the source code (opens the box), at which point it becomes permanently bugged.&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/38360/aaronaught"&gt;[aaronaught]&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Loch Ness Monster Bug&lt;/b&gt; - a&amp;nbsp;bug which cannot be reproduced or has only been sighted by one person.&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/109102/russau"&gt;[russau]&lt;/a&gt; &lt;span style="font-size: small;"&gt;(Also, &lt;i&gt;&lt;b&gt;Bugfoot &lt;/b&gt;&lt;/i&gt;is a great alternative).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;UFO bug&lt;/b&gt; - a bug presented by customers, who, even when they're shown that  it doesn't exist, will repeatedly report it again and again,  believing it is real. &lt;span style="font-size: x-small;"&gt;by &lt;a href="http://www.blogger.com/profile/03720419227421545248"&gt;[Tuqui]&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mandelbug&lt;/b&gt; - a bug whose causes are so complex that its behavior appears chaotic or even non-deterministic. Named after fractal innovator Benoît Mandelbrot. &lt;span style="font-size: x-small;"&gt;by &lt;a href="http://www.blogger.com/profile/06946785185446049050"&gt;[coehlo] &lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Brown-paper-bag bug&lt;/b&gt; - a bug in a public software release that is so embarrassing that the    author notionally wears a brown paper bag over his head for a while. &lt;span style="font-size: x-small;"&gt;by&lt;/span&gt; &lt;span style="font-size: x-small;"&gt;&lt;a href="http://catb.org/jargon/html/B/brown-paper-bag-bug.html"&gt;[ESR via Jargon File]&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sorcerer's apprentice mode&lt;/b&gt; &lt;b&gt;bug&lt;/b&gt; - a bug in a protocol where, under some    circumstances, the receipt of a message causes multiple messages to be    sent, each of which, when received, triggers the same bug. &lt;span style="font-size: x-small;"&gt;by&lt;/span&gt; &lt;span style="font-size: x-small;"&gt;&lt;a href="http://www.catb.org/jargon/html/S/sorcerers-apprentice-mode.html"&gt;[ESR via Jargon File]&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Mad girlfriend bug&lt;/b&gt; - a bug whose immediate effect remains hidden - the app outwardly seems to function normally and tells you that everything is fine. &lt;span style="font-size: x-small;"&gt;by &lt;a href="http://stackoverflow.com/users/33560/jeduan-cornejo"&gt;[jeduan-cornejo]&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Excalibur bug &lt;/b&gt;- when all of the developers within a company have tried to fix a particular bug but none &lt;strike&gt;are worthy&lt;/strike&gt; have succeeded, so far.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Load-bearing printf&lt;/b&gt; &lt;b&gt;bug&lt;/b&gt; - when a line of debug output is required for the code to  work - the code does not function if you remove it. &lt;span style="font-size: x-small;"&gt;by &lt;a href="http://www.blogger.com/profile/16276494911859983478"&gt;[Ken]&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-oPGnuNG3we8/TtIQdy_gWxI/AAAAAAAAAGk/D04COII0QGk/s1600/loch-ness-monster-bug.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://4.bp.blogspot.com/-oPGnuNG3we8/TtIQdy_gWxI/AAAAAAAAAGk/D04COII0QGk/s200/loch-ness-monster-bug.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Doctype Decoration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When web designers add a doctype declaration but don't bother to write valid markup.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/23666/zurahn"&gt;[zurahn]&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;New software features&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A Unicorny&lt;/b&gt; - A feature that's so early in the planning stages that it might as well be imaginary.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A Barack Obama&lt;/b&gt; - A feature we'd really like to add to a project but will probably never get approval for.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/179125/jordan"&gt;[jordan]&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-LiaCumm4kHQ/TtIQOZuVBNI/AAAAAAAAAGU/And_DNBTzaw/s1600/baklava-code.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-LiaCumm4kHQ/TtIQOZuVBNI/AAAAAAAAAGU/And_DNBTzaw/s1600/baklava-code.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Different types of Code&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt; &lt;br /&gt;&amp;nbsp;Spaghetti Code&lt;/b&gt;&amp;nbsp;- Code that's got one too many GOTOs, exceptions, threads, or other "unstructured" branching constructs. Program flow tends to look like a bowl of spaghetti - twisted and tangled.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Spaghetti with Meatballs Code&lt;/b&gt;&amp;nbsp;- An attempt at object-oriented code, but where the end result still remains dependent on some messy procedural (spaghetti) code.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Baklava Code&lt;/b&gt;&amp;nbsp;- Code with too many layers. Also known as&amp;nbsp;&lt;b&gt;&lt;i&gt;Lasagne Code&lt;/i&gt;&lt;/b&gt;.&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;/span&gt;&lt;a href="http://stackoverflow.com/users/25188/john-d-cook" style="font-size: small;"&gt;[john-d-cook]&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Ravioli Code&lt;/b&gt;&amp;nbsp;- Object-oriented code consisting of a number of small and loosely-coupled software components.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Sausage Code&lt;/b&gt;&amp;nbsp;- Once you've examined the code in detail ("how it's made") you'll never want to use it again.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Jenga Code&lt;/b&gt;&amp;nbsp;- The whole thing collapses when you alter a block of code. Also known as&amp;nbsp;&lt;b&gt;&lt;i&gt;Crispy Noodle Code&lt;/i&gt;&lt;/b&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Hydra Code&lt;/b&gt;&amp;nbsp;- Code that cannot be fixed. One fix causes two new bugs. It should be rewritten.&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;/span&gt;&lt;a href="http://stackoverflow.com/users/108130/nick-dandoulakis" style="font-size: small;"&gt;[nick-dandoulakis]&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Scar Tissue Code&lt;/b&gt;&amp;nbsp;- Any code that is commented out but still included in the current and/or checked-in version.&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;/span&gt;&lt;a href="http://stackoverflow.com/users/135078/kelly-french" style="font-size: small;"&gt;[kelly-french]&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Hooker Code&lt;/b&gt;&amp;nbsp;- Code that is problematic and causes application instability (i.e. the application "goes down" often).&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Pig's Lipstick Code&lt;/b&gt;&amp;nbsp;- Code which has large amount of legacy and/or spaghetti code hidden via wrapper objects, so while it appears to new developers to be well designed, elegant, object-oriented code, when they start working on it in depth they realize just how ugly it really is.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Mortgage Code&lt;/b&gt;&amp;nbsp;- Code purposely so terrible and complicated that only you can maintain it, forcing your employer to keep you, thus providing job security (so you can pay your mortgage).&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Ghetto Code&lt;/b&gt;&amp;nbsp;- A particularly inelegant and obviously suboptimal section of code that still meets the original requirements.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Swiss Army Code&lt;/b&gt;&amp;nbsp;- Application code that is suffering from feature creep - it does a lot of things, but it does nothing well.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;NP Tricky Code&lt;/b&gt;&amp;nbsp;- An algorithm whose complexity is too hard for a mere mortal to figure out.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;NP Hilarious Code&lt;/b&gt;&amp;nbsp;- An algorithm whose complexity is "a joke", literally (as in BogoSort) or metaphorically.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Cut-and-waste Code&lt;/b&gt;&amp;nbsp;- When someone cut and pasted code they found online (usually from a blog) into a production product; the result is usually a lot of wasted time trying to track down an obscure bug from code that undoubtedly made sense in the original context but not in our app. Also known as&amp;nbsp;&lt;b&gt;&lt;i&gt;BDD - Blog Driven Development&lt;/i&gt;&lt;/b&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Neighborhood Bike Code&lt;/b&gt;&amp;nbsp;- A module or a piece of code that every programmer at the company has touched.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Eraser Stains Code&lt;/b&gt;&amp;nbsp;- Code that has been written, then re-factored multiple times leaving swaths of legacy code and design. Like erasing a sheet of paper so many times, the pencil marks are no longer the problem - the large greasy stain is.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Objectfuscated Code&lt;/b&gt;&amp;nbsp;- Object-oriented code which has been abstracted to so many levels that no-one can understand it anymore.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Barnacle Code&lt;/b&gt; - Any piece of code (usually a static method) which has been appended to a class where it doesn't really belong, due to a lack of anywhere else to logically put it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Autopilot Code&lt;/b&gt; - Code that was written by a programmer who was on 'auto-pilot' or wasn't really thinking about what they were doing.&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-eHbGdg8HUDQ/TtIQh90CZNI/AAAAAAAAAGs/SgItRMQ92dM/s1600/hydra-code.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="219" src="http://2.bp.blogspot.com/-eHbGdg8HUDQ/TtIQh90CZNI/AAAAAAAAAGs/SgItRMQ92dM/s320/hydra-code.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Fear Driven Development&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When project management adds more pressure (fires someone or something).&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/82062/arnis-l"&gt;[arnis-l]&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Protoduction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A prototype that ends up in production.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/7264/chris-pebble"&gt;[chris-pebble]&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-6_myshiocX0/TtIT3XI-UiI/AAAAAAAAAG8/-qv4wm468AM/s1600/ninja.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-6_myshiocX0/TtIT3XI-UiI/AAAAAAAAAG8/-qv4wm468AM/s200/ninja.jpg" width="185" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Ninja Comments&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Also known as invisible comments, secret comments, or no comments.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/48928/schar"&gt;[schar]&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Smurf Naming Convention&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When almost every class has the same prefix.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;by&amp;nbsp;&lt;a href="http://stackoverflow.com/users/13753/sal"&gt;[sal]&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;Thanks again to the above answerers from the original &lt;a href="http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined"&gt;StackOverflow question&lt;/a&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/251153/zneak"&gt;[zneak]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/205426/woot4moo"&gt;[woot4moo]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/215403/computronium"&gt;[computronium]&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;a href="http://stackoverflow.com/users/38360/aaronaught"&gt;[aaronaught]&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/21849/dan-vinton"&gt;[dan-vinton]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/83891/mark-simpson"&gt;[mark-simpson]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/71131/jacob"&gt;[jacob]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/231999/runrunraygun"&gt;[runrunraygun]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/43687/mike-robinson"&gt;[mike-robinson]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/109102/russau"&gt;[russau]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/23666/zurahn"&gt;[zurahn]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/179125/jordan"&gt;[jordan]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/25188/john-d-cook"&gt;[john-d-cook]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/82062/arnis-l"&gt;[arnis-l]&lt;/a&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/108130/nick-dandoulakis"&gt;[nick-dandoulakis]&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;a href="http://stackoverflow.com/users/7264/chris-pebble"&gt;[chris-pebble]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;a href="http://stackoverflow.com/users/48928/schar"&gt;[schar]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;a href="http://stackoverflow.com/users/13753/sal"&gt;[sal]&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://stackoverflow.com/users/13753/sal"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://stackoverflow.com/users/135078/kelly-french"&gt;[kelly-french]&lt;/a&gt;&lt;/span&gt;&lt;a href="http://stackoverflow.com/users/13753/sal"&gt;&lt;/a&gt;&lt;a href="http://stackoverflow.com/users/135078/kelly-french"&gt;&lt;/a&gt;&lt;a href="http://stackoverflow.com/users/33560/jeduan-cornejo"&gt;[jeduan-cornejo]&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;And to the original poster of the question:&lt;/b&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href="http://stackoverflow.com/users/179972/john-k"&gt;John K&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span style="font-size: small;"&gt;If you have any good suggestions, please add some comments below and I'll update the post.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/2138810700867654137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html#comment-form' title='97 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/2138810700867654137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/2138810700867654137'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html' title='&quot;Yoda Conditions&quot;, &quot;Pokémon Exception Handling&quot; and other programming classics'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-M61Y-VuCCSM/TtIQMTYPNrI/AAAAAAAAAGM/YtTOGRknF1s/s72-c/yoda-conditions.jpg' height='72' width='72'/><thr:total>97</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-6427188096839815380</id><published>2011-11-12T19:37:00.000-08:00</published><updated>2011-11-13T04:16:54.258-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='salaries'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='career'/><title type='text'>Why do Programmers get paid less than PMs and BAs</title><content type='html'>I came across this interesting &lt;a href="http://programmers.stackexchange.com/questions/45776/why-do-business-analysts-and-project-managers-get-higher-salaries-than-programme"&gt;question &lt;/a&gt;over&amp;nbsp;at&amp;nbsp;&lt;a href="http://programmers.stackexchange.com/"&gt;programmers.stackexchange.com&lt;/a&gt;&amp;nbsp;which asked: &lt;i&gt;Given that programming is generally more difficult, why do business analysts and project managers get higher salary than programmers? What is it that makes their job a high paying job when even at most times programmers are the ones that go home late?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;There were a few great answers, but only one stands out as the truth, and that is the one which is coming from an economic rationalist's viewpoint ...&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;People get paid less than their employers' "reservation price" (the most they would ever pay), and more than their "marginal product" (the least they would ever work for). Your actual pay on that spectrum is based on your bargaining power, relative to your employer.&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;Say your services to your company are worth $1000 a day. Under the gun, he would pay you that if he had no other choice. Say you would work for $100 a day if you had no other options. That's your range.&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;Say you're new and independent and unknown, and your boss is Google. Google has more bargaining power, because they can just wait and hire someone else, and lots of people want to work for them. You have less power, because you have to pay rent, so you'll get closer to $100 than $1000 a day.&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;Say you're the last COBOL programmer on Earth, and your boss's mainframe runs COBOL. Then you have more bargaining power, and will get closer to $1000 a day.&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;SO, either PM/BAs are worth more to the company, OR they have higher bargaining power. I don't think it's the first option, so must be the latter. Good people skills are rare. It's also hard to outsource them, as they have to meet clients. Their relative scarcity gives them more bargaining power, and thus higher pay.&lt;/blockquote&gt;This is a great answer by &lt;a href="http://programmers.stackexchange.com/users/10190/nrm"&gt;NRM&lt;/a&gt;&amp;nbsp;and although slightly boring compared to the other answers which touch on the political side of things, it definitely has the ring of truth to it. As he mentions, good people skills are rare, and provide a huge benefit in any job, especially in the field of software development.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/6427188096839815380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2011/11/why-do-programmers-get-paid-less-than.html#comment-form' title='41 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6427188096839815380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/6427188096839815380'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2011/11/why-do-programmers-get-paid-less-than.html' title='Why do Programmers get paid less than PMs and BAs'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>41</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-1396212610721335788</id><published>2011-11-05T23:15:00.000-07:00</published><updated>2011-11-05T23:25:09.403-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stackoverflow'/><category scheme='http://www.blogger.com/atom/ns#' term='tiobe'/><category scheme='http://www.blogger.com/atom/ns#' term='programming-language-popularity'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>StackOverflow's Programming Language Bias</title><content type='html'>Using &lt;a href="http://stackoverflow.com/"&gt;StackOverflow.com&lt;/a&gt;, I've always had the impression that its biased towards C#, and .NET in general. That might have been because on the SO tags page C# is number one, with the most questions tagged, or maybe because much of the site itself is built with C# and MVC.NET. So I thought it would be interesting to compare the rankings of the tag popularity on StackOverflow with a leading language popularity index (the &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;TIOBE index&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Method&lt;/span&gt;&lt;br /&gt;The "Stack Overflow Representation" represents a ratio of the SO tag count (as a percent of total questions) divided by the TIOBE language index percent. Where a representation of 100% means that the SO tag count is aligned exactly with the TIOBE language index. An "over-representation", greater than 100%, might mean there's a greater number of questions on SO than we'd expect. An "under-representation", lower than 100%, might mean there's not as many questions on SO than we'd expect.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Results&lt;/span&gt;&lt;br /&gt;Suprisingly, JavaScript came out to be the most "over-represented" language on SO, by quite a long way at 294%. Could this also be because programming JavaScript is generally quite difficult and will result in people seeking help more often? Following this was C# (which I had expected to be number 1), at 153%. After this, PHP, Ruby and Python were basically fairly balanced at around 100%. The most "under-represented" major language would definitely be C at 11%. Three other major languages which seemed to be a bit under-represented, below 50%, were C++, Java and Objective-C.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-DqKcWmBGjU8/TrYkd42YsjI/AAAAAAAAAF8/7KqQoKMoKI8/s1600/SO-representation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-DqKcWmBGjU8/TrYkd42YsjI/AAAAAAAAAF8/7KqQoKMoKI8/s1600/SO-representation.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-NmqxeHgSOcU/TrYktXtzg6I/AAAAAAAAAGE/l3jJmE4DVpQ/s1600/SO-tag-count-vs-TIOBE-popularity.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-NmqxeHgSOcU/TrYktXtzg6I/AAAAAAAAAGE/l3jJmE4DVpQ/s1600/SO-tag-count-vs-TIOBE-popularity.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Data Sources:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Stack Overflow data taken from: &lt;a href="http://stackoverflow.com/tags"&gt;StackOverflow.com/tags&lt;/a&gt; - data snapshot taken at 2:50am UTC, 6-Nov-2011. Total tag count was 2,254,639.&lt;/li&gt;&lt;li&gt;TIOBE data taken from: latest available (October 2011) at &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;www.tiobe.com/index.php/content/paperinfo/tpci/index.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://twitter.com/dodgy_coder"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default"&gt;Subscribe to posts via RSS&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/1396212610721335788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2011/11/stackoverflows-programming-language.html#comment-form' title='38 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/1396212610721335788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/1396212610721335788'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2011/11/stackoverflows-programming-language.html' title='StackOverflow&apos;s Programming Language Bias'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-DqKcWmBGjU8/TrYkd42YsjI/AAAAAAAAAF8/7KqQoKMoKI8/s72-c/SO-representation.png' height='72' width='72'/><thr:total>38</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5060551251465839575.post-2656252578333577445</id><published>2011-10-01T00:58:00.000-07:00</published><updated>2011-10-01T20:42:52.759-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='self-improvement'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='code-craft'/><title type='text'>How to Become a Better Programmer</title><content type='html'>Here then, in no particular order, are twelve positive things that you can do, at any point in your career, to improve your programming skills. These will also have the added benefit of injecting additional passion into your programming ...&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;1. Never Stop Learning and Reading&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Consciously try to improve yourself and the quality of code you write. Think about what you're doing, why you're doing it, and how you can do it better. &amp;nbsp;Look back at what you've done on previous projects, and how you might do it differently now, or where you could still improve on it.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Read books, not just websites.&lt;/li&gt;&lt;li&gt;Read for self-improvement, not just for the latest project.&lt;/li&gt;&lt;li&gt;Read about improving your trade, not just about the latest technology.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;2. Work With People Smarter Than Yourself&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Working with smarter and/or more experienced developers will teach you a great deal. You can learn a lot by reading their code, watching their practices and listening to their opinions and stories. Also, you should always listen to what others have to say, regardless of whether they're junior, intermediate, senior or guru-level developers.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;3. Become a Polymath (or 'Jack-of-all-Trades')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Decide to be a 'Jack-of-all-Trades' - also known as a Polymath, Polyglot, Generalist, Renaissance Man or Multi-specialist. This will allow you to &lt;b&gt;&lt;u&gt;avoid&lt;/u&gt;&lt;/b&gt; becoming 'pigeon-holed' into one specialty, which can stagnate your programming skills, as well as hurt your future employment prospects if your 'specialty' suddenly becomes yesterday's technology. Something to keep in mind is 'the half-life of knowledge' law of technology; it tracks with Moore's Law: half of everything you know will be obsolete in 18-24 months. An expert who chooses the wrong discipline can easily be undermined by the press of technology; a generalist only has to add some more skills and remember the lessons of the past in applying those skills.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;4. Read and Document Other People's Code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Read and attempt to understand code written by others. Plus, write documentation for code written by other people. Writing code is significantly easier than reading someone else's code and figuring out what it does. You can see how they do something - maybe they do it in a better way than you. And sometimes this can be one of the best ways to learn how not to do something.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;5. Get Programming Experience on a &lt;u&gt;Real&lt;/u&gt; Project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is nothing like getting in and coding, especially under pressure - work on a real project, with real fickle customers, with real, ever-changing requirements and with real engineering problems.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;6. Teach Others About Programming&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Take a part-time job tutoring computer science students at a local university or college. This will force you to understand something at a completely different level, &amp;nbsp;since you have to explain it to someone else. As Douglas Adams wrote, "the best way is to try and explain it to someone else. That forces you to sort it out in your mind. And the more slow and dim-witted your pupil, the more you have to break things down into more and more simple ideas."&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;7. Learn One New Programming Language Every Year&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One year gives you enough time to get past the basics - it pushes you towards understanding what's beneficial in that language, and to be able to program in a style native to that language. Each language will change the way you think about programming, and how they do things, to compare that to what you already know.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;8. Complete One New Pet Project Every Year&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Start a "pet" project and follow it to completion and delivery. A good pet project will push your boundaries and keep you interested; it may be something you have experience with and enjoy plus something you don't know about. E.g. if you know something about game development but don't know Ruby, a good pet project may be to develop a game written in Ruby.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;9. Learn Assembly Language&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Learning a low level language like assembly gives you insight into the way computers 'think' without any high-level abstractions; the elegance at this level is surprising. There are no wasted motions, no disposing of data, and bugs can have a far greater impact. Developing at this level will teach you efficiency and hone your critical thinking and logic skills.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;10. See Your Application From the End User's Perspective&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step out of the echo chamber and improve your understanding of the end-user aspect of software development. Interact with the end-user to see, through their eyes, how they use your software. End users are typically not technical, and they often see software as a magical piece of work, while you see software as a logical set of steps. The two worlds are completely different - what seems easy and logical to you may seem cryptic and inscrutable to others. &amp;nbsp;You can also find out what kind of 'abhorrent' information they throw at your application. This will help you generate good test cases and stop assuming your program will always be fed the correct set of data.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;11. Start a Physical Exercise Program&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You work a whole lot better when you're in good physical shape - problems become easier and less overwhelming, wasting time is much less of a temptation, you can think clearer, and working through things step by step doesn't seem an arduous task. An old one but here it is: "Sound body, sound mind.". Regularly devote a bit of time to physical exercise - riding a bike, walking, running, swimming, whatever suits you best.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;12. Learn Touch Typing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Typing for a programmer is essential. Everyone has had a coworker who typed using just two fingers and had to look at the keyboard for everything before pecking out their code one letter at a time! Learning to touch type is a quick and effective way to give your productivity a boost as a programmer.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/dodgy_coder"&gt;Follow @dodgy_coder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dodgycoder.net/feeds/posts/default"&gt;Subscribe to posts via RSS&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dodgycoder.net/feeds/2656252578333577445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.dodgycoder.net/2011/10/how-to-become-better-programmer.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/2656252578333577445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5060551251465839575/posts/default/2656252578333577445'/><link rel='alternate' type='text/html' href='http://www.dodgycoder.net/2011/10/how-to-become-better-programmer.html' title='How to Become a Better Programmer'/><author><name>Dodgy_Coder</name><uri>http://www.blogger.com/profile/14418022725678218844</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-6zlfPzzPxUU/TjPPH9QhGOI/AAAAAAAAAD8/ovRftbzeLDY/s220/Webcam2.jpg'/></author><thr:total>4</thr:total></entry></feed>