Especially in this Ludum Dare case, development practices or implementation details do not matter as much as results. And he did get results. That's why it was interesting. I'd like to hear of what you think was wrong and why? This was his show of productivity and results. Other people have other ways and other circumstances can be completely different. And should be different.
I learned some things too. However, even if you have a tiny piece of software, like a game that you can reliably complete manually in 20 minutes, completely playing it through after every change is way too slow for "live coding". You should see your results instantly. Just like your test suite should run in seconds. If you have to wait minutes to compile, deploy and test your productivity will fall. A full integration/acceptance test suite can take longer, but it should be as automatic as possible and you can't use it for rapid feedback like this, but more for regression/acceptance testing.
Notch was able to take advantage of immediate feedback for the most part of his coding. The first hours spent on the rendering was tested by watching the world being rendered live. I've been doing the same developing a game in Clojure. When he got as far as the gameplay, he slowed down considerably, since he had to wander around in the game world to test each new feature. He for example made temporary shortcut passages, so he was able to test the boss monsters, without actually having to pass through the levels.
He is a person who can concentrate on delivering results and hack away at code for long stretches. This is the kind of code he presumably has done again and again for years. Who professional web developer can't hack together a small site as quickly? Where most people fail is attention span and drive! I know my unfinished projects speak of that :)
Most interesting part to me, of watching Notch code, was to see how he used his tools. And it was inspiring and motivating to see the progress. The actual code was very hackish but quality code is not important in a throw-away project anyway :)
There should be no Draw() in your game object (read entity) base class. Not every entity is rendered. You should have instead a component Renderable. And if it happens to be so that your special snowflake has a Renderable component then you can render it on screen. E.g. AI pathing nodes would not usually have one unless you are debugging them you can add one.
In your example you end up with Movable extending GameObject, Camera extending GameObject and then you have no way of combining these two behaviours.
I used numbers that are reality to me. Plug-in your own numbers for comparison.
For a 10 minute commute today, I would have pitch in another 100K for living. My experience at the moment is working 5 years for same client/location on average.
P.S. If I move out I can reclaim some of that 100K, some go to tax, fluctuating prices, I don't calculate inconvenience of moving and stressful location etc. details.
A rough example. Moving closer costs 100K more, working for 200 days a year, less commuting provides 1.5 hours more time per day, same client (place of work) for five years. Cost of hour of free time is (/ 100000 200 1.5 5) = 66.7 units of money per hour.
Worth it? Don't think so.
Working remotely is often impossible because of security policies and also not the same in terms of presence.
I am thinking along the same lines. If something is not "policed", then it won't happen in the long run as interest shifts. Includes programming practices, testing coverage and the usual stuff. And more effective to automate such things and spend code reviews on interesting issues, not "punctuation".
I wonder if anyone has examples for or against of running such checks against your codebase? I can imagine some horror stories of how those tools would slow down all useful work. But some success stories? I guess I have to try on myself first :)
I colour code my diary and contextualise it a month in advance. Today was a Blue- Sales day, so every sales opportunity this month has been offered today as an option- none of my clients (Blue- Delivery day) had it as an option
My pockets are consistent- phone lhs side, money clip rhs, keys to the rear- To check I haven't forgotten/lost anything I just touch 3 pockets
At shopping centres I always park in the same section- replaced standing still remembering my park with automatic 'walking to section' while remembering
When I get a plate of food I generally plan which order to eat it in then exexute, rather than thinking with each mouthful. That may be bordering on ocd but at least I don't do it in alphabetical order!
Laundry is always washed and hung in the same order, linked to where clothes go when clean- ironing pile, top drawer etc. Ditto washing dishes.
I always round up time for calculating travel legs. I don't like being late, and don't mind being 30mins early
I clear my inbox by person not date- allows me to address many emails dealing with the same or related (Tracey- training; Darryl- IP development) discussions at once
For 6 years we have been once a month cookers- 6 meals x 4 portions (roughly chicken, beef, pork, lamb, fish, vegetarian) which are frozen and reheated based on the calendar I draw up
We have holidays drafted from now until November and try to book up our weekends 3-4 weeks ahead, to balance our social life and prevent waking up and wasting a day wondering what to do
And lest all of this seem boring, I applied this mindset most recently to completing the Monopoly Pub Crawl in order- 26 pubs over 13 hours. One definitely needs a system for that.
If I blogged more about any topic specifically, which ones would interest you?
[As for what doesn't work for me- anything linking tasks like 'I will do x then y then z'. One interruption to x means nothing gets achieved.]
Thanks for the details! Here's what happens to me.
Planning for a month. How detailed really? I would imagine that such a plan doesn't survive life. How do you cope with changes? I don't plan so much ahead now because other people influence my doings too much.
Always the keys, phone and wallet are in the same location. Take the same buses always so I remember the schedule. I store my stuff in the same location always. Shelves are organized, everything boxed and labeled. Plastic bags stacked by size and tied with rubber bands :) That's just being an organized person. Bookshelf has no particular order because it's acoustically better. Only the to-read -books are in one place in order of interest.
No need to decide in what order I eat stuff, I just put stuff in mouth :) Actually, rotating between the parts, trying to put meat and other stuff in each mouthful.
So far I haven't decided to wear the same clothes every day, or wear my stuff in any order. But this takes only a minute each day.
I'm also always in time. That means I usually wait for other people, I use that time to observe other people or read something on the phone. To work I almost never need to be on time but just come at my usual time +- delays in traffic.
Inbox, I answer stuff when I read it. Should mark some items as followup I guess.
Holidays are difficult to plan for me, never know when can take, should take, need to synchronize with other people, work etc. Besides it feels good to waste time on days off. That's when the brains come up with new ideas. Wasting a day typically means spending it on something that I then thought was most interesting, which is the right thing, yes? If I'm bursting to do something, I do it.
I guess for me the same that plan x -> y -> z doesn't work. Such processes are inflexible. It should be possible to do x, y and z in whatever order I feel like and all of them should be possible to finish in one go. Or not do at all. Now how to string a bigger project together ...?
Cooking part is interesting. What do you do with fresh foods or they are just no on the menu? We cook for 2-3 days at a time and it does take more time than to heat stuff up.
Many of your choices require commitment not only from you but from your family and friends. How does that go?
Online banking is easy. But then it's easy to forget how much money you waste on said auto-paid bills every year. Sometimes it's good to have to work for something to realize maybe it's not necessary after all. I cut my magazine subscriptions to half, twice, and still get a bit too many to read ;)
The trick is to call the various groups you have to pay (utilities, credit cards, etc) and tell them you want your bill from them to be due on or around some specific date, the 15th of the month, for example.
Then set a calendar reminder for the 10th of each month, to login and review this month's payments.
On the 10th, you login to your checking account. Review/adjust the pending autopayments; add anything else that has come in recently; and you're done for the month.
After dumping my TV some years ago, there are still some problems with time. Working, commuting, exercising and eating seem to take about 15 hours in total. Now with 7-8 hours of sleep it leaves approximately 1 hour for hacking or time with other people. A bit too little, no?
Sometimes it might be possible to combine commuting and exercising, but at the moment it's not worth it, since commuting and meditation, as well as commuting and reading, are possible with public transport.
One thing I can recommend is to get a cross-trainer or exercise bike and watch some interesting stuff while exercising. Recently I've been reviewing open courseware, Clojure webcasts etc. Saves time.
I would say working less for money is the single biggest thing people can do to be more productive, or to have more time.
>I would say working less for money is the single biggest thing people can do to be more productive, or to have more time.
moving closer to work has similar effects on your free time without cutting in to your free money.
but yeah, I agree. It's hard to have time to work on your stuff if you work 40 hours a week, especially if you need some family or social time. working part time helps a lot, if you can pull it off. Again, though, be mindful of the commute and reduce the number of days a week you work rather than reducing the number of hours a day you work.
But really, commuting is impossible to avoid if you work in consulting, where your customer changes from time to time. You can't expect to move as often. My work used to be only 10 minute walk away ...
> moving closer to work has similar effects on your free time without cutting in to your free money.
Depends on house prices. I remember a study about those prices around London, and they found a nice relation between duration of commute vs house price. (I did some calculations, and assuming a reasonable hourly wage and interest rate (to convert the house price into a rent): each minute was bought at less than what you'd get for working that minute.)
Something's not adding up for me...even if you are working 10 hours a day, that means you are spending 5 hours commuting, exercising and eating? 1 hour commute each way, 2 hours exercise and 1 hour for eating?
07:15-08 Wakeup, shower and breakfast
08-09 Commute+reading
09-19 At work, includes lunch and snack
19-20 Exercise
20-20:30 Grocery shopping
20:30-21:30 Commute+reading
21:30-22 Dinner
22-23:30 Hacking
23:30 To sleep (slightly late)
This routine gives a small amount of extra working hours to use for time off later. Cutting work to 8 hours gives 2 hours of which 1 usually goes to a longer exercise and 1 is retained as free time. So these days get 2-2.5 hours free.
You commute too long. That's where those missing 2 hours are going. My example's extreme, but:
8:30 Wakeup, shower, breakfast
9:00-9:50 Browse the net, email
9:50-10:00 Walk to work
10:00-18:00 Work
18:00-20:00 Buy groceries, cook, eat, do dishes
20:00-21:30 Relax in some way. May include tv, movies, exercise. Sometimes extra hacking.
21:30-01:00 Hack (may include leftover work)
You seem to stay up quite late. Unsustainable for me. Also making and eating breakfast takes for me at least 30 minutes at the moment.
Three years ago I had exactly the same 10 minute walk to work and then I did have more time available. However have to consider that:
1) Consultant usually works at client's location and client may change often, though I'm a counter-example of that myself. Moving often is not worth it. I consider my current location pretty optimal. A more central location creates more stress and costs way too much. I would believe it's more effective to just decide to work less hours every week for reduced pay but I'm not yet strong enough to commit to it :)
2) I do not spend any time travelling to shop, to exercise location or to do fun stuff. My travel time maximum is 2 hours every day - the shops, bars, movies, etc. are along the same route and do not increase time spent travelling in a day at all.
3) Car would not improve the situation. In fact it would be slower due to traffic. Or I would have to leave at 06 from home, way too early. And the tradeoff of money to time is ridiculous with so few other uses for a car. And there's the maintenance.
Thanks for the example. Maybe somebody else can chime in too.
1) 10 hours at work? Cut that to a healthier and more sustainable 9 including lunch hour - less if your lunch break is shorter.
2) grocery shopping every day? Order it online or do it once a week (or both) - another daily half hour gained.
3) daily exercise is laudable, but maybe you don't need a whole hour every day. Half hour after waking up should be more than enough - unless you're doing weight lifting for muscle gain, in which case you should only go 3 times a week.
1) I don't work 10 hours every day, 8 hours twice a week at least. Like this I'm saving a couple hours every week to have some time off later. Year ago I was at -50 hours but now I'm at over +50 already. A small reserve is good. I never work overtime for money.
4 x 10 might be nice to have a longer weekend. Have to think about it since now 5 days are mostly spent working, exercising, eating and sleeping :)
2) Well that was an example day. Instead of the shopping it might be cleaning, cooking or other housework that takes half an hour to an hour. I shop two or three times a week. I also don't cook every day but cook for two or three days at a time.
I don't own a car, bike or skis because the maintenance would take time :)
3) I keep a rest day once a week and on weekends I might do two kinds of exercise in a day. Still 6-7 times a week is fine counting the occasional extra walk back from shop. That totals it to 6-10 hours a week on physical activity.
I don't spend any time going to exercise since all the equipment is either at work (gym, pool), at home (cross-trainer, weights) or I go running.
Your commute is long, but at least you get to read. Our schedules are similar. My morning commute is 15 minutes. I walk home at night, which takes about 45 minutes..i count that as part of my exercise time, and I also pick up quick groceries.
I guess I should add long commutes to my list of productivity hacks.
Yeah I sometimes get off the bus earlier and walk home to combine the two. I'm considering running sometime too but have to get the gear with me. And sometimes I walk home from a shop for the same exercise.
In the winter I mostly slept/meditated in the bus but now I have enough energy to read. I found out that coding is practically impossible in the bus because of the sun.
Shop once a week, half hour commute, 8.5 hour day, cut exercise down to half hour or combine with watching TV/listening to audiobook. You gain 3 hours.
TLDR Person found out other people can be immensely productive with other languages. Then person learned languages X, Y and Z with cool libraries and is now very productive and happy using them.
Programming languages live and die by their libraries, i.e. vocabulary. The differences in grammar are in my opinion rather small, when we talk about how expressive a clever programmer can be. Can a person be even more expressive in Lisp? Perhaps but it's not essential. The library support on the other hand is essential. You want to stand on the shoulders of giants for the next step. In all modern languages you can write elaborate, expressive libraries (read DSLs) for your pet problems.
I think my TLDR summarizes the original author's post but if someone disagrees, then we can have a fruitful discussion :)
I actually don't think that's the point of the article - it may be true, but it's not supported by the text or background story. This was written in 2002, and the author's tenure at Google was 2000-2001. That was pre-BigTable, I think it was pre-MapReduce, and it may even have been pre-GFS. Plus, Google's known for it's NIH syndrome - while there are a fair number of third-party libraries in use now, there weren't really in Google's codebase of 2000, which had just dumped many of the early frameworks they'd used for prototypes.
Rather, I think this is more evidence of the old "Good programmers will be productive in any language." The advantage that an expressive programming language like Lisp gives you is that it frees you to think about the problem domain and not worry too much about the details of the machine. However, if you're skilled enough that you've pushed those details into unconscious muscle memory, they don't matter anyway. And a language like C++ gives you the option of dropping down to the bare metal if the need arises.
There are a fair number of Lispisms in early Google code - MapReduce is the obvious one, and there're others that I'm not at liberty to discuss. However, they're Lispisms implemented in C++, where the author took the concept and transplanted them into a language that could give the efficiency needed. This is not a bad strategy - when you understand the concept fully, you're free to tweak it and adapt it exactly as necessary for your problem.
Perhaps not coincidentally, many early Googlers were also programming language & compiler guys before Google. Urs Hoezle (employee #9 and Google's first VP) had previously done StrongTalk (statically-typed SmallTalk), Self (the prototypical prototype-based language and an early inspiration for JavaScript), and the VM that later became Java HotSpot. Jeff Dean got his Ph.D on the Cecil/Vortex compiler, one of the first optimized implementations of CLOS-like multimethods. Rob Pike worked on Plan9 at Bell Labs and invented the Limbo programming language as part of it.
Yeah, I agree that good people can be successful with any tools, but I also think that good people with decent tools are even more successful. And good people will quickly see what is wrong and with what tools they can be expressive enough. And I think modern languages generally fall close to each other.
If you go into a significant company with any significant developer culture, they would have their own libraries and tools, which you would use because then you can deliver. So when those are written in f.ex. Python you would use it. Sometimes this also means that you use e.g. Eclipse though it has numerous problems because at least those problems are shared with most other developers and you don't have to fight them alone.
Google undoubtedly had great programmers pre-MapReduce et al. so they already had great stuff to use.
In my own perspective, "all else considered equal", things like macros, CLOS, dynamic variables and conditions system have enormous advantages over say what Python has. But this advantage can be overwhelmed by other factors, since industry programming is a very cooperative venture. (Not just cooperation with coworkers, but also people you've never met.)
I think I half-agree with you. I don't think a great library can ever elevate an OK language to great. However, a poor library can certainly drag an OK language down to poor.
One of the most complicated decisions in developing any new programming language today must surely be where to draw the line separating standard library facilities from those to be provided externally. Provide too little, and you get a zillion incompatible external implementations popping up (C++ and strings; JavaScript and DOM manipulations). On the other hand, go too far, and you get your entire community relying on mediocre facilities, or worse, multiple competing facilities in your own standard (Java and GUIs; D in general). Likewise, if you have a common repository for additional libraries, you can be too restrictive on contributions and wind up with many basics still not covered (C++ and Boost) or you can be too open and wind up with a whole load of substandard or incomplete junk (Perl and CPAN).
Yes, Java is not elevated to great language status by the wealth of libraries. It gets the job done and it is possible to be productive with it, but many times you have to fight it. The language drags the libraries down in this case. In most other modern languages, I would say the libraries are what matters.
Racket has a decent repository (PLaneT) for libraries and easy ways to wrap C libraries.
Exactly. Looking from the other side, I suspect Java's much more comprehensive library caused more programmers to favour it over C++ than Java's garbage collection ever did.
I think the almost symbiotic relationship between C# and the .Net libraries today is an interesting case. It seems clear that several of the language features added to C# (or the underlying .Net execution model, if you prefer) in recent years were motivated by particular ways of working with the libraries. Usually, we see mostly one-way traffic, with standard libraries trying to paper over any cracks in the underlying language.
I think that ease to create libraries is the key here.
I should point that the existence of specific libraries can be seen as a library creation with zero effort. So heavy-library-weight Java can be seen as a very productive language, but only when you use already created libs.
The difference between languages shows when you're on your own, when there's no library or tool under your hand. When you cannot find a giant to stand on his shoulders.
If we consider libraries part of the language, then I would say yes. All lisp implementations lack something for someone. And a language with great libraries may appear to be higher than others in some perspective because they offer a set of great existing tools. As far as limiting your thinking, Lisp in itself does no such thing, the libraries do it.
As a thought, I have sometimes wondered, why is it difficult for me to do something in Racket? It is not because a library is missing (though it could happen), but because it does not limit me. So it does not guide my thinking as much as let's say a strict language like Java.
When I don't have to think about classes with single inheritance and single-dispatch methods, I start to think about class systems, generic methods, multiple dispatch, may ditch classes altogether, go to a great unified graph of data or something crazier. I end up thinking how I should be modeling something and not doing the modeling itself. It does go overboard sometimes :)
You have the typicall overthinking problem. You should just start to write useful functions and then when you really see a need for something like multiple dispatch you have it at hand to solve your problem.
This way your System will grow into what you want you don't have to design everything upfront thats the wrong we to go about it.
(Design is fine but on a much higher level then the object system in your language)
Yes can be. My typical approach is to write down what I want to say in an as idiomatic way as I can. Then I go on to implement the notation that I have come up with.
The code I write is usually very high-level code. It can be written like an acceptance test or feature test. I essentially try to model the business domain of the software as cleanly as possible. I might refactor the code until I can express the domain clearly, with DRY etc.
Implementing all the bits of my DSL is often then the actual problem. Often I meet areas of the domain that are tricky because I have never solved such problems before. I think only my the third implementation of some idea can be something usable. So sometimes it takes a long time to get there! :)
This is only a problem in my personal projects because, well, the main goal is to advance my capabilities and thinking and finishing the project is secondary.
It could be that you have trouble think about these concepts but come up with good solutions in the end. Know that you have these features how would it feel to go back to Java. Then you think something like ok I would implement this with a multimethod and then you can start look for a complicated and ugly designpattern do mimic something like a multimethod.