Procrastinating Perfectionist
Web developer, game designer, hacker, expert in AI, team leader, project manager, business consultant, company director, lead developer, wannabe entrepreneur, probable geek, proud dad.
I am most fulfilled when helping a small team to realise its full potential, and when given the opportunity to lead project work, taking a product from inception through to launch and beyond.
Throughout my work career, I have always sought to continue to learn and improve my skills by working with smart people. I strive to be proud of delivering quality software instead of a rushed hack-job. I love dreaming up creative solutions to difficult problems, and then coding up an efficient implementation of the solution. I've made work an enjoyable part of my lifestyle, not an alternative to it, and my goal in life is to ensure the financial security, happiness and future success of my kids.
Agworld is an end-to-end Agribusiness solution, available on the web and iPad.
RocketHands is an Independent Games Developer.
I founded RocketHands with six former employees of Interzone with the intention of raising capital to allow us to work on a project for the Xbox360. We pitched a game to Microsoft, but were unable to attract the level of investment we required to start up.
In mid-2009 we changed tack, and started to focus on developing projects for the iPhone, working after hours and on weekends. We have launched two titles on the iPhone and one title on the iPad so far, and are actively developing several more.
We also continued to work on Flash-based games, and on downloadable games for the PC, and have released several proof-of-concept prototypes for free during the life of the company.
We have most recently embarked on a six-month project to develop two games in parallel, going through the stages of pitching concepts and prototyping game mechanics before planning and managing the development process, performing QA and beta testing, and implementing a marketing plan as we prepare to launch.
GeekPunk is a web application development company.
I established GeekPunk with one other person in July 2010 after I left Titan Interactive to start my six month ``sabbatical''. It is primarily a vehicle for me to experiment with various ideas, by researching and specifying them in detail, by building prototypes where practical, and by implementing them end to-end where possible.
I released three products during my short break from the workforce. d-Board is an innovative text entry technology that uses a sophisticated predictive model to replace unwieldy on-screen keyboards with a cursor-based interface, FAQoverflow is a web application that makes it easy to access and read great answers to questions about everything, touching topics from cooking to finance to home maintenance to games, and MegaHAL.10 is an updated version of MegaHAL, a popular chatterbot I wrote 15 years ago. I also prototyped half-a-dozen games, and pitched several business ideas to potential investors.
GeekPunk gave birth to GeekSalt, a small web development studio that specialises in creating websites for Perth restaurants. By focusing on a particular market segment, and by leveraging third party technologies, we've been able to provide our clients with professional results at a low price. It was my intention to finance GeekPunk's speculative product development work with revenue from GeekSalt, but this has proved unfeasible.
DownUnder GeoSolutions, or DUG, is an innovative geosciences company offering a diverse
range of products and services to the global oil and gas industry.
I started at DUG at the end of my sabbatical out of a desire to brush up on my Java skills and gain experience working in the oil and gas industry, which is almost a rite of passage for a Perth-based engineer.
After spending some time becoming familiar with a massive code base, and learning the ins-and-outs of seismic interpretation, I was tasked with modernising the most neglected part of the software---well bore visualisation---while implementing new features and fixing long-standing bugs.
I moved on to start the development of a well correlation view before being assigned with developing an automated seismic mistie correction package.
Much of my time at DUG was spent attempting to improve existing development practices and fixing numerous minor issues in the codebase, which I did after finding them to be the root cause of several bug reports.
A company restructuring saw a new development team start in Toronto. I was offered and accepted a redundancy package.
Titan Interactive is a web development company.
I was invited to start consulting to Titan Interactive while working at Living Years. I spent my first couple of weeks identifying existing issues with the business, from fine-grained details of the development process to big-picture items including the focus of the company and its future directions. I introduced new tools, including JIRA for project management and issue tracking, and Confluence for documentation, and new processes, including daily stand-up team meetings and weekly project post-mortems. I then monitored the development pipeline, identifying blockages and working to optimise process to prevent them from recurring. In three months we improved our average from three sites launched per week to almost twelve.
Towards the end of my time at Titan I concentrated on improving processes outside of development, including HR (advertising, interviews, hiring, performance appraisals, minimising staff turnover and exit interviews), telemarketing, sales and corporate vision.
While at Titan I specified and designed an email campaign manager, and oversaw its development in Ruby on Rails. This has since become one of the core modules that they offer to their clients.
Living Years is a website similar to Facebook that makes it easy for users to create memorials for friends and relatives that have passed away.
I joined Living Years knowing that the project only existed as an idea, and that the site needed to launch before September. With only six months I worked to specify the project requirements, identify risks, hire a development team and plan a series of six two-week sprints. Apart from project management, I was also a key member of the development team, and ensured that our progress was always visible to management. We reached our feature-complete milestone on schedule, spent a month in beta, and launched on September 1 as required.
I introduced the concept of Scrum, holding daily stand-up meetings during development, coaching the development team, maintaining a backlog of user stories and updating the scrum board and burndown chart.
I wrote the deployment scripts that were used for continuous integration and to deploy the website from testing to live. Among other things, these scripts generated documentation, performed integrity tests, ran a suite of unit tests, migrated the database, minified Javascript and CSS (including inline code), and uploaded assets to a content distribution network.
After launch, I worked to support our growing userbase, and continued to develop new features as requested.
Interzone Games developed Interzone Futebol, a Soccer MMO, for the PC.
As lead programmer I worked with production, art and design to ensure that required features were technically feasible and accurately estimated. I worked with individual programmers to remove roadblocks and to ensure they were maximally productive. I worked with QA to ensure that bugs were properly reported and reproduced, and then fixed in a sensible order. I also liaised with IT and external software vendors to ensure that all tools and systems were working and that any problems with them were resolved promptly. Finally, I drove planning and documentation initiatives.
I led a team of thirteen very good programmers, and still managed to spend a few days a week cutting code myself (mostly in C++ and Python). Among many other things, I wrote the physics engine, a significant amount of gameplay code, various tools and the beginnings of the automated build and deploy system.
We practiced the Scrum flavour of Agile software development, and this proved to be extremely valuable to our project, which required frequent iteration and constant re-adjustment to ensure that the end result was fun for the player.
Team Bondi developed L.A. Noire, a AAA sandbox detective game for the PlayStation 3. The game finally launched in May, 2011.
As AI Team Lead, I was responsible for designing AI technology and implementing the bulk of the design in C++. I also interviewed, hired, mentored and supervised a team of six developers who were responsible for implementing other aspects of the AI system under my lead (such as the camera, the navigation system and the behaviour system).
I developed tools to allow game designers to enter and maintain data relevant to the game. For example, I wrote a tool (in Ruby, Rails and MySQL) that allowed designers to enter information about over 10,000 historic events to be used in the game.
I took on work outside of my role as it became apparent to me that certain aspects of the running of a software team were being overlooked. I set up the automated build system, established the coding standard, introduced unit testing, encouraged the adoption of using the bug database for software scheduling, developed a script to perform a one button release of the game including a full data build, wrote the automated data build system, and developed miscellaneous tools for editing data, generating code and prototyping algorithms.
Nautronix is a defense contractor that specialises in underwater acoustics.
At Nautronix I worked with a small, close-knit team of developers in a very structured environment, with an existing code base of well-written C++ code.
My first item of work involved tracking down issues in some of the unit tests that involved network communication. The problem turned out to be caused by a race condition between threads that was a direct result of an over-zealous locking strategy. Although I campaigned for smarter locking, I also worked to minimise the effects of the existing practice.
I also worked on a program that processed large volumes of multi channel audio data, allowing the user to preview individual channels and then resample and export selected channels. This work involved writing and testing (via loopback) an audio recording and playback system.
My main item of work was the design and development of the RCMS, a system used on-site when performing submarine tests. This tool displayed the output of dozens of hydrophones in realtime in various ways, including raw audio output, LOFAR plots and a waveform display. It co-ordinated operator communications between various servers, and sent and received commands from a remote device, deep underwater, at the end of a kilometres-long cable. The system was finished to spec and I was involved in its installation.
Artificial Intelligence is a private research company that is developing technology which allows computers to learn human languages.
Our project was to follow Alan Turing's advice, outlined in his famous paper on AI, by designing and building a ``baby computer'' that could learn language from scratch.
The company was structured in three parallel teams. I was the lead of the
research team, I worked closely with the training team, and I advised the
commercial team. As the chief scientist, I was responsible for hiring a team that would implement a system of my design, based on research that I performed.
I designed the various learning algorithms used by the baby computer, and implemented them, in C++, with the help of my team.
I worked to establish an online laboratory that allowed registered users to participate in various pattern recognition experiments in order to compare the ability of the human brain to recognise structure with that of our algorithms when hamstrung in much the same way.
I devised and announced the ``Learning Machine Challenge'' at the AAAI conference, which saw individuals and research groups submitting entries to play various simple competitive games with undefined rules.
I helped writers to generate content for another chatterbot I had written, which was used to prototype the application to be developed by the commercial team. Once the prototype was complete, I assisted the commercial team by helping to design a more powerful version of the chatterbot application.
During my time at Ai I underwent media training, was interviewed numerous times (by New Scientist, Wired, the BBC, the New York Times, and so on), and attended many conferences and workshops where I presented papers with my colleagues.
When the project was terminated prematurely by the events of September 11, 2001, our baby computer had already reached the linguistic competence of an 18-month-old human infant, as determined by an independent performance evaluation.
Lionhead Studios developed Black & White, a groundbreaking PC game that featured an advanced AI creature.
I was given the single task of developing a system that would allow the game designers to write ``challenges'' that would be run in-game, and which the player would have to complete.
I wrote a parser for the pseudo-code that the game designers were using to prototype the challenges, using Yacc and Lex to achieve this. I then wrote (in C++) a compiler that generated bytecode, and a stack-based virtual machine that executed the bytecode. Finally, I wrote various bindings that exposed game functionality to the scripting language, allowing the designers to move the camera, spawn creatures in the game and so forth.
I worked on optimising the code once it was working well enough to allow the designers to get on with their work. The script compiler and virtual machine were implemented in a DLL that could be reloaded by the game on demand, which sped development. I also wrote a sandbox that allowed scripts to be compiled and run without the game having to be present. Finally, I wrote HTML documentation for the system so that the designers could continue to use it after my departure.
The game ``went gold'' almost a year after my departure, with dozens of challenges written using the scripting system that I developed. Only a single bug was discovered in the system I wrote before the game shipped.
Amristar is an IT company that specialises in online mapping technologies.
I formed Amristar with four friends from University as an umbrella under which we could continue to perform innovative research while earning an income from contract programming, with a view to bootstrapping ourselves to financial independence.
Our first project was for a local real estate company which wanted an interactive mapping system for displaying their property listings spatially. I was involved in the initial negotiations and design of the system.
I remained a ``silent director'' during my time overseas.
In early 2002 I rejoined the team, where I helped to design and develop AMWOS, a centralised workflow operations system for a chain of automative repair centres. Written in Delphi with a MySQL backend, my work also included developing and running a training course for store managers.
Amristar has continued to grow. Headquartered in West Perth, they currently employ dozens of developers, and have built a well-respected business.
A German company approached me in 1997, offering to purchase the technology I'd developed for the Loebner Prize that year. This took the form of a program, written in C, Yacc and Lex, that parsed data written in a custom language of my design, and which specified various rules for simulating a conversation. Together with a colleague, we tidied up the code, fixed outstanding bugs, wrote documentation and shipped the final version of the product in a two week period. I later visited the company in Hamburg on their dime.
In 1998 I was approached by a local entrepreneur and contracted to develop a ``kitchen sink'' web portal. With another colleague I designed and implemented a complete solution in PHP with a MySQL backend. The system featured the concepts of users, groups, permissions, preferences, tasks and so on, and we delivered a dozen applications that ran on top of it, including a forum, a calendar, a file repository, a photo album, a diary and a ratings system.
I joined the group in 1989, after completing high school. I had decided to spend the year in the workforce before commencing my Engineering degree.
My role varied between writing programs in QuickBasic, porting legacy programs from Fortran, using CAD software to prepare 3D diagrams for publication, and testing various materials by installing ``strain gauges'' before subjecting them to destructive tensile forces using specialised equipment.
Wow, almost two years since I’ve posted here. Seems it’s time for my biennial attempt to maintain a “weblog”.
Things have been going swimmingly, thanks for asking. I’ve gotten older and wiser, I’ve moved to Agworld (a Ruby on Rails shop), and I’ve written a few technical blog pieces over there, at the Agworld Devblog (under the pseudonym of “Jason Hutchens”).
Apart from that, I’m still pretty interested in making games and working on other side-projects. And although I find myself surrounded by tempting triviality and mundanity, I try my best to avoid it.
I would like, I think, to write longer opinionated rants. I might do that at some time. We’ll see how it goes.
class Fixnum
def prime?
(2...self).all? { |i| self % i > 0 }
end
end
primes = (2..100).select { |i| i.prime? }
puts primes.join(', ')Just testing out syntax highlighting of some mundane Ruby code folks. Nothing to see here.
It seems that my Time To MegaHAL, or TTM, is about six weeks.
I’ll explain. What generally happens is this:
It happened just today. My new boss, at a job I started six weeks ago, suddenly made the connection when a good friend of his published an interesting post about cobe, an optimised and much improved reverse-engineered rewrite of MegaHAL, written in Python and using SQLite as a storage back-end. A nice piece of work, although I’m a bit ashamed that someone had to wade through my 16-year-old vanilla C code to try to figure our what the bloody hell is going on :)
Of course, this will probably help to knock me out of my summertime hiatus. Things have been quite on the blogging front lately, what with moving into our new house just prior to Christmas and starting a new job first thing in the New Year. Now that our new place is looking more like a home and less like a cardboard box wholesaler, it’s time to sit back, take stock and figure out what’s next.
For me, that’s as follows:
Although, really, the first item on the list should really be “get more sleep, and exercise”.
Exciting times!
Over at RocketHands HQ I’ve just released RubyOgmo, a small library for loading levels created in the most awesome OGMO Editor. And just to prove it all works, I included a level preview, written in RubyGame.
Full details here: http://rockethands.com/ruby-ogmo
Another week, another RocketHands prototype. More info, including video, here: http://rockethands.com/monster-stomp
I’ve fallen off the wagon when it comes to blogging, it seems. Just a quick update to point you in the direction of my Professor Lazybones post on the RocketHands blog. We’re prototyping a bunch of new game ideas, and I’d love to know what you think about this one. Thanks!
One of my sabbatical projects is MegaHAL.10, an entirely new version of the mildly popular chatterbot that I wrote and put online fifteen years ago. I’ve been writing it in Google’s Go programming language, and I recently started getting some exciting results.
MegaHAL.10 generates sentences using a second-order Markov model. That means they tend to be random walks; you start out with a blank slate, and you never know where you’ll end up. The only guarantee is that any sequence of three symbols will have previously been observed by the model.
These kinds of random generations may be quite amusing, but they’re not too useful when you’re trying to simulate a conversation, which requires that each generation adheres to the current context. What would be much better is if you could force the model to generate a sentence that has the desired Markovian properties, but which contains pre-determined keywords.
With the original MegaHAL I did this by starting at the keyword and using two Markov models to generate the sentence, one proceeding from the keywords forwards to the end of the sentence, and the other going in the opposite direction. That was a bit of a hack, and could only guarantee that the sentence contains a single keyword.
For MegaHAL.10 I’ve been experimenting with other strategies, including a Fractal slot-filling model and a family of Markov models, each of which generates towards a specified target symbol. Both of these took a template sentence as input, which specified the keywords and their order, and both suffered from several problems, such as the fact that it may be impossible to complete the template, and that the local grammaticalness condition may need to be violated to make the keywords join up.
Recently I had a brainwave: what if we generated with the standard Markov model, but weighted the generations based on another model that specified the distance to the desired keyword. We could then generate a directed random walk, similar to an A* pathfinding algorithm. We may not be able to guarantee that the resulting sentence contains the keywords we want, but chances are it will contain at least a few.
Some bugs still need to be ironed out (and some wrinkles squished), but my tests so far indicate that this method may be the missing link. I trained MegaHAL.10 on the entire collection of Sherlock Holmes stories, and then I asked it to generate a random sentence, specifying these ten keywords in advance:
adventure foot wild scandal street twenty death finger villain rock
This is the sentence I got (I’ve highlighted the keywords):
“Twenty had changed their position, and the street by the death of the adventure of the ROCK OF GIBRALTAR. From the dead scientist. His wild flight to escape from her finger into the garden. Perhaps the villain was able to take counsel how far we can hardly put my foot over the case of this question. I saw that a very remarkable man, that was this William doing there is to avoid scandal.”
To me that’s completely amazing. “Give me a sentence containing these ten words”, I said, “making sure that each sequence of three words in your sentence appears somewhere in the collected Sherlock Holmes stories.” And MegaHAL.10 delivered.
Just to prove it wasn’t a fluke, here are a few more, using the same keywords:
“Twenty or thirty, I have seen death in the street by a strong family resemblance about misdeeds, and if you know now and so I dipped my finger on the ledge above the other hand had dropped his mask of his foot than might at any time before he was wild, wayward, and to our young companion looked at the young diplomatist’s window. There was this dark business which had been in the young lady.”
“Villain! Scoundrel!” cried the old quarters. At the foot of the death of the street. Holmes looked eagerly round for it was twenty before her in the dead scientist. His wild eyes, stained cheeks and He put a triumphant conclusion.
“Death from some little distance down the street by a very simple chain: 1. You had a wild thrill as this was at the foot of the rock on each side of the adventure as a great scandal threatened to raise a scandal may well be cleared along those lines. Mr. Douglas has spent a large coil from under the three strips. No finger impressions–no! Well, he is not here as I was at the other night.”
I’m planning to spend next week improving this algorithm, fixing various bugs, and optimising for memory and speed. I’ll then set to work creating a web version of MegaHAL.10, which will hopefully be going live before the end of the month.
Please, EA, please stop spamming my email account!
Yes, I know that I signed up to receive updates about Spore. Amazingly, I did that on Friday the 20th of May 2005. Was it really that long ago?
It took almost three years for you to send me the first email about Spore. Since then, I’ve received the odd email now and again. I didn’t mind. After all, I signed up for it.
Then, in March, you send me a non-Spore email. So I decided to unsubscribe. I really wasn’t interested in hearing any more about Spore (after all, that train’s left the station), and I certainly wasn’t interested in receiving advertising about anything else.
Seven months later and I received another email. I unsubscribed again, confirming that I was receiving these emails because I’d signed up for Spore updates.
Two weeks later, another one. Unsubscribed for a third time. This is getting annoying.
And now, six days later, yet another email. For this you must die. Metaphorically. So let’s see:
Come on, you scum, you just try sending me one more.
Anyone else getting spammed by EA after they’ve gone through the unsubscription process?
In 1992, a couple of years before the Web started to gain traction, Virtual Reality was the new hotness.
I was a second year Engineering student, and encouraged the head of one of the research groups on campus to allow me and two fellow students to work on a VR project over the summer break for credit.
We improvised a poor-man’s VR helmet (a stack-hat) with a poor man’s stereoscopic HUD (two video camera viewfinders) and poor-man’s motion tracking (two POTs on the helmet for 2 DOF head tracking, and a Nintendo Power Glove). All of this was driven by two Amiga 500 computers, one for each eye, using custom software written in AMOS and AMOS 3D. One of the most challenging parts of the project was synchronising the displays via a null-modem link, and reading the POTs, which had to be timed off the vertical scan (something arcane like waiting until the electron beam of the display reached the 7th line, and then reading some register or other before it reached the 12th line).
We were excited, but, in truth, the project sucked balls.
While working on that project, we became involved with the Perth Virtual Reality Interest Group, which held meetings in Tech Park (Enterprise Building 3, funnily enough, where I returned 15 years later – ack – to work at Interzone). The SIG organised a special, private viewing of the Virtuality Arcade Machine (which also used the Amiga computer) when it made a brief appearance in the Perth Myer store.
I remember being very excited by the potential of VR at the time, in part due to a documentary that aired on TV that featured Marvin Minsky, Jaron Lanier, William Gibson and Tomothy Leary. It’s funny and embarrassing in hindsight, but it was a strange time, with people absolutely convinced that VR would be the future of entertainment, medical imaging and stock market manipulation.
I wonder what the modern equivalent of VR is? Social gaming, perhaps?
Hmmm… eight days since my last post. Looks like I’ve fallen off the wagon. For a while there I actually had a backlog of half-a-dozen posts ready to be published, and it was great. Writing is like exercising; it’s hard to start, but it feels fantastic once you’ve built up a rhythm. Take this, then, as an attempt to re-start.
D. and I have been watching BlackAdder. I received the “ultimate collection” box set for Father’s Day, and we’re working our way through the episodes, watching everything twice (to hear the commentary), and thoroughly enjoying it.
Ben Elton did a fantastic job of re-imagining BlackAdder when Richard Curtis invited him to join the writing team for the second season, suggesting that the characters of Edmund and Baldrick should be swapped. Each episode was filmed in under two hours in front of a studio audience (apart from, of course, location footage).
Channel 7 co-financed the first season, which was the most expensive to make, but pulled out from later seasons. Nine years later, after all four seasons of BlackAdder had been released, Channel 7 created an embarrassing BlackAdder rip-off called Bligh, which starred Michael Veitch from Fast Forward. I can’t find any footage of it online; I can only remember it being very, very bad.
I find it inspiring that it’s possible to create a long-lasting piece of television in such a short amount of time. It seems that the advice to follow is do what you love, don’t compromise on quality and just damn well get it done. Speaking of which…
Yesterday I posted the following on Twitter:
Why is the #golang community so much more holier-than-thou than the #ruby community? Harumph to all sanctimonious hackers.
This got a concerned response from someone who works at Google as a “Go Gopher”, whatever that means. It also made me feel like a dirty troll, which wasn’t my intention at all: I was just venting after a frustrating day.
When Google’s Go Programming Language was announced late last year I was fascinated. I loved the decisions they’d made regarding code formatting (the language enforces a particular standard, making debates about the right way of formatting code a moot point), dependency management (it’s a compile-time error to include something that you don’t use; streamlining your dependencies to speed up builds in C++ is a nightmare by comparison), and language features (defer, iota, interfaces and goroutines are all very cool). I read through the documentation, watched the videos and toyed around with the language a bit, but I didn’t dive in and get my hands (really) dirty straight away.
Recently, I’ve started working in earnest on the back-end for MegaHAL.10, an online chatterbot that can learn to talk in any language by example. That project has a few requirements that make Go an ideal language for the server-side code, including:
So I started coding things up, and eventually ran into some problems that I couldn’t answer by reading through the provided documentation.
For example, consider the provided documentation for the sort package. The description is a brief “the sort package provides primitives for sorting arrays and user-defined collections”. Just what I need! Unfortunately, the documentation for the Sort method is no more than its specification, “func Sort(data Interface)“. That is all.
You can click through to see the implementation of Sort, revealing that it just calls through to quickSort. Great! I’ll look at the documentation for that. Unfortunately, there is none; quickSort is private (because it starts with a lowercase character), meaning that it doesn’t appear in the documentation at all, although its implementation is right there in the source.
So they’re hiding stuff from you in the docs, while at the same time recommending that you treat the source as documentation.
Now, this is a contrived example. I didn’t really need to look up documentation for Sort, but I did have several problems of this category with other packages and functions that I wanted to use. What I’m trying to illustrate here is how difficult they’ve made it for a newcomer to the language to get acquainted with things. Contrast this, for example, with the documentation for sort in Ruby:
Returns a new array created by sorting self. Comparisons for the sort will be done using the <=> operator or using an optional code block. The block implements a comparison between a and b, returning -1, 0, or +1. See also Enumerable#sort_by.
a = [ "d", "a", "e", "c", "b" ] a.sort #=> ["a", "b", "c", "d", "e"] a.sort {|x,y| y <=> x } #=> ["e", "d", "c", "b", "a"]
It’s succinct and easy to understand, with clear examples and cross references to related functions. Exactly what you need to dive in and get started on something.
I’ve just finished working on FAQoverflow, a fun little project that was implemented in two weeks using Ruby, and I rarely needed to look outside of the provided documentation when writing a fairly complicated API spider. When I did, I found the community polite, welcoming and useful. Consider, for example, this question to ruby-talk, made soon after the first version of Ruby was released in the west:
Ok, I’m having trouble with an extremely simple class. Here’s my example:
class ABC def initialize( _v ) @v = _v end end a = ABC ( 50 ) print a.v # produced an ERROR<br>
This got an immediate reply from Matz, the creator of the language:
Example:
class ABC def initialize( _v ) @v = _v end attr_accesser :v end a = ABC ( 50 ) print a.v a.v = 25 print a.v
Now, that’s really helpful! Here’ by contrast, is the first question I ever saw on golang-nuts (when searching to find out how the ternary operator worked):
How can you call your self a C-like language and NOT have the ternary operator? But seriously, why isn’t it in Go? This could be a deal-breaker for me, as it’s often more succinct and clear to use a ternary operator than an if/else, *especially* if you require curly braces even for single-line blocks.
And here’s the first answer:
Then “go” write your own language or use a language that makes use of your precious ternary operator.
Ouch! That answered my question, but it certainly rubbed me the wrong way.
When you’re deeply focused on writing code, and jump to a browser to do a quick search, and the first thing you hit is a mean-spirited reply to a reasonable question, then it breaks your stride and leaves you with a foul taste in your mouth.
Of course, if this just happened a few times it wouldn’t be a problem. What concerned me is that throughout the day, whenever I searched for an answer to a question I had about Go, I always got a mean-spirited answer to a fair question. Sure, I admit I might have had an unlucky streak, and I admit that I usually read the first reply to each question due to my familiarity with Stack Overflow, whereby the first reply tends to be the best. But I just don’t encounter that with the Ruby community. And it was enough to make me stop looking to the forums for answers, which is a shame.
Some more examples of less-than-useful answers (paraphrased) that I encountered on the day I was working with Go:
“In the rare instances you need them, make wrapper functions and give them unique names.”
Coming from Python and Ruby, I’d have to say that optional arguments, or arguments with sensible defaults, are far from a rarity, and are often extremely useful. And, no, I don’t believe that it’s good practice to create eight differently-named wrappers for a function that you’d like to have three optional arguments.
“Because making a function for every possible integer type is tedious and clutters the interface.”
Clutters the interface? Really? Do you mean that the generated documentation gets a bit longer, meaning you have to scroll through it? Do you mean that you really shouldn’t need to specifically convert int8 and int32 from their string representation, ever? Or that if you do you should write that functionality yourself?
” I don’t get the point.”
Thanks for sharing, but why not correct the obvious misunderstanding or be more specific about what it is that you don’t get?
“Rule one of problem solving: break it down into smaller problems, see rule zero.”
Right, so rather than provide short, concise usage examples in the documentation, you want me to dive into the source and spend time understanding the implementation of the functions I want to use?
“One way to get answers to questions is to search the golang-nuts mailing list.”
Hmmm… dare I ask any questions at all?
Now, yes, perhaps I’m being harsh. But when you’re struggling with something unfamiliar and new, it’s a godsend to find a superb resources such as Programming Ruby or The Ruby User’s Guide or why’s (poignant) guide to Ruby or the Standard Library Documentation, and these resources exist because the community cared enough to want to help newbies to understand why they fell in love with the language. Guess what? It works.
I just don’t get that feeling with the Go community at all. At the moment, it feels defensive and argumentative. Now, it may well be that Go is suited to a different class of problems than Ruby, and that the language is therefore going to be niche, appealing to systems programmers only, and that it’s still immature and not really suited to production code. Fine. My problem is that it sure wasn’t marketed that way. The Go team claim that their language is an expressive, concise, clean, and efficient language designed to make programmers more productive. Sounds good to me! Now if only I could learn to use it as such without banging my head against defensive, unhelpful, critical answers on golang-nuts.
So, Go Community, where should I be looking?
So we’ve got a so-called “web site” up and running at hacktile.net.
You can encode HackTile source code as part of the URL. We’re still figuring it all out, but it’s cool.
You’ll also be able to store your code anywhere on the web, within special HackTile delimiters, like this:
[hacktile],7314a7,this+is+hacktile+source[/hacktile]
Sweet, mate.
Lazybones is a big project. Really big. You just won’t believe how vastly, hugely, mindbogglingly big it is. I mean…
…what I mean is that, for a big-ass project like Lazybones, you’d think a sensible approach would be to break it down into fine-grained tasks. Yes?
I say no! Detailed technical design takes time, and that big up-front cost can be de-motivating. It can lead to the dreaded “analysis paralysis”. Worst still, it often transpires that you need to throw the BUFD out when the actual implementation takes a different path.
In practice, it’s much, much better just to get on with it until you’ve got an artifact you can gather around, poke and prod and deconstruct, and iterate on, refactoring and so forth until you have something worth sharing with the world.
With that in mind, here are the things that I want to get done in the short-term (which means at least until the next version is posted here):
Once all that is done we’ll be in much better shape to progress on to shinier things. And I imagine we’ll have a pretty neat-o simulation of Conway’s Life to boot! Sure, there’ll be some additional re-factoring, debugging, optimisation and, ergh, documentation to write. But I think that’s a nice bunch of work that will take us a long way, and the great thing is that I can see the light at the end of the tunnel before I even begin.
And here’s the very first, ohmygoditruns demo of not very much at all. But exciting for me nevertheless!
Unleash the full glory by clicking here. Some notes on controls:
The inspiration for Project Lazybones was the simple idea of using a “cellular automata” to create a tile-based videogame, such as Boulderdash. I carried this idea around with me for 15 years before implementing the prototype shown in the video, which was the result of about 8 hours of hacking in RubyGame. It received an extremely strong response from alpha geeks. Our job now is to show the rest of the world how awesome this simple concept could be. What-ho!
Right, I think I’ve figured out this motivation malarky. Just not sure I’ll be able to stick to this regime.
Productivity did result, meaning that we’ll be able to post something here, or elsewhere, Real Soon Now (tm).