Snippets on Software
Last edited July 5, 2009
More by Ricardo Herrmann »
The Art of Project Management
http://books.google.com/books?id=q1dJZv4Ycr8C
Human beings, who are almost unique in having the ability to learn from the experience of others, are also remarkable for their apparent disinclination to do so
"Discovering Common Lisp after over a decade of C++, I said to myself — 'What have I been doing with my life?'" -- Rich Hickey, developer of Clojure
Labels: Lisp, C++, Clojure, functional programming
Smalltalk and Oberon proponents did not failed because they were not wholeheartedly following their own ideals. They failed because the world has followed the money and the trends, not the ideals.
Is your brain going to be ready when the revolution comes?
Right now, software is primarily non-compositional. We have libraries and languages, which are built up of smaller libraries and languages. But end products are not designed to be composed; they are mostly designed for the end user only.
An exponential increase in development productivity could come from the fact that theorems compose, but tests don’t.

ThoughtWorks as being different from other software organizations.

  • Leveraging bright people over Making the most of moderate people
  • Flexible career paths over Well-defined roles
  • Delivering business value over Leading edge research
  • Learning new technologies over Mastering established technologies
  • Solving difficult problems over Increasing market share
  • Learning from mistakes over Avoidance of taking risks
  • Delivery to the client over Quarterly results
Haskell Weekly News: May 23, 2009 | The Haskell Sequence
sequence.complete.org/hwn/20090523
The C ADT is implemented simply as String (or char *, for you type theorists, using a notation from Kleene)
Labels: c, humor, plt
Haskell Weekly News: May 23, 2009 | The Haskell Sequence
sequence.complete.org/hwn/20090523
Rule 1 of malloc is the same as rule 1 of air travel: "Attempt at all costs to keep your number of landings equal to your number of takeoffs."
Kurt Gödel is Laughing His Ass Off Right Now - Chris Hecker's Website
chrishecker.com/Kurt_G%C3%B6del_is_Laughing_His_As...
Does anyone want to bet as to which will gain self-awareness first: Wolfram Alpha or Wolfram, Stephen?
TheNewAndy comments on "It took three years to the patent office to ascertain the validity of" a
www.reddit.com/r/programming/comments/8mjmv/it_too...
Don't accept code in a code review unless you'd be happy to put your name on it.
Labels: software engineering, code review
If you believe you are a competent programmer... : programming
www.reddit.com/r/programming/comments/8m56v/if_you...
NASA: If the software isn't perfect, some of the people we go to meetings with might die.
Chapter 4. Graph Oriented Programming - JBoss JBPM 3.0.4 userguide 英文版文档 - 在线文档 - JAVA 编程资料牛鼻站
doc.javanb.com/jboss-jbmp-3-0-4-userguide/graphori...
Overview of the workflow, BPM and orchestration landscape
Labels: BPM, orchestration, workflow
Conal Elliott » The C language is purely functional
conal.net/blog/posts/the-c-language-is-purely-func...
“C programmers” really program not in C, but in the purely functional language cpp. As with any purely functional language, cpp consists only of (nestable) expressions, not statements. Now here’s the clever part: when evaluated (not executed), a cpp expression yields a (pure) value of type C, which is an ADT (abstract type) that represents imperative programs. That value of type C is then executed (not evaluated) by the cpp language’s RTS (run-time system). As a clever optimization, cpp’s RTS actually includes a code generator, considerably improving performance over more naïve implementations of the C abstract data type.
Labels: c, functional programming, monads, humor, Conal Elliott, purely functional
dons-londonhug-decade.pdf (application/pdf Object)
www.galois.com/~dons/talks/dons-londonhug-decade.p...
 
Engineer A: "Spec says this must never happen"
Engineer B: "Can we enforce that in the type system?"
Knowing .NET » Blog Archive » DSL Writers: Put Turing Completeness Out Of Your Mind
www.knowing.net/index.php/2009/04/19/dsl-writers-p...
Start with a general language that you think is readable and take stuff out. If you can’t take out quite a bit, don’t write an external DSL
Mathematics and Computation » On programming language design
math.andrej.com/2009/04/11/on-programming-language...
"There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, the other way is to make it so complicated there are no obvious deficiencies." -- C. A. R. Hoare
AI Summit Slides, Notes, Highlights and Photos — AiGameDev.com
aigamedev.com/coverage/gdc09-slides-highlights
Game AI is any technique that contributes to the perceived intelligence of an entity, regardless of what’s under the hood.
How to Design Programs, Second Edition
www.ccs.neu.edu/home/matthias/HtDP2e/index.html
Bad programming is easy. Idiots can learn it in 21 days, even if they are dummies.
Just because it is not your fault does not mean it is not your problem - virtualdub.org
virtualdub.org/blog/pivot/entry.php?id=245
Just because it is not your fault does not mean it is not your problem
Dr. Dobb's | A Conversation with William Kahan | November 1, 1997
www.ddj.com/article/printableArticle.jhtml;jsessio...

exceptions are not errors unless they are handled badly. Exceptions are opportunities for extra computation.

The DCI Architecture: A New Vision of Object-Oriented Programming
www.artima.com/articles/dci_vision.html
Objects are principally about people and their mental models—not polymorphism, coupling and cohesion

Semantic gap refers to the difference between expressing a problem in its own domain, and expressing it in some programming environment. [..] The programmer's job is to map a problem specified in problem domain semantics into the programming environment semantics. The smaller the semantic gap, the easier the job. The greater the semantic gap, the higher the salary the programmer commands.

20 cynical project management tips | IT Leadership | TechRepublic.com
blogs.techrepublic.com.com/tech-manager/?p=881&tag...
Projects don’t fail in the end; they fail at conception.
[On DVCSs] DAGs are easier to create.  Lines are easier to use.
Wolfram Alpha is Coming -- and It Could be as Important as Google | Twine
www.twine.com/item/122mz8lz9-4c/wolfram-alpha-is-c...
Where Google is a system for FINDING things that we as a civilization collectively publish, Wolfram Alpha is for ANSWERING questions about what we as a civilization collectively know.
Wolfram Alpha is Coming -- and It Could be as Important as Google | Twine
www.twine.com/item/122mz8lz9-4c/wolfram-alpha-is-c...
One of the observations of NKS is that incredibly rich, even unpredictable patterns, can be generated from tiny sets of simple rules and data, when they are applied to their own output over and over again.
Wolfram Alpha is Coming -- and It Could be as Important as Google | Twine
www.twine.com/item/122mz8lz9-4c/wolfram-alpha-is-c...
It has generally not been considered feasible for any one group to hand-curate all knowledge about every subject. This is why the Semantic Web was invented -- by enabling everyone to curate their own knowledge about their own documents and topics in parallel, in principle at least, more knowledge could be represented and shared in less time by more people -- in an interoperable manner. At least that is the vision of the Semantic Web.
Forget the mobile web: One site should work for all - at ZDNet.co.uk
resources.zdnet.co.uk/articles/comment/0,100000298...
Using a mobile makes you a disabled user
Why functional programming? Why Haskell?
book.realworldhaskell.org/read/why-functional-prog...
Peter Landin and Christopher Strachey developed ideas about the foundations of programming languages: how to reason about what they do (operational semantics) and how to understand what they mean (denotational semantics)
The fundamental problems with CSS3 | Matt Wilcox .net
mattwilcox.net/archive/entry/id/1031/
W3C seem to try providing high-level “solutions” instead of low-level tools. It’s a limiting ideology.
How Google and Facebook are using R : Data Evolution
dataspora.com/blog/predictive-analytics-using-r/
The best thing about R is that it was developed by statisticians. The worst thing about R is that… it was developed by statisticians.
Great software is not built, it is grown [97 Things] : Near-Time
97-things.near-time.net/wiki/great-software-is-not...
Great software is not built, it is grown
Sound and Software
johnlato.blogspot.com/
If Perl is for people who want to Get Things Done, then Haskell is for people who want to Do Things Right
Rondam Ramblings: CSS and the meaning of life
rondam.blogspot.com/2009/02/css-and-meaning-of-lif...
"tables are for tabular data, not layout." Why? Just because they are called tables? Here's a news flash: HTML has no semantics beyond how it is rendered! (That's not quite true. Links have semantics beyond their renderings. And maybe label tags. But nothing else in HTML does.) This is the reason that the "semantic web" is still a pipe dream. HTML was supposed to have semantics, but it doesn't. Giving real semantics to a markup language is really really hard. The history of computer science is lousy with failed attempts, from KRL to SGML.
Rondam Ramblings: CSS and the meaning of life
rondam.blogspot.com/2009/02/css-and-meaning-of-lif...
If you know ahead of time what your content is going to be it's not hard to write CSS that will make it look nice. The challenge is writing CSS that looks good if you don't know ahead of time what your content is going to be.
Great programming quotes : programming
www.reddit.com/r/programming/comments/7u315/great_...
"The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying." - John Carmack on software patents
Labels: patents, John Carmack
both Java and C# are rooted in 1980s style OOP to an even greater extent than early C++ is
"I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone" -- Bjarne Stroustrup
C++ Is my favorite garbage collected language because it generates so little garbage
There are more useful systems developed in languages deemed awful than in languages praised for being beautiful--many more
<A HREF="chess.html">"Computer chess" and human chess (12-Oct-1998)
www-formal.stanford.edu/jmc/reti.html
AI will not advance to human level if AI researchers remain satisfied with brute force as a substitute for intelligence.
InfoQ: What Makes Haskell Worth Learning for Real World Applications
www.infoq.com/news/2009/01/rwh-book-interview
Haskell manipulates functions as easily as Perl manipulates strings.
Labels: Haskell
The Perils of Parallel: Larrabee vs. Nvidia, MIMD vs. SIMD
perilsofparallel.blogspot.com/2008/09/larrabee-vs-...
SIMD always has the advantage in raw peak operations per second [over MIMD]. [...] All the instruction fetching, decoding, sequencing, etc., are done once, and shouted out, um, I mean broadcast. The silicon is mainly used for function, the business end of what you want to do. If Nvidia doesn’t have gobs of peak performance over Larrabee, they’re doing something really wrong.
A folding language | Ola Bini: Programming Language Synchronicity
olabini.com/blog/2009/01/a-folding-language/

Of course, blasting out hundreds of thousands of lines a year is missing the point. If a Wizard is given complete technical control over a project (which is usually the smartest thing to do, but companies are rarely very smart), the Wizard will typically write in one of the super-succinct “folding languages” they’ve developed on campus, usually a Lisp or Haskell derivative.

They call them Folding Languages because they write code that writes code that writes code… Wizards swear by it, and there’s no question that they can produce amazingly compact, fast, clean-looking code. But 90% of the devs out there claim they can’t read it, and whine a lot about it to their bosses. Given that most companies can only afford a few Staff Wizards, the Wizards are usually forced to capitulate and use Java or C++. They’re equally comfortable in any language you throw at them, though, and if you force them to use a verbose language, well, you get what you ask for. It still amazes me that companies are bragging about how many lines of code their Wizards have produced. Potential startups take note: your competitors are usually idiots.

prototypes vs classes was: Re: Sun's HotSpot
lists.squeakfoundation.org/pipermail/squeak-dev/19...
'I'm sorry that I long ago coined the term "objects" for this topic because it gets many people to focus on the lesser idea. The big idea is "messaging"' -- Alan Kay, inventor of the term OOP, 1998
Global_Technology_Outlook_Report_2009.pdf (application/pdf Object)
pokgsa.ibm.com/home/b/l/blueprin/web/public/SWGAB_...
 
Analytics: "Forward-looking"
Reporting: "Backward-looking"
Nathan Sanders : Journal - Avoid Casual Parsing
sandersn.com/blog/index.php?title=avoid_casual_par...
The more subtle problem is that regular expressions are exactly what they say: regular. If your parsing problem isn’t regular, you’ll spend a lot of time writing an expression with leaks that can never be fully plugged.
Enfranchised Mind » Random thoughts on Haskell
enfranchisedmind.com/blog/2009/01/15/random-though...
Haskell and Lisp are really opposite ends of a spectrum. In Lisp, all code is data. In Haskell, all data is code.
Enfranchised Mind » Random thoughts on Haskell
enfranchisedmind.com/blog/2009/01/15/random-though...
[In Haskell] you don’t have an int, for example, what you actually have is a closure, a hunk of code, that when executed, will produce an int.
Benefits of programming (doing) versus reading blogs (thinking?) - Stack Overflow
stackoverflow.com/questions/418160/benefits-of-pro...
"Reading, after a certain age, diverts the mind too much from its creative pursuits. Any man who reads too much and uses his own brain too little falls into lazy habits of thinking." -- Albert Einstein
Is anyone else here worried that they've spent so long looking briefly at everything, that they've
www.reddit.com/r/programming/comments/7pd89/is_any...

A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects.

-Robert A. Heinlein

Web Beans was influenced by a number of existing Java frameworks, including Seam, Guice and Spring. However, Web Beans has its own very distinct character: more typesafe than Seam, more stateful and less XML-centric than Spring, more web and enterprise-application capable than Guice.
Nabble - Haskell - Haskell-Cafe - Monads aren't evil
www.nabble.com/Monads-aren%27t-evil-td21362166.htm...
nightmare = unsafePerformIO (getWrongWife >>= sex)
Labels: haskell, humor
The sweet spot, however is in making DSLs business-readable rather than business-writeable.
www.ycombinator.com/pagequotes.txt
www.ycombinator.com/pagequotes.txt
"You can try to control people, or you can try to have a system that represents reality. I find that knowing what's really happening is more important than trying to control people." -- Larry Page
Jay Fields' Thoughts: The Cost of Net Negative Producing Programmers
blog.jayfields.com/2009/01/cost-of-net-negative-pr...
Poorly designed software can cause death, and yet rarely is that kind of thing considered by a programmer.
Jay Fields' Thoughts: The Cost of Net Negative Producing Programmers
blog.jayfields.com/2009/01/cost-of-net-negative-pr...
Java is a great tool for certain tasks, but there are plenty of things to dislike about it. I wouldn't want to work with people too blind to notice that.
Jay Fields' Thoughts: The Cost of Net Negative Producing Programmers
blog.jayfields.com/2009/01/cost-of-net-negative-pr...
most good programmers spend the majority of their time fixing problems created by terrible programmers
Databasing trusted feeds with del.icio.us « Jon Udell
blog.jonudell.net/2008/12/29/databasing-trusted-fe...
life’s too short to write any more CRUD or Web UI than I have to.
9.2 Integrating Planning, Acting, and Learning
www.cs.ualberta.ca/%7Esutton/book/ebook/node96.htm...
Labels: ai planning, machine learning
Jonathan Ellis's Programming Blog - Spyced: CouchDB: not drinking the kool-aid
spyced.blogspot.com/2008/12/couchdb-not-drinking-k...
Poor SQL; even with DSLs being the new hotness, people forget that SQL is one of the original domain-specific languages.
A well written paper has clear components: skeleton, muscles, etc. The skeleton is an acyclic digraph of basic definitions and statements, with cross-references. The meat consists of proofs (muscles) each separately verifiable by competent graduate students having to read no other parts but statements and definitions cited. Intuitive comments, examples and other comfort items are fat and skin: a lack or excess will not make the paper pretty. Proper scholarly references constitute clothing, no paper should ever appear in public without! The trains of thought which led to the discovery are blood and guts: keep them hidden. Other vital parts, like open problems, I skip out of modesty.
Labels: science, writing, tips
Conway's Law - Coding the Architecture
www.codingthearchitecture.com/2008/12/07/conways_l...
Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization's communication structure.
Mark Watson's opinions on Java, Ruby, Lisp, AI, and the Semantic Web: Haskell it is
markwatson.com/blog/2008/12/haskell-it-is.html
Haskell's aiming at fast shared memory machines, Erlang's aiming at fault tolerant distributed systems
Computation and Mathematical Proof
metamodern.com/2008/11/10/26/
Some of what we’d hoped for from (what is now called) the Web hasn’t happened because the foundations of computation are still mud, and no one yet dares try to build very high.
Statistics vs. Machine Learning, fight! (also: ML nomenclature's original sin) - Brendan O'Connor's
anyall.org/blog/2008/12/statistics-vs-machine-lear...
Glossary
Machine learning Statistics
network, graphs model
weights parameters
learning fitting
generalization test set performance
supervised learning regression/classification
unsupervised learning density estimation, clustering
large grant = $1,000,000 large grant = $50,000
nice place to have a meeting:
Snowbird, Utah, French Alps
nice place to have a meeting:
Las Vegas in August
Labels: statistics, machine learning, humor
Brad Abrams : Framework Design Guidelines: Avoiding Abstractions
blogs.msdn.com/brada/archive/2008/12/01/framework-...
Abstractions are almost always necessary, but too many abstractions indicate over-engineered systems. Framework designers should be careful to design for customers, not for their own intellectual pleasure.
Reiser’s “law”: “Software is getting slower faster than hardware is getting faster”
Growing a Language: Sum types vs. typeclasses
eve-language.blogspot.com/2008/11/sum-types-vs-typ...

The main difference between type-classes and sum-types is the following:

type-classes constitute an open-set of types.

sum-types constitute a closed-set of data-constructors.

Looking at it that way, they clearly serve different goals.

Consensus Protocols: Two-Phase Commit at Paper Trail
hnr.dnsalias.net/wordpress/?p=90
Mike Burrows, inventor of the Chubby service at Google, says that "there is only one consensus protocol, and that's Paxos" - all other approaches are just broken versions of Paxos.
What do you buy a programmer for Christmas? « Successful Software
successfulsoftware.net/2008/11/25/what-do-you-buy-...

T-Shirt idea: Happy lisper, sadly curly brace programmer

On the front: (:-))
On the back : {:-(}

Why CouchDB Sucks - Die in a Fire - Eric Florenzano’s Blog
www.eflorenzano.com/blog/post/why-couchdb-sucks/
Every technology has its advantages and its drawbacks. The thing is, when a new technology comes out that looks really promising and cool, everyone writes about all of its advantages, and none of its drawbacks. Then, people start to use it for things it isn't very good at, and they are disappointed.
Ask Reddit: How did the way you code change after 5 or more years of experience? : programming
www.reddit.com/r/programming/comments/7f8fc/ask_re...
"Programs must be written for people to read, and only incidentally for machines to execute." -- Abelson & Sussman
Labels: programming
if customers are ultimately willing to believe false promises, it might be because there is a gap in current technologies.
Is there a Programmability Gap? Definitely. | SuperComputing 08
www.it-director.com/blogs/SuperComputing08/2008/11...
Interestingly, Haskell showed its face. Unlike imperative languages such as C, C++, Java, and the new languages such as Chapel, X10, and Fortress, Haskell is a functional language, as is Erlang. Harnessing parallelism with a functional language is very different (and very much easier) than with an imperative language. Could Haskell (and/or Erlang) be a viable choice for programming in the future? Technically it certainly can. The problem is though the assumption in the mainstream computing community that C, C++, and Java are the only programming languages for mainstream development. It seems then that Haskell and Erlang, even if they would be better languages, are unlikely to take root widely. Fortunately, C++ and Java are taking on board more and more of the declarative idioms that come from functional programming languages. However this is not enough, C++ and Java are still imperative languages and so the assumptions that can be made in functional languages cannot be made.
Coding Horror: Your Favorite NP-Complete Cheat
www.codinghorror.com/blog/archives/001187.html
What do expert programmers do when faced by an intractable problem? They cheat. And so should you! Indeed, some of the modern approximations for the Travelling Salesman Problem are remarkably effective.
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?
(Brian Kernighan)
Intellectuals solve problems: geniuses prevent them.
(Albert Einstein)
Eliminate slogans, exhortations, and targets for the work force asking for zero defects and new levels of productivity. Such exhortations only create adversarial relationships, as the bulk of the causes of low quality and low productivity belong to the system and thus lie beyond the power of the work force.
(W Edwards Deming)
Labels: development, productivity
Scala Lift Off Unconference review | Lambda the Ultimate
lambda-the-ultimate.org/node/2808
When I want to give a metaphorical explanation of Scala I say it's as if Java and SML had an illicit love child midwifed by Haskell.
Labels: programming languages, functional programming, Scala
the { buckblogs :here }: LEGOs, Play-Doh, and Programming
weblog.jamisbuck.org/2008/11/9/legos-play-doh-and-...
You’d never see a Java program that was configured by writing Java code. That screams “hard coding”! But Ruby, you see, is different.
Labels: java, ruby, syntax, configuration
Android: Worst. Bug. Ever. : programming
www.reddit.com/r/programming/comments/7c1s5/androi...
The worst bugs are the ones that affect only you and nobody else. Try getting customer support for that.
Ask compsci: How do you explain Computer Science? : compsci
www.reddit.com/r/compsci/comments/7b33m/ask_compsc...
Mathematicians stand on each other's shoulders, while computer scientists stand on each other's toes. and computer engineers dig each other's graves.
CLOSED-LOOP: Anemic vs. Rich Domain Models
blog.jonasbandi.net/2008/11/anemic-vs-rich-domain-...
Models are forever ... data is a happy side effect.

-David Laribee

The Universe of Discourse : Atypical Typing
blog.plover.com/talk/atypical-typing.html

Wadler's anecdote

I had the chance to talk to Philip Wadler, one of the designers of Haskell and of the Java generics system, before the talk. I asked him about the history of the generics feature, and he told me the following story: At this point in the talk I repeated an anecdote that Wadler told me. After he and Odersky had done the work on generics in their gj and "Pizza" projects, Odersky was hired by Sun to write the new Java compiler. Odersky thought the generics were a good idea, so he put them into the compiler. At first the Sun folks always ran the compiler with the generics turned off. But they couldn't rip out the generics support completely, because they needed it in the compiler in order to get it to compile its own source code, which Odersky had written with generics. So Sun had to leave the feature in, and eventually they started using it, and eventually they decided they liked it.
Labels: Java, generics, Phillip'Wadler, Odersky, Haskell, Sun, history
Planner (programming language) - Wikipedia, the free encyclopedia
en.wikipedia.org/wiki/Planner_programming_language
[..] computer memories were very small by current standards because they were expensive, being made of iron ferrite cores at that time. [..] Lisp had adopted the programming pun of identifying NIL, the empty list with logical false (at memory location 0) because testing for 0 was faster than anything else.
Putting the tea into team: Is that a POJO or a NOJO?
puttingtheteaintoteam.blogspot.com/2008/10/is-that...
This [Anemic Domain Model] is bad because you have the over head of the domain model without its advantages since your service layers still have to do all the hard work, which isn't very different from procedural programming.
Putting the tea into team: Is that a POJO or a NOJO?
puttingtheteaintoteam.blogspot.com/2008/10/is-that...
DTO means something more specific - the term DTO is to do with it's role not it's implementation. A DTO is a NOJO but the terms are not equivalent (things can be NOJOs without being DTOs).
Putting the tea into team: Is that a POJO or a NOJO?
puttingtheteaintoteam.blogspot.com/2008/10/is-that...
An "object" (in object-oriented programming) has identity, state and behaviour. A NOJO has identity and state. A function has behaviour but not state.
An old OS idea is new again: non-installation
www.rebol.com/article/0375.html
every so many years you've got to re-examine your requirements relative to the advancements in hardware
Flexibility is like portibility: there is no flexible code, only code that has been, well, flexed.
Why to Start a Startup in a Bad Economy
www.paulgraham.com/badeconomy.html
the surest route to success is to be the cockroaches of the corporate world. The immediate cause of death in a startup is always running out of money. The cheaper your company is to operate, the harder it is to kill
Life With Alacrity: Collective Choice: Rating Systems
www.lifewithalacrity.com/2005/12/collective_choi.h...
systems available for collective choice. There are selection systems, which are primarily centered on voting and deliberation, opinion systems, which represent how voting could occur, and finally comparison systems, which rank or rate different people or things in a simple, comparative manner.
fartcatcher comments on I'm a beginner web developer and I need advice...
www.reddit.com/r/programming/comments/75tzn/im_a_b...
Learn how to say "no" early and often in a project or you will find yourself doing a lot of work for not a lot of money. In the end, your clients will thank you for keeping them reasonable.
munificent comments on Ask a game dev: Anything you ever wanted to ask a console game programmer?
www.reddit.com/r/programming/comments/75r92/ask_a_...
I'm a pipeline engineer. If it's boring and repetitive, I automate that shit! That's my job!
munificent comments on Ask a game dev: Anything you ever wanted to ask a console game programmer?
www.reddit.com/r/programming/comments/75r92/ask_a_...

While it might not be fair, the game industry's practices reflect the capitalistic nature of the business: they can work people harder because there's so many more people out there who want the work.

That being said, EA is gradually realizing that it takes more than warm bodies to ship games and that well-treated high-quality people are better than a barrel of noobs crunching every week.

Random Bits and Pieces: Share Lisp or it Dies
www.foldr.org/~michaelw/log/programming/lisp/share...
...Please don't assume Lisp is only useful for Animation and Graphics, AI, Bioinformatics, B2B and E-Commerce, Data Mining, EDA/Semiconductor applications, Expert Systems, Finance, Intelligent Agents, Knowledge Management, Mechanical CAD, Modeling and Simulation, Natural Language, Optimization, Research, Risk Analysis, Scheduling, Telecom, and Web Authoring just because these are the only things they happened to list.

Kent M. Pitman

35, lost interest in programming, system administration sucks, don't want to go in management. What
www.reddit.com/r/programming/comments/73vm8/35_los...
the things that people want for you, from you and of you often involve their own failed expectations of themselves
Chapter 9 - OpenGL Programming Guide (Addison-Wesley Publishing Company)
fly.cc.fer.hr/~unreal/theredbook/chapter09.html
Bayesian inference from the outside, vs. Bayesian inference as it is practiced
www.stat.columbia.edu/~cook/movabletype/archives/2...
all models are wrong, but some are useful
A Web OS? Are You Dense? - Ted Dziuba
teddziuba.com/2008/09/a-web-os-are-you-dense.html
Users have pretty basic needs when it comes to computers.  They want word processing, spreadsheets, communications, and games.  These needs have not changed much since the advent of the personal computer.
A Web OS? Are You Dense? - Ted Dziuba
teddziuba.com/2008/09/a-web-os-are-you-dense.html
After a while, everybody wanted to be a programmer.  Since programming is actually kind of hard, many of these folk landed in PHP and HTML, hence the explosion of webapps.  As such, the browser became a feeble example of a "runtime".
Google Chrome and the future of browsers | FactoryCity
factoryjoe.com/blog/2008/09/01/google-chrome-and-t...

some of the ideas are interesting, but most (if not all) already existed as Mozilla bugs. For example, one thread per tab is https://bugzilla.mozilla.org/show_bug.cgi?id=40848, but process per tab is https://bugzilla.mozilla.org/show_bug.cgi?id=452272.

I will not be surprised when people incorrectly claim that already-existing plans for Mozilla 2 (Firefox 4) are “inspired” by Google Chrome.

Hibernate - Mapeamento OneToOne com duplicação de campos. :: Java Free.org
www.javafree.org/javabb/viewtopic.jbb?t=866424
Any fool can write code that a computer can understand. Good programmers write code that humans can understand. (Fowler)
Michael Nielsen » Quantum computing for everyone
michaelnielsen.org/blog/?p=459
No simple concrete explanation of quantum computers is possible. Rather, there is an intrinsic quantum gap between how quantum computers work, and our ability to explain them in simple concrete terms.
Labels: quantum computing
Michael Nielsen » Quantum computing for everyone
michaelnielsen.org/blog/?p=459
Quantum computers cannot be explained in simple concrete terms; if they could be, quantum computers could be directly simulated on conventional computers, and quantum computing would offer no advantage over such computers.
Labels: quantum computing
Alarming Development : Too many cores, not enough brains
alarmingdevelopment.org/?p=117
Multicore programming is an irresistible bait for researchers: it is a hard puzzle, with quantifiable results, and a shot at changing the world. Unfortunately it is turning out that there is little quantifiable difference between the plethora of alternatives, leaving it as a matter of subjective judgment, which they hate.
Make Data Not Look Like Data - Webmonkey
www.webmonkey.com/blog/Make_Data_Not_Look_Like_Dat...

User interface, data, and how users see them

Danny O’Brien’s Oblomovka » Blog Archive » on being a bit of an idiot
www.oblomovka.com/wp/2008/08/20/on-being-a-bit-of-...
"The fundamental cause of trouble in the world today is that the stupid are cocksure while the intelligent are full of doubt." -- Bertrand Russell
Software development dogmata - good practices gone bad | Little Tutorials
littletutorials.com/2008/08/02/software-developmen...
"Do Truth and Falsehood really exist? or only New and Old do exist, and Falsehood is but a truth grown old?" -- Constantine Cavafy, Greek modern poet
Perspectives - Erlang and High-Scale System Software
perspectives.mvdirona.com/CommentView,guid,ca94e6d...
CPU speed increases are now coming more from multiple cores than from frequency scaling a single core. Consequently a language that produces an abundance of parallelism is a an asset rather than a problem.
Stevey's Blog Rants: Business Requirements are Bullshit
steve-yegge.blogspot.com/2008/08/business-requirem...
If you don't already know exactly what to build, then you're in the wrong business. At the very least, you should hire someone who does know. Don't gather business requirements: hire domain experts.
Stevey's Blog Rants: Business Requirements are Bullshit
steve-yegge.blogspot.com/2008/08/business-requirem...
The easiest way to build a product that kicks ass is to start with someone else's great idea (camcorders, for instance), and take stuff away.
7 Essential Guidelines For Functional Design | How-To | Smashing Magazine
www.smashingmagazine.com/2008/08/05/7-essential-gu...
Design is necessarily a relationship between users with problems to solve and designers with solutions to offer.
Stay Hungry, Stay Foolish - Solid State Society | …on Gadgets | Algorithm.com.au
algorithm.com.au/blog/files/solid-state-society.ph...
The traditional hard disk that’s likely to be in your computer right now is made out of a few magnetic circular platters, with a head attached to an actuator arm above the platter that reads and writes the data to it. The head’s such a microscopic distance away from the platter that it’s equivalent to a Boeing 747 flying at 600 miles per hour about six inches off the ground. So, when you next have a hard disk crash (and that’s when, not if), be amazed that the pilot in the 747 flying six inches off the ground didn’t crash earlier.
Shared nothing parallel programming - O'Reilly Radar
radar.oreilly.com/2007/07/shared-nothing-parallel-...
The important challenge is not to allow star developers to write multithreaded code; it is to allow the large army of enterprise developers out there to scale their applications to large numbers of cores.
Stay Hungry, Stay Foolish - Functional Programming Koans | …on Coding | Algorithm.com.au
algorithm.com.au/blog/files/e760be4709038dff852def...
The Koan of Lazy Evaluation: Michel Mauny was giving a guest lecture to new computer science students. After the students were seated, Michel pronounced “Today’s lecture will be about Lazy Evaluation”, he paused for a moment then concluded with, “Are there any questions?”
If you are chronically bumping into the limitations of single-assignment then you’re doing it wrong.
Why Dynamic Languages are a Hot Topic | LispCast
www.lispcast.com/drupal/node/43
Old features are old news. Nobody cares that C has a conditional! Or that Lisp has a garbage collector! What can your language give me?
Java is not Object Oriented | LispCast
www.lispcast.com/drupal/node/55
Library-oriented programming parallels Lisp's Language-oriented programming---where programmers write functions and macros then take a step back and realize they have written a whole new language. Could this be one of the reasons Java libraries flourish while Common Lisp's libraries don't?
Java is not Object Oriented | LispCast
www.lispcast.com/drupal/node/55
Libraries have their own means of encapsulation (through interface classes) and their own means of combination (also through the interface classes).
Java is not Object Oriented | LispCast
www.lispcast.com/drupal/node/55
A library (in OO languages) is a collection of classes designed and made to be used together in an organized way.
The Paradigm Cycle | LispCast
www.lispcast.com/drupal/node/57
Paradigm Cycle: programmers program using the features of a language. Best practices emerge as to how to use those features to write better code---a paradigm emerges. Programmers discipline themselves to follow the best practices. Then the paradigm becomes integrated into the language itself. Linguistic constructs for the concepts of the best practices start showing up. Programmers get used to their language having those features. Then they take the paradigm for granted.
A Neighborhood of Infinity: The Fibonacci Numbers, Coalgebraicaly
sigfpe.blogspot.com/2008/07/fibonacci-numbers-coal...
one difference between mathematics and computer science is that mathematics has more of a bias towards algebraic rather than coalgebraic structures
Michael Nielsen » Shirky’s Law and why (most) social software fails
michaelnielsen.org/blog/?p=451
The team that developed Flickr wasn’t originally building a photo sharing service. They were building a multiplayer online game, and decided to let players share photos with one another. When they realized the players were more interested in sharing photos than playing the game, they dumped the game, and built Flickr.
Entrepreneurship 101 - a knol by Angelo Mastrangelo
knol.google.com/k/angelo-mastrangelo/entrepreneurs...
Entrepreneurship is special because it is an opportunity to get to the top of an organization based strictly on ones own merits.
Labels: entrepreneurship
thinking I can adhoccumulate expertise efficiently
approaching infinity: Crash course in Applied Functional Programming
ai.redsymbol.net/2008/07/crash-course-in-applied-f...
the definition of a high level language: if it lets you program by specifying what instead of how
Official Google Blog: Our Googley advice to students: Major in learning
googleblog.blogspot.com/2008/07/our-googley-advice...
How do we find these non-routine savants? There are many factors, of course, but we primarily look for ...

... analytical reasoning. Google is a data-driven, analytic company. When an issue arises or a decision needs to be made, we start with data. That means we can talk about what we know, instead of what we think we know.

... communication skills. Marshalling and understanding the available evidence isn't useful unless you can effectively communicate your conclusions.

... a willingness to experiment. Non-routine problems call for non-routine solutions and there is no formula for success. A well-designed experiment calls for a range of treatments, explicit control groups, and careful post-treatment analysis. Sometimes an experiment kills off a pet theory, so you need a willingness to accept the evidence even if you don't like it.

... team players. Virtually every project at Google is run by a small team. People need to work well together and perform up to the team's expectations.

... passion and leadership. This could be professional or in other life experiences: learning languages or saving forests, for example. The main thing, to paraphrase Mr. Drucker, is to be motivated by a sense of importance about what you do.
Labels: problem solving
Lead Generation | Jetfar
jetfar.com/category/lead-generation/
A site’s signup page is the second most important page on a site (the most important is the home page itself) because this is where you’re asking for committment.
Want to Learn Haskell? - The Something Awful Forums
forums.somethingawful.com/showthread.php?threadid=...
Haskell's type system and functions on it form a very nice, fairly large category called "Hask", so writing haskell code is really just writing arrows in Hask
Labels: Haskell, Hask, category theory
Want to Learn Haskell? - The Something Awful Forums
forums.somethingawful.com/showthread.php?threadid=...
Category Theory starts with the observation that many properties of mathematical systems can be unified and simplified by a presentation with diagrams of arrows.
Labels: category theory
I'll get to your application in a minute - First, we need to build the framework : Jeffrey Palermo
jeffreypalermo.com/blog/i-ll-get-to-your-applicati...
Creating frameworks is fun because the programmer is the customer of the framework.  Writing software for yourself can be more fun than writing software for someone else.  Writing a framework is writing software for yourself.  On a client's dime, this is typically not acceptable.
Labels: frameworks
Deadlock - Wikipedia, the free encyclopedia
en.wikipedia.org/wiki/Deadlock

There are four necessary conditions for a deadlock to occur, known as the Coffman conditions from their first description in a 1971 article by E. G. Coffman.

  1. Mutual exclusion condition: a resource that cannot be used by more than one process at a time
  2. Hold and wait condition: processes already holding resources may request new resources
  3. No preemption condition: only a process holding a resource may release it
  4. Circular wait condition: two or more processes form a circular chain where each process waits for a resource that the next process in the chain holds

Deadlock can only occur in systems where all 4 conditions hold true.

Labels: deadlock, Coffman conditions
Haskell Weekly News: July 9, 2008 | The Haskell Sequence
sequence.complete.org/hwn/20080709
Extreme Anger Programming: you are paired with a really dumb partner and after twenty minutes of agony you rip the keyboard from their hands, delete everything they typed, and do it yourself
prog21: Functional Programming Went Mainstream Years Ago
prog21.dadgum.com/31.html
The answer to "When will Haskell finally go mainstream?" is "most of it already has."
Labels: Haskell, functional programming
Generics in Java evolved directly from Haskell type classes
Labels: java, generics, haskell, typeclasses, Phillip Wadler
Java theory and practice: Going wild with generics, Part 2
www.ibm.com/developerworks/java/library/j-jtp07018...
In the Java language, arrays are covariant (because an Integer is also Number, an array of Integer is also an array of Number), but generics are not (a List<Integer> is not a List<Number>.) People can argue over which choice was "right" and which was "wrong" — of course, both have pros and cons — but there is no question that having two similar mechanisms for constructing derived types with subtly different semantics is a substantial source of confusion and mistakes.
Labels: java, generics
Bill Clementson's Blog: The Most Important Idea in Computer Science
bc.tech.coop/blog/060224.html
Don't worry about what anybody else is going to do. The best way to predict the future is to invent it.
Labels: entrepreneurship
Building a Software Company: How to sell your software for $20,000
nukemanbill.blogspot.com/2008/06/how-to-sell-your-...
  1. Find software out there that sells for $20,000 a copy
  2. Pick the products that are supporting a handful of million-dollar companies
  3. Build the product but only with the core features
  4. Get your name out in the industry
  5. Present yourself as consultingware -- it won't matter that it's you against big companies
Labels: entrepreneurship
Computerworld - The A-Z of Programming Languages: Forth
www.computerworld.com.au/index.php/id;766897508;pp...
Forth is an amplifier: a good programmer can write a great program; a bad programmer a terrible one. I feel no need to cater to bad programmers.
Labels: Forth
Some Haskell Misconceptions: Idiomatic Code, Purity, Laziness, and IO « Geek Rant
geekrant.wordpress.com/2008/06/23/misconceptions/
Haskell is not really a lazy language as much as it is a lazy-by-default language. It is simple and idiomatic to use strictness where your program calls for it.
Labels: Haskell, lazy evaluation, strictness
Some Haskell Misconceptions: Idiomatic Code, Purity, Laziness, and IO « Geek Rant
geekrant.wordpress.com/2008/06/23/misconceptions/
Strictly evaluating a lazy structure and lazily evaluating a strict structure does the exact same thing! With strict evaluation only, we run out of memory on huge structures like streams. With lazy evaluation only, we run out of memory on huge computations like loops.
Labels: Haskell, lazy evaluation, strict evaluation, data structures
InfoQ: RAM is the new disk...
www.infoq.com/news/2008/06/ram-is-disk
In essence MapReduce works by repeatedly sorting and merging data that is streamed to and from disk at the transfer rate of the disk. Contrast this to accessing data from a relational database that operates at the seek rate of the disk (seeking is the process of moving the disk's head to a particular place on the disk to read or write data). So why is this interesting? Well, look at the trends in seek time and transfer rate. Seek time has grown at about 5% a year, whereas transfer rate at about 20%. Seek time is growing more slowly than transfer rate - so it pays to use a model that operates at the transfer rate. Which is what MapReduce does.
Labels: MapReduce
InfoQ: RAM is the new disk...
www.infoq.com/news/2008/06/ram-is-disk
For random access, disks are irritatingly slow; but if you pretend that a disk is a tape drive, it can soak up sequential data at an astounding rate; it’s a natural for logging and journaling a primarily-in-RAM application.
InfoQ: RAM is the new disk...
www.infoq.com/news/2008/06/ram-is-disk
with data-center networks getting faster, it’s not only cheaper to access memory than disk, it’s cheaper to access another computer’s memory through the network
Guide to Constraint Programming
kti.mff.cuni.cz/~bartak/constraints/
"Constraint programming represents one of the closest approaches computer science has yet made to the Holy Grail of programming: the user states the problem, the computer solves it."

Eugene C. Freuder, CONSTRAINTS, April 1997

  • Any given program, once deployed, is already obsolete.
  • It is easier to change the specification to fit the program than vice versa.
  • If a program is useful, it will have to be changed.
  • If a program is useless, it will have to be documented.
  • Only ten percent of the code in any given program will ever execute.
  • Software expands to consume all available resources.
  • Any non-trivial program contains at least one error.
  • The probability of a flawless demo is inversely proportional to the number of people watching, raised to the power of the amount of money involved.
  • Not until a program has been in production for at least six months will its most harmful error be discovered.
  • Undetectable errors are infinite in variety, in contrast to detectable errors, which by definition are limited.
  • The effort required to correct an error increases exponentially with time.
  • Program complexity grows until it exceeds the capabilities of the programmer who must maintain it.
  • Any code of your own that you haven't looked at in months might as well have been written by someone else.
  • Inside every small program is a large program struggling to get out.
  • The sooner you start coding a program, the longer it will take.
  • A carelessly planned project takes three times longer to complete than expected; a carefully planned project takes only twice as long.
  • Adding programmers to a late project makes it later.
  • A program is never less than 90% complete, and never more than 95% complete.
  • If you automate a mess, you get an automated mess.
  • Build a program that even a fool can use, and only a fool will want to use it.
  • Users truly don't know what they want in a program until they use it.
  •  
    What is Data Mining?

    Automatically sifts through data to find hidden patterns, discover new insights, and make predictions.

    Data Mining can provide valuable results:
    • Identify factors more associated with a business problem (Attribute Importance)
    • Predict customer behavior (Classification)
    • Predict or estimate a value (Regression)
    • Find profiles of targeted people or items(Decision Trees)
    • Segment a population (Clustering)
    • Determine important relationships and "market baskets" within the population (Associations)
    • Find fraudulent or "rare events" (Anomaly Detection)
    Labels: data mining
    Continuations - Jetty - Codehaus
    docs.codehaus.org/display/JETTY/Continuations

    With most web applications today, the number of simultaneous users can greatly exceed the number of connections to the server. This is because connections can be closed during the frequent pauses in the conversation while the user reads the content or completes in a form. Thousands of users can be served with hundreds of connections.

    But AJAX based web applications have very different traffic profiles to traditional webapps. While a user is filling out a form, AJAX requests to the server will be asking for for entry validation and completion support. While a user is reading content, AJAX requests may be issued to asynchronously obtain new or updated content. Thus an AJAX application needs a connection to the server almost continuously and it is no longer the case that the number of simultaneous users can greatly exceed the number of simultaneous TCP/IP connections.

    If you want thousands of users you need thousands of connections and if you want tens of thousands of users, then you need tens of thousands of simultaneous connections. It is a challenge for java web containers to deal with significant numbers of connections, and you must look at your entire system, from your operating system, to your JVM, as well as your container implementation.

    -- Axioms of Web architecture
    www.w3.org/DesignIssues/Principles.html
    Be liberal in what you require but conservative in what you do
    -- Axioms of Web architecture
    www.w3.org/DesignIssues/Principles.html
    If someone else had already invented your system, would theirs work with yours?
    The Database Programmer: Why I Do Not Use ORM
    database-programmer.blogspot.com/2008/06/why-i-do-...
    An impedance mismatch occurs when two devices are connected so that neither is operating at peak efficiency. This lack of efficiency is not due to any intrinsic incompatibilities between the devices, it only exists once they are connected together the wrong way. Object Relational Mapping (ORM) does not cure a pre-existing impedance mismatch, it creates one, because it connects databases to applications in a way that hobbles both.
    Typical Programmer - Doing it wrong: getters and setters
    typicalprogrammer.com/?p=23
    getters and setters should be avoided because they break the encapsulation OOP offers
    Typical Programmer - Doing it wrong: getters and setters
    typicalprogrammer.com/?p=23
    In Java, you have to use getters and setters because using public fields gives you no opportunity to go back and change your mind later to using getters and setters. So in Java, you might as well get the chore out of the way up front. In Python, this is silly, because you can start with a normal attribute and change your mind at any time, without affecting any clients of the class. So, don’t write getters and setters.
    High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions.
    Wide Awake Developers: Six Word Methods
    www.michaelnygard.com/blog/2008/06/six_word_method...
    Tom DeMarco makes the interesting point that the software industry had grown from zero to $300 billion dollars (in 1993). This indicates that the market had at least $300B worth of demand for software, even while complaining continuously about the cost and quality of the very same software. It seems to me that the demand for software production, together with the time and cost pressures, has only increased dramatically since then.
    Wide Awake Developers: Six Word Methods
    www.michaelnygard.com/blog/2008/06/six_word_method...

    the sometimes dubious responses that various technology and development methods' offer to the overwhelming demand for software production. 

    Waterfall: Nevermind backlog, requirements were signed off.

    RAD: Build prototypes faster than discarding them.

    Offshore outsourcing: Army of cheap developers producing junk.

    Onshore outsourcing: Same junk, but with expensive developers.

    Agile: Avoid featuritis; outrun pesky business users.

    Domain-specific languages: Compress every problem into one-liners.

    CMMi: Enough Process means nothing's ever wasted.

    Relational Databases: Code? Who cares? Data lives forever.

    Model-driven architecture: Jackson Pollack's models into inscrutable code.

    Web Services: Terrorize XML until maximum reuse achieved.

    FORTH: backward writing IF punctuation time SAVE.

    SOA: Iron-fisted governance ensures total calcification.

    Intentional programming: Parallelize programming... make programmers of everyone.

    Google as IDE: It's been done, probably in Befunge.

    Open-source: Bury the world in abandoned code.

    Mashups: Parasitize others' apps, then APIs change.

    LISP: With enough macros, one uberprogrammer sufficies.

    perl: Too busy coding to maintain anyway.

    Ruby: Meta-programming: same problems, mysterious solutions.

    Ocaml: No, try meta-meta-meta-programming.

    Groovy: Faster Java coding, runs like C-64.

    Software-as-a-Service: Don't write your own, rent ours.

    Cloud Computing: Programmers would go faster without administrators.

    Labels: development, humor
    Michael Feathers' Blog: The Flawed Theory Behind Unit Testing
    michaelfeathers.typepad.com/michael_feathers_blog/...

    Design by Contract works.  Test Driven Development works.  So do Clean Room, code inspections and the use of higher-level languages. 

    All of these techniques have been shown to increase quality.  And, if we look closely we can see why: all of them force us to reflect on our code.

    That’s the magic, and it’s why unit testing works also.

    Labels: development
    Michael Feathers' Blog: The Flawed Theory Behind Unit Testing
    michaelfeathers.typepad.com/michael_feathers_blog/...
    software development is a long-haul activity.  We need practices which help us achieve continuous discipline and a continuous state of reflection.
    Lazy Error Handling in Java, Part 3: Throwing Away Throws « Apocalisp
    apocalisp.wordpress.com/2008/06/04/throwing-away-t...
    what do you think Java’s existing error handling is? It’s a monad. No, really, it is. In fact, Java is one big monad with bells on.
    Lazy Error Handling in Java, Part 3: Throwing Away Throws « Apocalisp
    apocalisp.wordpress.com/2008/06/04/throwing-away-t...
    Java’s throws keyword is the Kleisli arrow for Java’s exceptions functor
    The Art of AI Sidekicks: Making Sure Robin Doesn't Suck — AiGameDev.com
    aigamedev.com/discussion/art-of-sidekicks

    “AI only needs to be as good as the character’s life expectancy.”

    That’s the rule of thumb for the AI programming world.

    Lazy Error Handling in Java, Part 2: Thrower is a Monad « Apocalisp
    apocalisp.wordpress.com/2008/05/22/thrower-is-a-mo...
    Unfortunately, you’ll find that you can’t write a generic Monad class in Java. Poor Java’s type system is not sophisticated enough to understand higher-kinded types, nor would that be sane without type inference in the compiler, which Java also lacks.
    Lazy Error Handling in Java, Part 3: Throwing Away Throws « Apocalisp
    apocalisp.wordpress.com/2008/06/04/throwing-away-t...
    what does an Exception give you, really? You get some information about the failure, like an Exception type name, an error message, a stack trace, and possibly a nested Exception. If you know how to recover from an error, are you going to need the stack trace and the error message? No.
    It should be abundantly clear that introducing null into a language is not much of a solution to anything. We don’t do that with natural language, and certainly not in formal logic, so why do it with programming languages?
    Growing a Language by Guy Steele - good coders code, great reuse
    www.catonmat.net/blog/growing-a-language-by-guy-st...
    Should a programming language be small or large? A small programming language might take but a short time to learn. A large programming language may take a long, long time to learn, but then it is less hard to use, for we then have a lot of words at hand — or, I should say, at the tips of our tongues — to use at the drop of a hat. If we start with a small language, then in most cases we can not say much at the start. We must first define more words; then we can speak of the main thing that is on our mind. […] If you want to get far at all with a small language, you must first add to the small language to make a language that is more large.
    Growing a Language by Guy Steele - good coders code, great reuse
    www.catonmat.net/blog/growing-a-language-by-guy-st...
    A main goal in designing a language should be to plan for growth. The language must start small, and the language must grow as the set of users grows.
    In theory, spawning threads and processes on linux is pretty much the same.  The only difference between starting a thread and a process is flipping a bit to say that the page table needs to be copied on write. 
    Conor McBride's Publications
    strictlypositive.org/publications.html
    The more static information your compiler has, the better the object code it can spit out. Epigram has more static information than we know what to do with.
    InfoQ: Oracle's Cameron Purdy Looks at 10 Patterns for Scaling Out
    www.infoq.com/news/2008/05/scaling-out

    Oracle's Cameron Purdy Looks at 10 Patterns for Scaling Out

    10 - Understanding the Problem
    9 - Define the Requirements
    8 - Architecture Trumps Technology
    7 - Understand the Basics
    6 - Visualize the Networks
    5 - Visualize the Design
    4a - Plan for Overload
    4b - Partition for Scalability
    3a - Plan for Failure
    3b - Replicate for Availability
    2 - Tier Where It Makes Sense
    1 - Simplify
    Labels: scalability, tips
    reddit.com: Ask proggit: Are there any good discussions of the Erlang runtime?
    reddit.com/info/6lf0s/comments/
    we shouldn't do Erlang-in-X, we should do X-in-ErlangVM
    Labels: erlang
    Datawocky: Are Machine-Learned Models Prone to Catastrophic Errors?
    anand.typepad.com/datawocky/2008/05/are-human-expe...
    If Google is unwilling to trust machine-learned models for ranking search results, can we ever trust such models for more critical things, such as flying an airplane, driving a car, or algorithmic stock market trading?
    Labels: machine learning
    Learning JavaScript Programming Language through Video Lectures - good coders code, great reuse
    www.catonmat.net/blog/learning-javascript-programm...
    World’s most misunderstood programming language - has “Java” in its name and “Script”. It has nothing to do with Java programming language and it’s a real programming language not some tiny scripting language
    Labels: javascript
    TANSTAAFL - Wikipedia, the free encyclopedia
    en.wikipedia.org/wiki/TANSTAAFL
    To get one thing that we like, we usually have to give up another thing that we like. Making decisions requires trading off one goal against another.
    How Reddit Will (Maybe) Save Software Development : So Jake Says:
    www.jakevoytko.com/blog/2008/05/12/how-reddit-will...
    Programming failures are due to a lack of rigor at all levels. The requirements suck, so the design sucks, so the interaction between modules suck. These problems will continue to persist until development practices assume that the developer and designers are making mistakes, and does everything possible to correct the mistakes early. This will be done, not by a slick methodology from a book, but rather a karma-based social programming application.
    Wide Awake Developers: The JVM is Great, But...
    www.michaelnygard.com/blog/2008/05/the_jvm_is_grea...
    Normal attrition means that the largest population of developers will always be the youngest and least experienced. This is not a training problem: in the post-commoditization world, the majority of code will always be written by undertrained, least-cost coders.
    Java theory and practice: Stick a fork in it, Part 1
    www.ibm.com/developerworks/java/library/j-jtp11137...
    Hardware trends drive programming idioms
    Why a computer program cannot pick a model for you
    www.curvefit.com/you_must_pick_model.htm
    Don't use a computer program as a way to avoid understanding your experimental system, or to avoid making scientific decisions.
    realtimecollisiondetection.net - the blog » Design patterns are from hell!
    realtimecollisiondetection.net/blog/?p=44
    What annoys me more than Design Patterns is when programmers talk about designing for “reuse”. Instead, how about designing for use?
    Interoperability Happens - Groovy or JRuby?
    blogs.tedneward.com/2008/04/29/Groovy+Or+JRuby.asp...
    Lesson to the Java community from the CLR community: not all features of the virtual machine have to be exposed in one language. Not even C# or VB do this.
    Official Google Blog: What makes a design "Googley"?
    googleblog.blogspot.com/2008/04/what-makes-design-...
    Googley Design Principles:
    1. Focus on people—their lives, their work, their dreams.
    2. Every millisecond counts.
    3. Simplicity is powerful.
    4. Engage beginners and attract experts.
    5. Dare to innovate.
    6. Design for the world.
    7. Plan for today's and tomorrow's business.
    8. Delight the eye without distracting the mind.
    9. Be worthy of people's trust.
    10. Add a human touch.
    Rands In Repose: A Glimpse and a Hook
    www.randsinrepose.com/archives/2007/02/25/a_glimps...
    A resume is not a statement of facts. It’s a declaration of intent.
    What we lost (now that web programming is mainstream)
    antirez.com/post/what-we-lost.html
    Fifteen/Twenty years ago to approach programming meant to start hacking with C, writing some cool demo accessing directly with VGA registers, learning algorithms and data structures. This is the background where the star developers of today grown, now that everything is an hash table, some nice looking XHTML and few ugly but optimized SQL queries I wonder what the level of developers will be in ten years, and I've no reasons to be optimist.
    Lazy vs. non-strict - HaskellWiki
    haskell.org/haskellwiki/Lazy_vs._non-strict
    Laziness is simply a common implementation technique for non-strict languages, but it is not the only possible technique. One major drawback with lazy implementations is that they are not generally amenable to parallelisation.
    Why There Aren't More Googles
    www.paulgraham.com/googles.html
    Don't worry about people stealing your ideas. If your ideas are any good, you'll have to ram them down people's throats.
    Do not seek to follow in the footsteps of the men of old; seek what they sought.
    Technical Revenue: The Young Man's Business Model
    paultyma.blogspot.com/2008/04/young-mans-business-...
    the best business model is one that makes your customer money. I didn't say "saves" them money - big difference.
    Google Developers Day US - Theorizing from Data
    video.google.com/videoplay?docid=-7111461506729989...
    It is a capital mistake to theorize before one has data.
    reddit.com: Do you buy/download a lot of academic books meaning to read them "later", but really
    reddit.com/info/6f0fz/comments/
    Eco once said, the value of a library did not lie in its books you have read already. The true value was constituted by the volumes you still had the chance to read ('negative library').
    Notional Slurry » Search algorithms
    williamtozier.com/slurry/2008/04/02/search-algorit...
    I don’t care if you’re an Operations Research guru or a lone stock trader looking to make a buck, no problem is single-objective.
    Gojko Adzic » Lazy web sites run faster
    gojko.net/2008/04/07/lazy-web-sites-run-faster/
    The CAP theorem coined by Dr. Eric A. Brewer in ‘98 says that any system can have at most two from the following group of properties: Consistency, Availability, tolerance to network Partitioning.
    April 1st special: The War of the Worlds | Lambda the Ultimate
    lambda-the-ultimate.org/node/2749#comment-41078
    Haskell makes a fine imperative language — "the world's finest imperative language", according to Erik Meijer. It only asks that, ideally, you annotate the type of imperative functions - confess their sins, as it were.
    The Ten Worst Job Interview Questions Ever | Business Pundit
    www.businesspundit.com/the-ten-worst-job-interview...
    If you’re one in a million, you have 1,000 clones in the People’s Republic of China.
    The Secret Diary of Steve Jobs: Google putting up fence and gate to keep execs from leaving
    fakesteve.blogspot.com/2008/04/google-putting-up-f...
    There is something really evil about taking thousands of the world's smartest young people and using them to sell online text ads more efficiently.
    Labels: google, humor
    [JavaSpecialists 158] - Polymorphism Performance Mysteries Explained
    www.javaspecialists.eu/archive/Issue158.html
    The amazing performance of inlining code should affect how we code Java. We should stay clear of long methods and rather break them up more.
    [JavaSpecialists 158] - Polymorphism Performance Mysteries Explained
    www.javaspecialists.eu/archive/Issue158.html
    be extra careful with empty loops that you inserted into your code instead of Thread.sleep(). Since Java 6, they are in danger of being removed.
    Haskell's pattern matching and operator overloading are responsible for the elegance of the presentation, but it is lazy evaluation that is responsible for the elegance of the computation.
    Datawocky: More data usually beats better algorithms
    anand.typepad.com/datawocky/2008/03/more-data-usua...
    First generation search engines had used only the text of the web pages themselves. The addition of these two additional data sets -- hyperlinks and anchortext -- took Google's search to the next level. The PageRank algorithm itself is a minor detail -- any halfway decent algorithm that exploited this additional data would have produced roughly comparable results.
    Why does everything suck?: The Death of the Relational Database
    whydoeseverythingsuck.com/2008/02/death-of-relatio...
    How great would it be if when we thought of a new piece of information that we want to capture, we could simply add it to our existing database? Or perhaps if we can add things this easily it is more like a knowledge base than a database.
    Why does everything suck?: The Death of the Relational Database
    whydoeseverythingsuck.com/2008/02/death-of-relatio...
    Storing the relationships between objects *in* the objects is a problem.
    Wumpus World - fa.haskell | Google Groups
    groups.google.com/group/fa.haskell/msg/01c680ef1db...
    30 years ago people were writing papers showing that Lisp was better than very badly written Prolog. Now they are writing papers showing that Haskell is better than very badly written Prolog. How things have changed! NOT.

    The most common reasons optimization problems can't be solved with Mathematical Programming include:

    • Constraints that are non-linear in nature, or that are linearized into an exponential number of linear constraints
    • A non-convex solution space that contains many local optima
    • Many disjunctions that result in a highly fractional relaxation with poor lower bounds
    Music and Design Patterns : So Jake Says:
    www.jakevoytko.com/blog/2008/03/24/music-and-desig...

    Level of Implementation of a Pattern

    • Invisible: So much a part of language that you don’t notice. (e.g. when class replaced all uses of struct in C++, no more “Encapsulated Class” pattern.)
    • Informal: Referred to by name, but must be implemented from scratch for each use.
    • Formal: Implement pattern itself within the language; Instantiate/call it for each use; Usually implemented with macros.
    You Weren't Meant to Have a Boss
    www.paulgraham.com/boss.html
    If you're not allowed to implement new ideas, you stop having them.
    Tom White: "Disks have become tapes"
    www.lexemetech.com/2008/03/disks-have-become-tapes...
    Replace "seeks" with "transfers" and "transaction processing" with "MapReduce" and I think over time we'll start seeing Hadoop installations that choose to use large numbers of smaller capacity disks to maximize their processing rates.
    Tom White: "Disks have become tapes"
    www.lexemetech.com/2008/03/disks-have-become-tapes...
    Programmers have to start thinking of the disk as a sequential device rather than a random access device. Or the more pithy: "Disks have become tapes".
    Valued Lessons: Why are my monads so slow?
    www.valuedlessons.com/2008/03/why-are-my-monads-so...
    Monads are incredibly flexible, but as any decent C.S. major knows, everything comes at a price. Monads give a high level of abstraction and can model a huge variety of computations. There's no reason to expect them to be on par with simpler, to-the-point styles of programming.
    Valued Lessons: Why are my monads so slow?
    www.valuedlessons.com/2008/03/why-are-my-monads-so...
    Here's a summary of what you can do to speed up any functional/immutable-style code, including monadic code when writing in Python:
    • Make object creation as fast as possible. Don't do anything fancy in __init__.

    • Use as few layers of abstraction as possible, especially when there is an object created in each layer.

    • Push common or expensive operations down the layers of abstaction, especially if it avoids creating objects.

    • Avoid using decorators for heavily used functions.

    • Don't use wrapper classes if you don't have to.
    Valued Lessons: Why are my monads so slow?
    www.valuedlessons.com/2008/03/why-are-my-monads-so...
    In the end, it looks like monadic code is about 2-3x slower in Python. Almost all of that is actually the result of just doing things in a functional/immutable way. In particular, creating data structures appears to be the main bottleneck. In functional languagues, these types of operations are very common and optimized heavily, and so are typically very fast. It looks like it's not the same in Python. Just like you have to avoid recursion because there's no tail recursion, it looks like you have to avoid a functional/immutable coding style if you care about performance because object creation is so slow. On the other hand, if you don't mind the peformance hit, it makes the code much more elegant, just like recursion usually does.
    programming: DDC - an explicitly lazy dialect of Haskell which supports destructive update,
    reddit.com/r/programming/info/6csbi/comments/
    D programming language allows dot-syntax for any function whose first argument is a variable of the type before the dot. Syntax matters.
    Slashdot | Scientists' Success Or Failure Correlated With Beer
    science.slashdot.org/article.pl?sid=08/03/19/02112...
    Statistics are like miniskirts; they show a lot but hide the most important facts.
    Slashdot | Scientists' Success Or Failure Correlated With Beer
    science.slashdot.org/article.pl?sid=08/03/19/02112...
    science and prostitution are primarily about pleasing elderly men with deep pockets :-)
    Acid Tripping, Disneyland and Special Relativity
    weblog.raganwald.com/2008/03/acid-tripping-disneyl...
    Lisp guys know all about monkeypatching and dynamism. Those crazy mofos write mind bending macros and morph the language in ways that can only be described as an acid trip inside the ‘it’s a small world’ ride in disneyland
    Acid Tripping, Disneyland and Special Relativity
    weblog.raganwald.com/2008/03/acid-tripping-disneyl...
    Python is a language for pedants. That’s exactly why I like it. There’s (almost) always one “correct” way of doing something, and when you do it that way, you get that warm glow in your heart that we pedants get when we outsmart someone or something.
    Abaababa: Monads are a class of hard drugs
    abaababa.blogspot.com/2008/02/monads-are-class-of-...
    The essence of monads is to use abstract types to enclose a mutable state, providing only a set of carefully-crafted combinators for using it in such a way that you can't duplicate the state but have to use it in a linear, non-branching fashion; that way, the implementation of the monad can use side-effects.
    A dead fish in yesterday’s newspaper [dive into mark]
    diveintomark.org/archives/2008/03/15/dead-fish
    if an electronic-trading system receives an XML message for a transaction valued at €2,000,000, and there’s a problem with a missing end tag, you do not want the system guessing what the message meant
    Making it stick.: Erlang Criticism Not Unwarranted
    patricklogan.blogspot.com/2008/03/erlang-criticism...
    Jini and Javaspaces are the closest thing Java has to Erlang/OTP.
    Pro-Phi-Psi: Why I No Longer Like or Use C++
    prophipsi.blogspot.com/2008/03/why-i-no-longer-lik...
    If you think C++ is not overly complicated, just what is a protected abstract virtual base pure virtual private destructor, and when was the last time you needed one?
    A Retrospective on PAIP
    www.norvig.com/Lisp-retro.html

    What Lessons are in PAIP?

    Here is my list of the 52 most important lessons in PAIP:
    1. Use anonymous functions. [p. 20]
    2. Create new functions (closures) at run time. [p. 22]
    3. Use the most natural notation available to solve a problem. [p. 42]
    4. Use the same data for several programs. [p. 43]
    5. Be specific. Use abstractions. Be concise. Use the provided tools. Don't be obscure. Be consistent. [p. 49]
    6. Use macros (if really necessary). [p. 66]
    7. There are 20 or 30 major data types; familiarize yourself with them. [p. 81]
    8. Whenever you develop a complex data structure, develop a corresponding consistency checker. [p. 90]
    9. To solve a problem, describe it, specify it in algorithmic terms, implement it, test it, debug and analyze it. Expect this to be an iterative process. [p. 110]
    10. AI programming is largely exploratory programming; the aim is often to discover more about the problem area. [p. 119]
    11. A general problem solver should be able to solve different problems. [p. 132]
    12. We must resist the temptation to belive that all thinking follows the computational model. [p. 147]
    13. The main object of this book is to cause the reader to say to him or herself "I could have written that". [p. 152]
    14. If we left out the prompt, we could write a complete Lisp interpreter using just four symbols. Consider what we would have to do to write a Lisp (or Pascal, or Java) interpreter in Pascal (or Java). [p. 176]
    15. Design patterns can be used informally, or can be abstracted into a formal function, macro, or data type (often involving higher-order functions). [p. 177]
    16. Use data-driven programming, where pattern/action pairs are stored in a table. [p. 182]
    17. Sometimes "more is less": its easier to produce more output than just the right output. [p. 231]
    18. Lisp is not inherently less efficient than other high-level languages - Richard Fateman. [p. 265]
    19. First develop a working program. Second, instrument it. Third, replace the slow parts. [p. 265]
    20. The expert Lisp programmer eventually develops a good "efficiency model". [p. 268]
    21. There are four general techniques for speeding up an algorithm: caching, compiling, delaying computation, and indexing. [p. 269]
    22. We can write a compiler as a set of macros. [p. 277]
    23. Compilation and memoization can yield 100-fold speed-ups. [p. 307]
    24. Low-level efficiency concerns can yield 40-fold speed-ups. [p. 315]
    25. For efficiency, use declarations, avoid generic functions, avoid complex argument lists, avoid unnecessary consing, use the right data structure. [p. 316]
    26. A language that doesn't affect the way you think about programming is not worth knowing - Alan Perlis. [p. 348]
    27. Prolog relies on three important ideas: a uniform data base, logic variables, and automatic backtracking. [p. 349]
    28. Prolog is similar to Lisp on the main points. [p. 381]
    29. Object orientation = Objects + Classes + Inheritance - Peter Wegner [p. 435]
    30. Instead of prohibiting global state (as functional programming does), object-oriented programming breaks up the unruly mass of global state and encapsulates it into small, manageable pieces, or objects. [p. 435]
    31. Depending on your definition, CLOS is or is not object-oriented. It doesn't support encapsulation. [p. 454]
    32. Prolog may not provide exactly the logic you want [p. 465], nor the efficiency you want [p. 472]. Other representation schemes are possible.
    33. Rule-based translation is a powerful idea, however sometimes you need more efficiency, and need to give up the simplicity of a rule-based system [p. 509].
    34. Translating inputs to a canonical form is often a good strategy [p. 510].
    35. An "Expert System" goes beyond a simple logic programming system: it provides reasoning with uncertainty, explanations, and flexible flow of control [p. 531].
    36. Certainty factors provide a simple way of dealing with uncertainty, but there is general agreement that probabilities provide a more solid foundation [p. 534].
    37. The strategy you use to search for a sequence of good moves can be important [p. 615].
    38. You can compare two different strategies for a task by running repeated trials of the two [p. 626].
    39. It pays to precycle [p. 633].
    40. Memoization can turn an inefficient program into an efficient one [p. 662].
    41. It is often easier to deal with preferences among competing interpretations of inputs, rather than trying to strictly rule one interpretation in or out [p 670].
    42. Logic programs have a simple way to express grammars [p. 685].
    43. Handling quantifiers in natural languiage can be tricky [p. 696].
    44. Handling long-distance dependencies in natural language can be tricky [p. 702].
    45. Understanding how a Scheme interpreter works can give you a better appreciation of how Lisp works, and thus make you a better programmer [p. 753].
    46. The truly amazing, wonderful thing about call/cc is the ability to return to a continuation point more than once. [p. 771].
    47. The first Lisp interpreter was a result of a programmer ignoring his boss's advice. [p. 777].
    48. Abelson and Sussman (1985) is probably the best introduction to computer science ever written [p. 777].
    49. The simplest compiler need not be much more complex than an interpreter [p. 784].
    50. An extraordinary feature of ANSI Common Lisp is the facility for handling errors [p. 837].
    51. If you can understand how to write and when to use once-only, then you truly understand macros [p. 853].
    52. A word to the wise: don't get carried away with macros [p. 855].
    When classical OO languages (including Ruby and Java) implement inheritance, what actually happens is this: First, the subclass acquires the interface of the superclass (latently typed languages like Ruby don’t do this explicitly, but it is still true). Second, under the hood where you can’t see it, the compiler makes room for a reference to the superclass and arranges for methods that the subclass does not implement to be delegated to the superclass.

    In other words, whenever you declare that Child IS-A Person, the compiler writes “Child HAS-A Person” and “Child BEHAVES-LIKE-A Person” and “Child DELEGATES-TO Person” for you.
    Labels: oop, inheritance, single inheritance
    XMF - An extensible langauge for defining DSLs and language oriented programming
    www.ceteva.com/nutshell.html
    XMF has a first class undo mechanism built into its VM.  With XMF state changes can be undone without needing to understand the precise state changes that have taken place.
    Labels: superlanguages, undo, xmf
    They Write the Right Stuff
    www.fastcompany.com/node/28121/print
    People have to channel their creativity into changing the process, not changing the software.
    Labels: development, processes
    The Fishbowl: Scala is to Java as..
    fishbowl.pastiche.org/2008/03/03/scala_is_to_java_...
    Scala is to Java as C++ is to C.
    Labels: scala, java, c++, c
    InfoQ: CORBA Guru Steve Vinoski on REST, Web Services, and Erlang
    www.infoq.com/interviews/vinoski-qcon-interview
    "If I had to talk to something that was built using CORBA I'd use CORBA. If I was doing some very small scale system that the developers were familiar with the approach, I would use it, but if I had to build an enterprise scale system I would look at REST." -- Steve Vinoski, CORBA Guru
    Labels: corba, rest, development
    Why is SCTP needed given TCP and UDP are widely available? - ISOC Member Briefing #17
    www.isoc.org/briefings/017/

    SCTP vs TCP vs UDP

    Services/Features SCTP TCP UDP
    Connection-oriented yes yes no
    Full duplex yes yes yes
    Reliable data transfer yes yes no
    Partial-reliable data transfer optional no no
    Ordered data delivery yes yes no
    Unordered data delivery yes no yes
    Flow control yes yes no
    Congestion control yes yes no
    ECN capable yes yes no
    Selective ACKs yes optional no
    Preservation of message boundaries yes no yes
    Path MTU discovery yes yes no
    Application PDU fragmentation yes yes no
    Application PDU bundling yes yes no
    Multistreaming yes no no
    Multihoming yes no no
    Protection against SYN flooding attacks yes no n/a
    Allows half-closed connections no yes n/a
    Reachability check yes yes no
    Psuedo-header for checksum no (uses vtags) yes yes
    Time wait state for vtags for 4-tuple n/a
    Labels: networking, protocols, internet, tcp, udp, sctp, comparison
    smuglispweeny: Ooh! Ooh! My turn! Why Lisp?
    smuglispweeny.blogspot.com/2008/02/ooh-ooh-my-turn...
    Those parentheses look quite different but constitute only a superficial difference from the conventional chicken scratch syntax of semi-colons, braces, full stops, and brackets.
     Call-by-name lambda-calculus is strictly more expressive (in Felleisen sense) than call-by-value lambda-calculus, and the call-by-need (aka, lazy) lambda-calculus is observationally equivalent to the call-by-name. [..] Adding control effects (shift/reset) changes the expressivity results. Now all three calculi are distinct and none subsumes the other.
    SuperCompilers, LLC - White Paper
    www.supercompilers.com/white_paper.shtml
    The most efficient languages will be the ones that are most amenable to supercompilation; and the best programming style will be the one that ensures human maintainability and maximizes supercompilability.
    SuperCompilers, LLC - White Paper
    www.supercompilers.com/white_paper.shtml
    The efficiency that direct heap manipulation buys may soon pale before the efficiency that it loses by making supercompilation more difficult.
    orwant.com/eggg.html
    orwant.com/eggg.html
    The EGGG language intentionally has no flow control; that's why we call it a description and not a program.
    The Programmers’ Stone » Blog Archive » Haskell Needs A Four Calendar Cafe
    the-programmers-stone.com/2008/02/22/haskell-needs...
    It’s sobering to realize that modern multi-core servers running Enterprise Java Beans to deliver web apps to browsers often underperform early CICS talking to IBM 3270s 30 years ago.
    Gustavo Duarte - A skeptical take on software development and the business thereof.
    www.hsdtaxlaw.com/duartes.org/Shuttle.htm
  • Engineering can only be as good as its relationship with management
  • Big design up front is foolish
  • Software has much in common with other engineering disciplines
  • Reliable systems are built by rigorously tested, incremental bottom-up engineering with an 'attitude of highest quality'
  • A User Interface Definition Language in Common Lisp
    www.defmacro.org/ramblings/ui-dsl.html
    The proper way to implement scaffolding, the way that's actually useful throughout the entire project, not merely at the beginning, is to introspect class definitions and generate high level user interface definition data structures that can later be selectively overridden in a declarative manner.
    One Man Hacking: But Martin, Enterprise Software IS Boring
    ravimohan.blogspot.com/2006/07/but-martin-enterpri...
    "Berlin Wall" effect. In the days of the cold war, to cut through the propoganda of whether Communism was better than Capitalism , all you had to do was to observe in which direction people were trying to breach the Berlin Wall.
    Another benefit of the functional style in a statically typed language is that everything that goes into and out of a method is checked by a type checker, so logic errors are more likely to manifest themselves as type errors.
    λ Tony’s blog λ » Blog Archive » Great Quote Slava
    blog.tmorris.net/great-quote-slava/
    Closures have no place in a low-level procedural language whose target audience consists of programmers unwilling to learn to be productive.
    Comp.compilers: Re: Henry Spencer's "Tcl" Regex Library
    compilers.iecc.com/comparch/article/07-10-026
    Spencer's Tcl regex builds the DFA on the fly from the NFA representation, using a cache to speed the DFA simulation. The cache has a fixed maximum size, though, so it can't end up building an exponentially-large machine either.
    Mathematics and Computation » Representations of uncomputable and uncountable sets
    math.andrej.com/2008/02/06/representations-of-unco...
    It is meaningless to discuss representations of a set by a datatype without also considering operations that we want to perform on the set.
    Equations as icons - physicsworld.com
    physicsworld.com/cws/article/print/27160
    equations such as those of Euler and Einstein attract value and interest beyond the particular scientific inquiries that gave birth to them. They serve as clear and concise examples of what equations and formulas do: they show how seemingly disparate elements are implicated in a unity, and do so concisely, with few moving parts, so to speak.
    UI development is always about dealing with events, and the FSM delivers a structured approach to handling those events.
    I/O is asynchronous… the moment an Ethernet packet is in your
    network card‘s buffers, the card will (yes, asynchronously) kick (interrupt) your CPU and shout “Hey! There‘s a new packet… use it or lose it, pal!”.
    what made git awesome was actually none of the things Linus had talked about, not really. Those things were more like... symptoms of the underlying awesomeness.
    Arc is released | Lambda the Ultimate
    lambda-the-ultimate.org/node/2643
    An hygienic macro is one where the meanings of symbols that aren't parameters to the macro are bound at the definition site rather than the expansion site.
    programming: Is it even possible to create a "high level CPU"?
    reddit.com/r/programming/info/673zc/comments/
    The future is a sea of gates, with no difference between storage and computation.
    research!rsc: Debugging the Universe
    research.swtch.com/2008/01/debugging-universe.html
    Physicists debug the universe. When the universe doesn't behave as expected, they debug it, trying to reconcile their understanding of the universe and what they are seeing. The difference is that the bug, by definition, is always in their understanding and never in the universe.
    Typical Programmer - Relational Database Experts Jump The MapReduce Shark
    typicalprogrammer.com/programming/mapreduce/
    The big innovation MapReduce enables is distributing data processing across a network of cheap and possibly unreliable computers, pretty much the opposite of the ideal RDBMS ecosystem.
    Typical Programmer - Relational Database Experts Jump The MapReduce Shark
    typicalprogrammer.com/programming/mapreduce/
    MapReduce has the same relationship to RDBMSs as my motorcycle has to a snowplow — it’s a step backwards in snowplow technology if you look at it that way.
    Understanding category theory and its practical applications | Lambda the Ultimate
    lambda-the-ultimate.org/node/2604#comment-39235
    category theory is a refined integration of both set theory and the world of functions
    Understanding category theory and its practical applications | Lambda the Ultimate
    lambda-the-ultimate.org/node/2604#comment-39235
    I think we and other creatures chunk the world into pieces we can understand by finding the mappings and functors and so on which allow us to grok the world. We are, I think, category theory engines.
    Natural Language Principles in Perl
    www.wall.org/~larry/natural.html
    You learn a natural language once and use it many times. The lesson for a language designer is that a language should be optimized for expressive power rather than for ease of learning. It's easy to learn to drive a golf cart, but it's hard to express yourself in one.
    DevTopics | 101 Great Computer Programming Quotes
    www.devtopics.com/101-great-computer-programming-q...
    If Java had true garbage collection, most programs would delete themselves upon execution.”
    (Robert Sewell)
    DevTopics | 101 Great Computer Programming Quotes
    www.devtopics.com/101-great-computer-programming-q...
    “C++ : Where friends have access to your private members.”
    (Gavin Russell Baker)
    DevTopics | 101 Great Computer Programming Quotes
    www.devtopics.com/101-great-computer-programming-q...
  • “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)
  • DevTopics | 101 Great Computer Programming Quotes
    www.devtopics.com/101-great-computer-programming-q...
    “I don’t care if it works on your machine!  We are not shipping your machine!”
    (Vidiu Platon)
    Curried functions exist to make partial application easy
    Neil’s point-free blog » Haskell: an Imperative Language with Mutable State
    neilbartlett.name/blog/2007/04/11/haskell-an-imper...

    The construction and manipulation of ST and IO actions does actually happen in a purely functional way — it’s running them which requires some extra effects. This seems like a minor point, but it really does end up being important.

    For example, a function of type (t -> IO s) will compute the same action of type (IO s) when given the same parameter of type t each time.

    Neil’s point-free blog » Haskell: an Imperative Language with Mutable State
    neilbartlett.name/blog/2007/04/11/haskell-an-imper...
    is Haskell really a pure functional language? In my opinion it is not – it’s much more useful than that. It’s a language that allows imperative programming, but uses its strong type system to keep side-effect-producing code from mixing freely with pure functional code. That makes it uniquely powerful.
    older programmers may not burn as much midnight oil as younger ones, but that's not because they are old, but because they get the job done without having to stay up past midnight.
    Topics:Eager Versus Lazy Evaluation - CTMWiki
    www.codepoetics.com/wiki/index.php?title=Topics:Ea...

    the pros and cons of lazy evaluation as a default in Haskell:

    Pros:

    Cons:

    • Laziness "makes it much, much harder to reason about performance, especially space".
    • Laziness "has a real implementation cost".
    • Laziness "can be added to a strict language (although not as easily as you might think)".

    Peyton-Jones concludes that laziness is a "hair shirt", but that it "keeps you honest" (by keeping implementors from sneaking in side-effects).

    Andrey Khavryuchenko himself » Blog Archive » Why I don’t give fixed price. Software developer
    a.khavr.com/2007/12/24/why-i-dont-give-fixed-price...
    An attempt to minimize risk in a software project is similar to an attempt to calculate an outcome of tennis match from the names of players and the brand of rackets. Do really any rational tennis player try to set the game plan ahead?
    Target? TARGET? We don't need no stinkin' Target! - The Panda's Thumb
    www.pandasthumb.org/archives/2006/07/target_target...
    An evolutionary algorithm acts as a probability amplifier
    Pseudo scientific Software Engineering — 2007-12-15 — kirit.com
    www.kirit.com/Blog:/2007-12-15/Pseudo%20scientific...
    Software engineering is pseudo science and rightly so. It will continue to be so right up until the point when users and businesses can give us software specifications with a set of axioms we can use to derive our proofs from. Right now we're lucky if we get a list of conjectures to work from.
    Centralization is a bug
    Let some other process fix the error (Long)
    osdir.com/ml/lang.erlang.general/2003-04/msg00350....
    An error is "a deviation between what the program is supposed to do" and what it is observed to do.
    programming: I build sites in PHP.. should I stop? What is as easy to get going but is "better" to
    programming.reddit.com/info/62shw/comments/
    It's very easy to make mistakes in Haskell, but very hard to make them compile
    Companies buy startups because they're afraid their competitors will.
    Michael’s Random Thoughts » Every open system develops towards the unusable
    www.bluej.org/mrt/?p=31
    Every open system develops towards the unusable
    Perl.com: Programming is Hard, Let's Go Scripting...
    www.perl.com/lpt/a/997
    Human languages differ not so much in what you can say but in what you must say
  • The object-oriented approach does not adequately address the computing requirements of the future.
  • Object-oriented languages have lost the simplicity—some would say purity—that made them special and which were the source of their expressive and development power.
  • Powerful concepts like encapsulation were supposed to save people from themselves while developing software, but encapsulation fails for global properties or when software evolution and wholesale changes are needed. Open Source handles this better. It’s likely that modularity—keeping things local so people can understand them—is what’s really important about encapsulation.
  • Objects promised reuse, and we have not seen much success.
  • Despite the early clear understanding of the nature of software development by OO pioneers, the current caretakers of the ideas have reverted to the incumbent philosophy of perfect planning, grand design, and omniscience inherited from Babbage’s theology.
  • The over-optimism spawned by objects in the late 1990s led businesses to expect miracles that might have been possible with objects unpolluted by static thinking , and when software developers could not deliver, the outrageous business plans of those businesses fell apart, and the result was our current recession.
  • Objects require programming by creating communicating entities, which means that programming is accomplished by building structures rather than by linguistic expression and description through form, and this often leads to a mismatch of language to problem domain.
  • Object design is like creating a story in which objects talk and interact with each other, leading people to expect that learning object-oriented programming is easy, when in fact it is as hard as ever. Again, business was misled.
  • People enthused by objects hogged the road, would not get out of the way, would not allow alternatives to be explored—not through malice but through exuberance—and now resources that could be used to move ahead are drying up. But sometimes this exuberance was out-and-out lying to push others out of the way.
  • object-oriented languages have succumbed to static thinkers who worship perfect planning over runtime adaptability, early decisions over late ones, and the wisdom of compilers over the cleverness of failure detection and repair
    A paradigm fails when the narrative it embodies fails to speak truth or when its proponents embrace it beyond reason.
    constructive nonconformist: The Back Button is Not an Undo Button
    jrdodds.blogs.com/blog/2006/04/the_back_button.htm...
    The ‘back as undo’ argument is often supported by a usability study that shows mere mortal users depend on using the back button as an undo. I think that’s a little bit like using a study that shows automobile drivers speed up on a yellow light to argue for swapping the meanings of green and yellow traffic signals.
    The lambda calculus and combinators can be implemented using reference counting to collect "garbage", because these models do not require directed cycles. Many implementations do use directed cycles, however, for "efficiency" in implementing the Y combinator used to express recursion. However, even with these Y combinator loops, reference counting can still be used to collect garbage, because the Y loops are well-structured
    If you want to build a ship, don’t drum up the men to gather wood, divide the work and give orders. Instead, teach them to yearn for the vast and endless sea.
    —Antoine de Saint-Exupery
    Should Java be banned from schools?
    www.theserverside.com/news/thread.tss?thread_id=47...
    "The use of anthropomorphic terminology when dealing with computing systems is a symptom of professional immaturity" -- Edsger Dijkstra
    "Testing can only prove the presence of bugs, not their absence." -- Edsger W. Dijkstra
    Overloading Semicolon, or, monads from 10,000 Feet at Oliver Steele
    osteele.com/archives/2007/12/overloading-semicolon
    Java and C++ have typed variables; Haskell has typed statements
    λ Tony’s blog λ » Blog Archive » Fix it Sun!
    blog.tmorris.net/fix-it-sun
    fixing this defect [adding tail call elimination to the JVM] is not in Sun’s interest (nor that of IBM). In fact, doing so may well speed up the death of its programming language by many orders of magnitude
    both pipes and lazy lists behave exactly like coroutines
    constructive nonconformist: Theory P: Software Development is Probabilistic
    jrdodds.blogs.com/blog/2007/11/theory-p-softwa.htm...
    Have you seen a car ad that shows a factory floor and an efficient automated assembly line? That’s not like software development. Have you seen a car ad that shows a design studio with a clay mock-up? That’s like software development. The guy on the factory floor can easily know how long it takes to assemble an automobile. It’s much more difficult for the guy sculpting clay to predict how much work and how many revisions it will take to get to the final design.
    There’s No Hope For IT :: Steve Vinoski’s Blog
    steve.vinoski.net/blog/2007/10/29/theres-no-hope-f...
    You cannot offset your lack of architectural vision by using some framework, product or vendor
    The Curse of Knowledge and the Semantic Web - Blog - Semantic Focus
    www.semanticfocus.com/blog/entry/title/the-curse-o...
    The Curse of Knowledge: the more you know, the more difficult it is for you to communicate knowledge
    Good Math, Bad Math : Erlang: a Language for Functional Concurrency
    scienceblogs.com/goodmath/2007/11/erlang_a_languag...
    concurrency is a bit like quantum mechanics - if you don't think it's hard you probably haven't thought about it enough
    What if powerful languages and idioms only work for small teams?
    weblog.raganwald.com/2007/11/what-if-powerful-lang...
    Willie Sutton is famous for stating the obvious. When asked why he robbed banks, he replied, “Because that’s where the money is.”
    The Annotated Turing by Charles Petzold
    www.charlespetzold.com/AnnotatedTuring/
    Before digital computers could do much of anything, Alan Turing demonstrated what they could never do
    Overcoming Bias: Artificial Addition
    www.overcomingbias.com/2007/11/artificial-addi.htm...
    Programming is the art of figuring out what you want so precisely that even a machine can do it
    Overcoming Bias: Artificial Addition
    www.overcomingbias.com/2007/11/artificial-addi.htm...
    Somehow it always turns out that you "couldn't see any reason it wouldn't work" because you were ignorant of the obstacles, not because no obstacles existed
    Overcoming Bias: Artificial Addition
    www.overcomingbias.com/2007/11/artificial-addi.htm...
    When the basic problem is your ignorance, clever strategies for bypassing your ignorance lead to shooting yourself in the foot
    Continually ask yourself:  "How would I regenerate the thought if it were deleted?"  When you have an answer, imagine that knowledge being deleted as well
    If you substituted randomized symbols for all the suggestive English names, you would be completely unable to figure out what G1071(G1072, 1073) meant.  Was the AI program meant to represent hamburgers?  Apples?  Happiness?  Who knows?  If you delete the suggestive English names, they don't grow back.
    ConalBlog: Tangible Functional Programming: a modern marriage of usability and composability
    conal-elliott.blogspot.com/2007/11/tangible-functi...
    The common practice of mixing IO with functionality inhibits composability whether in C or in Haskell
    The best question asked this week: What, exactly, are you trying to prove?
    weblog.raganwald.com/2007/11/best-question-asked-t...
    To prove the correctness of code, you need to know exactly what correct behavior is for the code, i.e. a complete and unambiguous specification for what the code should do. So tell me dear reader, when was the last time you received an unambiguous fully detailed specification of an application?

    If I ever received such a thing, I would simply execute that sucker, because the only unambiguous complete spec for what an application does is code. Even then, you have to ask, how do you prove that the specification does what the customers want?
    programming: An ABC of Category Theory - aimed at potential users of categorical ideas rather than
    programming.reddit.com/info/60w1m/comments/
    As an engineer, I've noticed that math people seem to think applying math is using one theorem to prove another :P
    So, Android is a Google flavor of Java ME? - Android Developers | Google Groups
    groups.google.com/group/android-developers/msg/509...
    The choice of Java makes so much sense in that it provides the phone
    with much needed protection against sloppy programming. Correct me if
    I'm wrong but the chips in typical handsets don't implement virtual
    memory in the same way a i386 does, so the potential for bad userspace
    code to panic the OS is significant. By running apps in a Java VM, the
    OS is protected.
    Explaining OpenSocial to your Executives
    www.web-strategist.com/blog/2007/11/02/explaining-...
    Web Marketing no longer is limited to your corporate site. Let go of the concept of ‘driving traffic to your website’ as a sole measurement of success.
    Dr. Dobb's | A Simple and Efficient FFT Implementation in C++, Part I | May 10, 2007
    www.ddj.com/cpp/199500857
    Fast Fourier Transformation (FFT) is not only a fast method to compute digital Fourier transformation (DFT)—having a complexity O(Nlog(N)) (where N must be power of 2, N=2P), it is a way to linearize many kinds of real mathematical problems of nonlinear complexity using the idiom "divide and conquer."
    eigenclass - Addressing the ORM problem, typed relational algebra
    eigenclass.org/hiki/addressing-orm-problem-typed-r...
    Query composition is sorely missing in most ORMs; you normally do some query and get in return a number of objects in some sort of container, which can be as simple as an array. You cannot compose queries, all you get is rows. In other words, they abstract at the wrong level, focusing on rows instead of relations.
    Do Messages Want to Be Asynchronous? - Beautiful Code
    beautifulcode.oreillynet.com/2007/10/do_messages_w...
    If you ask an object for some data, massage it, and then pass it back to the same object, you’ve found an operation which probably belongs on that other object.
    Those who cannot remember the past are condemned to repeat it.
    Most systems fail to gain popularity not based on their code quality, but on their documentation.
    freeshells.ch/~revence/myths.txt
    freeshells.ch/~revence/myths.txt
    Processors don't get better so that they can have more free time. Processors get better so _you_ can have more free time.
    freeshells.ch/~revence/myths.txt
    freeshells.ch/~revence/myths.txt
    Haskell IO is not only the most-organised IO, it is also the easiest. It's sad that disappointed _expectations_ in programming languages are often transcribed as difficulty. Learn that not every language is C++ with a virtual machine.
    freeshells.ch/~revence/myths.txt
    freeshells.ch/~revence/myths.txt
    never pay for space performance (on a 64-Gig RAM machine) with bugs.
    freeshells.ch/~revence/myths.txt
    freeshells.ch/~revence/myths.txt
    Never blame a paradigm. Blame an implementation of a paradigm.
    freeshells.ch/~revence/myths.txt
    freeshells.ch/~revence/myths.txt
    Even assembly has lazy evaluation. A jump is basically the most primitive mode of lazy evaluation.
    On the Tension Between Object-Oriented and Generic Programming in C++
    www.artima.com/cppsource/type_erasure.html

    "I find OOP technically unsound."

    "I find OOP philosophically unsound."

    "I find OOP methodologically wrong."

    "I have yet to see an interesting piece of code that comes from these OO people."

    "I think that object orientedness is almost as much of a hoax as artificial intelligence."

    All the quotes above are from an interview with Alexander Stepanov[3], the inventor of the STL and elder statesman of generic programming.

    programmers should worry less about languages and more about good old complexity
    freeshells.ch/~revence/no-c.txt
    freeshells.ch/~revence/no-c.txt
    Trust the programmer, as a goal, is outdated in respect to the security and safety programming communities.
    -- The C1x Charter* (for the next C standard)
    freeshells.ch/~revence/no-c.txt
    freeshells.ch/~revence/no-c.txt
    raw speed on one core, sequentially, is obsolete speed
    IO inside - HaskellWiki
    haskell.org/haskellwiki/IO_inside
    The Haskell language doesn't provide any way to express order of evaluation... except for data dependencies
    An abstraction is one thing that represents several real things equally well.
    Continuations library for Java | Lambda the Ultimate
    lambda-the-ultimate.org/node/1002
    Continuations as a concept are useful for maintaining the state machine of a long-term process like a workflow, bug report, that sort of thing. They suck at short-term GUI interactions for the simple reason that they are very attractive to linear-thinking programmers. Thus, the linear-thinking programmer tries to turn the user into a peripheral, rather than leaving the user in control of the UI. This leads to UI that sucks you-know-what.
    'Personally, I think the height of computing was cron.' (reddit.com)
    programming.reddit.com/info/2yjoc/comments
    Unix is just like Churchill's observation of Democracy - it sucks, but it sucks a bit less than everything else.
    Eli Bendersky’s website » Blog Archive » A taxonomy of typing systems
    eli.thegreenplace.net/2006/11/25/a-taxonomy-of-typ...
    Language | Static / Dynamic | Strong / Weak | Safety |
    Ada static strong safe
    C static weak unsafe
    C++ static strong unsafe
    Java static strong safe
    Javascript dynamic weak safe
    Lisp dynamic strong safe
    Pascal static strong safe
    Perl dynamic weak safe
    PHP dynamic weak safe
    Python dynamic strong safe
    Ruby dynamic strong safe

    Rebel Science News: Parallel Programming, Math, and the Curse of the Algorithm
    rebelscience.blogspot.com/2007/10/parallel-program...
    in a true parallel programming model, parallelism is implicit but sequential order is explicit
    Basic Speed Optimizations for the Evil : So Jake Says:
    www.jakevoytko.com/blog/2007/10/07/basic-speed-opt...
    Always profile your code when you want to improve it. No exceptions.

    A Gecko developers advice on writing a new browser engine (reddit.com)
    programming.reddit.com/info/2xlwd/comments
    Every time you manually reassign a variable, you're separating your program into two parts (where the variable has two different values). Statically proving that you will never use those two variables inconsistently is virtually impossible.
    Nabble - New slogan for haskell.org
    www.nabble.com/New-slogan-for-haskell.org-t4572687...
    Unfortunately, Haskell is unlikely to be learned in a few days. Fortunately, Haskell is likely to revolutionize minds in a few days.
    Notes on Haskell: Defanging the Multi-Core Werewolf
    notes-on-haskell.blogspot.com/2007/10/defanging-mu...
    authenticating a user doesn’t get 32x faster on a 32-core machine
    How much use of CLOS? - comp.lang.lisp | Google Groups
    groups.google.com/group/comp.lang.lisp/msg/60f4c36...
    CLOS offers freedom.  It can be very
      hard to deal with freedom if what you were looking for in an OO system
      was a way to cage yourself in.
    The software crisis is the result of serious flaws in the imperative languages. These flaws are not, however, the result of weaknesses inherent in the whole von Neumann approach; but rather the product of design error.
    the features and fixes that allow the programmer to get close to the machine are exactly those which cause all the trouble. These are the features that the Greenhorns come to grief with, that the Wizards have trouble analyzing, that the Preachers denounce as evil, and that the Home Handymen are forever repairing
    The weakness (of nonprocedural, purely definitional languages) underlined by Dijkstra is not an inherent weakness; it is a weakness of a particular method of implementing a particula kind of nonprocedural language.
    Programs have to be implemented, even implemented efficiently, but that ... is entirely the concern of the engineers. Programmers, according to this view, need not know anything about how the program is to be run - they should understand it from the mathematical point of view alone.
    Exhaustive search over infinite binary trees
    conway.rutgers.edu/~ccshan/wiki/blog/posts/Exhaust...
    Escardó’s algorithm represents a set of integers by a lazily evaluated binary tree of bits
    The "X Improves My Design Anyway" Myth « Sententia cdsmithus
    cdsmith.wordpress.com/2007/09/29/the-x-improves-my...
    Monads can be verbose and difficult to use in Haskell, but that makes people wary about using monads, which improves design
    Confessions of a Terrible Programmer: 0. Admit being bad. 1. Type-check in language. 2. Assertions.
    programming.reddit.com/info/2tx1k/comments/c2tzt4
    Well-defined, strong, extensive type systems (such as Ada's, OCaml's or Haskell's) are test cases that were already built for you by the authors of the language
    Stevey's Blog Rants: Ten Tips for a (Slightly) Less Awful Resume
    steve-yegge.blogspot.com/2007/09/ten-tips-for-slig...
    Tech certification: it means you had to take a course to learn something you could have read in a book
    Treating Code as an Essay « Dorai’s LearnLog
    dorai.wordpress.com/2007/08/08/treating-code-as-es...

    Lightweight Languages are not lightweight in the sense of ease of implementation, but they are called lightweight because of their intention to lighten the workload of the programmer.

    Brevity is one element that helps make code beautiful. As Paul Graham says, “Succinctness is power.” In the vocabulary of programming, brevity is a virtue.

    Brevity can also mean the elimination of redundancy. Redundancy is defined as the duplication of information.

    In order to eliminate redundancy, we follow the DRY principle: Don’t Repeat Yourself. The concept of DRY is the antithesis of copy-and-paste coding.

    Simplicity is the next element of beautiful code. We often feel beauty in simple code.

    When simpler tools are used to solve a complex problem, complexity is merely shifted to the programmer.

    Balance is the final element of beautiful code. So far I have talked about brevity, conservatism, simplicity, and flexibility. No element by itself will ensure a beautiful program.

    Comparing productivity: LisP against C++ (was Re: Reference Counting) - comp.lang.lisp | Google Grou
    groups.google.com/group/comp.lang.lisp/msg/5bb9a3a...
    When your hammer is C++, everything begins to look like a thumb.
    One of the benefits of wider adoption is, indeed, having a wider set of libraries - it's a "positive network externality" in terms of economics.
    Nabble - Haskell - Haskell-Cafe - transparent parallelization
    www.nabble.com/transparent-parallelization-t447538...
    Automatic parallelization is easy, efficient parallelization is hard.
    InfoQ: Language-oriented programming : an evolutionary step beyond object-oriented programming?
    www.infoq.com/news/2007/09/Language-oriented-progr...
    The abstraction level should be upgraded by using languages rather than object hierarchies as a modelling mechanism.
    InfoQ: Language-oriented programming : an evolutionary step beyond object-oriented programming?
    www.infoq.com/news/2007/09/Language-oriented-progr...
    Object-oriented domain modelling allows to “build up a vocabulary” but the grammar – ways to combine these vocabularies – is not defined; DSLs add this grammar side.
    Word numbers, Part 1: Billion approaches
    conway.rutgers.edu/~ccshan/wiki/blog/posts/WordNum...
    Quintessential computer science: first write a program to specify the problem, then interpret the program creatively to find the solution before the universe ends.
    The Actors Model and Haskell « lstephen
    lstephen.wordpress.com/2007/09/08/the-actors-model...

    Actors are computational agents which map each incoming communication to a 3-tuple consisting of:

    • a finite set of communications sent to other actors;
    • a new behaviour (which will govern the response to the next communication processed); and
    • a finite set of new actors created.
    Worse Than Failure - They can't force me to use Java
    forums.worsethanfailure.com/forums/thread/130555.a...
    The "anything that gets the job done" attitude only works when the author is expected to maintain his own work forever
    It?s Time to Stop Calling Circuits ?Hardware?
    www.computer.org/portal/site/computer/menuitem.5d6...
    Neal Gafter's blog: A Definition of Closures
    gafter.blogspot.com/2007/01/definition-of-closures...
    A closure is a function that captures the bindings of free variables in its lexical context.
    Nabble - Haskell - Haskell-Cafe - Can somebody give any advice for beginners?
    www.nabble.com/Can-somebody-give-any-advice-for-be...
                 Programmer's
                  Nirvana plane
                  ---------------
                    Categoric plane
                      ---------------
                       Co-Monadic plane
                         (Co- everything)
                          -----------------
                           Applicative plane
                         ----------------------
                       Pointless-pointfree plane
                     ------------------------------
                   Monadic plane  (don't get trapped)
                 ---------------        ---------------
               Functional plane          (Haskell et al!)
             ---------------                ---------------
           Imperative plane                  ASM, C#, Java :)
         ---------------                        ---------------
       Physical plane                              (e.g. Silicon)
    Those who do not become computer scientists to the second degree risk turning into programmers who will only implement the ideas of others.
    Tanenbaum-Torvalds debate, Part II
    www.cs.vu.nl/~ast/reliable-os/
    TVs don't have reset buttons. Stereos don't have reset buttons. Cars don't have reset buttons. They are full of software but don't need them. Computers need reset buttons because their software crashes a lot.
    An education in engineering and science is an education in intellectual honesty.
    Google Code for Educators - Introduction to Distributed System Design
    code.google.com/edu/parallel/dsd-tutorial.html
    A program
    is the code you write.
    A process
    is what you get when you run it.
    A message
    is used to communicate between processes.
    A packet
    is a fragment of a message that might travel on a wire.
    A protocol
    is a formal description of message formats and the rules that two processes must follow in order to exchange those messages.
    A network
    is the infrastructure that links computers, workstations, terminals, servers, etc. It consists of routers which are connected by communication links.
    A component
    can be a process or any piece of hardware required to run a process, support communications between processes, store data, etc.
    A distributed system
    is an application that executes a collection of protocols to coordinate the actions of multiple processes on a network, such that all components cooperate together to perform a single or small set of related tasks.
    Closure (computer science) - Wikipedia, the free encyclopedia
    en.wikipedia.org/wiki/Closure_(computer_science)
    Lazy functional languages such as Haskell bind variables to a result of a computation in the future
    Quake’s 3-D Engine:  The Big Picture
    www.bluesnews.com/abrash/chap70.shtml
    Most of the fun stuff in a software project happens early on, when anything’s possible and there’s a ton of new code to write.  By the end of a project, the design is carved in stone, and most of the work involves fixing bugs, or trying to figure out how to shoehorn in yet another feature that was never planned for in the original design.  All that is a lot less fun than starting a project
    The Java virtual machine is an abstract computing machine.
    Abstract machine - Wikipedia, the free encyclopedia
    en.wikipedia.org/wiki/Abstract_machine
    An abstract machine implemented as a software simulation, or for which an interpreter exists, is called a virtual machine.
    λ Tony’s blog λ » Blog Archive » A Fling with Lazy Evaluation
    blog.tmorris.net/a-fling-with-lazy-evaluation/
    It is impossible to write && in Java yourself.
    /dev/websphere: Tuning for multi-core: First, the easy stuff
    www.devwebsphere.com/devwebsphere/2007/09/tuning-f...
    instead of having a single RWLock, lets have say five. A thread can obtain a read lock by acquiring a read lock on any of the five. A thread can obtain a write lock only when it gets a write lock on all 5. This penalizes the writer but allows much more concurrency (five fold) for the common case that is reading.
    The average business is not interested in "hot trends in programming". Only programmers are.
    a cleverly marketed C-like language built to drive toasters was never going to be the last word in computer science
    "Using a scripting language is like going to McDonalds. The food is quick and tastes great, but the time you spend on the toilet after just isn't worth the whole experience." -- Bill Burke
    Shtetl-Optimized » Blog Archive » What Google Won’t Find
    scottaaronson.com/blog/?p=266
    The idea of quantum computing is to set up a massive double-slit experiment with exponentially many paths — and to try to arrange things so that the paths leading to wrong answers interfere destructively and cancel each other out, while the paths leading to right answers interfere constructively and are therefore observed with high probability.
    What Comes To Mind: Monads, REST and C++ Template Metaprogramming
    www.sdowney.org/2007/01/monads-rest-and-c-template...
    Every time you wish that you didn't have to write some type that the compiler already knows, like the iterator or value_type or return_value, particularly when they get really messy, you're looking for what Monads, or at least what Hindley-Milner type inference, provide.
    What Comes To Mind: Monads, REST and C++ Template Metaprogramming
    www.sdowney.org/2007/01/monads-rest-and-c-template...
    Monad transformers show a degree of generic reusability that is awfully hard to achieve with C++ templates, even though C++ templates have similar expressive power
    Improved Means for Achieving Deteriorated Ends / The State of State
    www.redlinernotes.com/blog/?p=811
    For in-memory transactions on a single CPU, the overhead of transactions can be brought down to <2X in reasonable cases. Across the network, where latencies are 1,000,000 times higher, message passing seem like the only plausible approach.
    Holding a Program in One's Head
    paulgraham.com/head.html
    It's not merely true that organizations dislike the idea of depending on individual genius, it's a tautology. It's part of the definition of an organization not to.
    iScreen 1.1.0 released: POJO Validation Framework
    www.theserverside.com/news/thread.tss?thread_id=44...
    Validation is not designed to handle/support real business logic. Validation is a means to ensure that the data an object (or object graph) contains meets certain standards. It makes no judgment upon how that data fits within the overall business model. Business logic (and rules engines) represent decision-making capabilities. Validation engines don't.
    Software is not made of bricks (reddit.com)
    programming.reddit.com/info/2gxfp/comments
    A program listing is a document that represents a software design. Compilers and linkers actually build software designs.
    MIT startup raises multicore bar with new 64-core CPU: Page 2
    arstechnica.com/articles/paedia/cpu/MIT-startup-ra...
    RISC philosophy: "show everything to the compiler and let compiler writers manage the complexity"
    On The Internet Nobody Knows You're a Lambda (reddit.com)
    programming.reddit.com/info/2ggry/comments
    The Lisp Before the End of My Lifetime « Metalinguistic Abstraction
    metalinguist.wordpress.com/2007/08/04/the-lisp-bef...
    Herding lisp programmers is about as tough as herding cats armed with machine guns.
    Erlang as an OO language — 2007-08-09 — kirit.com
    www.kirit.com/Blog:/2007-08-09/Erlang%20as%20an%20...
    “sequential Erlang” is a functional programming language… “concurrent Erlang” is an object-oriented language.
    Caoyuan's Blog : Weblog
    blogtrader.org/page/dcaoyuan
    Tao, may be told, but that once is being told is no longer the Eternal Tao
    We Worship MD5, the GOD of HASH (Skrentablog)
    www.skrenta.com/2007/08/md5_tutorial.html
    If the chance of the software failing is made smaller than the chance of the hardware failing (or of the user spontaneously combusting, or whatever), there's little to worry about.
        -- Bruce Schneier
    wzdd: On computer programming
    wzdd.livejournal.com/6017.html
    Given enough iterations, every design will involve the kitchen sink
    Archives of the Caml mailing list > Message from Diego Olivier Fernandez Pons
    caml.inria.fr/pub/ml-archives/caml-list/2003/04/d9...
    Zippers may be seen as 'functional pointers' since they offer :
    - purely functional and typed operations
    - O(1) acces to the pointed element
    - O(1) pointer movements
    The restrictions are that only one pointer is allowed by data structure and every pointer movement allocates memory.
    Notes on Haskell: Haskell: more than just hype?
    notes-on-haskell.blogspot.com/2007/08/haskell-more...
    Both languages are slowly converging on nirvana: C# is getting more pure, and Haskell is getting more useful.
    It is this interplay between language features like purity and polymorphism, leading to code with the qualities of precision engineering, that makes Haskell so addictive
    make something idiot-proof and someone will invent a better idiot
    An epiphany about Functional Programming and Lazy Evaluation « Programblings
    webmat.wordpress.com/2007/08/12/an-epiphany-about-...
    When specifying a computation in a programming language, functional programming language's non-strict semantics is to the detailed, manual sequencing of operations what garbage collection and automatic memory management is to the detailed, manual management of memory.
    An epiphany about Functional Programming and Lazy Evaluation « Programblings
    webmat.wordpress.com/2007/08/12/an-epiphany-about-...
    Java’s allocation of memory on the heap requires around 10 processor operations instead of 60 to 100, for the best C++ compilers.
    What is coupling, really? | Lean Software Engineering
    leansoftwareengineering.com/2007/08/08/what-is-cou...
    source code can only describe what we want the system to do, and not what the system actually does (???)
    Ask Reddit: What is Haskell good for? (reddit.com)
    programming.reddit.com/info/2bxc1/comments/c2dins
    data constructors can be thought of as temporary place-holders to be filled in with other functions later, and data structures would then represent whole control flows waiting to happen
    Re: a regressive view of support for imperative programming in Haskell
    article.gmane.org/gmane.comp.lang.haskell.cafe/272...
    one of the key principles in the design of Haskell has been the insistence on purity.  It is arguably what led the Haskell designers to "discover" the monadic solution to IO, and is more generally what inspired many researchers to "discover" purely functional solutions to many seemingly imperative problems.  With references and mutable data structures and IO and who-knows-what-else to support the Imperative Way, this discovery process becomes stunted.
    Meme Agora: Dependency Injection in One Sentence
    memeagora.blogspot.com/2007/08/dependency-injectio...
    Dependency Injection enables a vitally important but nevertheless weak, limited, syntactically confounding, and dauntingly complex form of one of the kinds of meta-programming that should exist in the language
    beautiful.pdf (application/pdf Object)
    research.microsoft.com/%7Esimonpj/papers/stm/beaut...
    The IO type indicates the possibility of side effects, not the certainty!
    Hiring Programmers and The High Cost of Low Quality
    developers.slashdot.org/comments.pl?sid=262509&cid...
    There's no one programmer who does the work of ten other programmers. One uber-programmer does just as much work as one ordinary programmer. It's just that the results solve ten times as many problems.
    Functional holes — 2007-07-11 — kirit.com
    www.kirit.com/Blog:/2007-07-11/Functional%20holes
    Many people dislike C++ for what they think it is, rather than what it actually is. There's plenty to dislike about it as a language, but don't let that fool you into thinking that it's power and expressiveness is in the same league as Java or C#.
    One Laptop Per Child (OLPC) - What's in it for Java?
    www.javalobby.org/forums/thread.jspa?messageID=921...
    You're probably looking at the parentheses. Look at the code instead.
    [LINK] UK Budget gives IT shot in arm
    mailman.anu.edu.au/pipermail/link/2000-March/00255...
    If what you did yesterday still looks good to you, then your goals for tomorrow are not big enough. -- Ling Fu Yu, ca. 600 BC.
    A formal proof of a proposition is a chain of logical deductions leading to the proposition from a base set of axioms. 
    Interview with Con Kolivas part 1: computing is boring | APC Magazine
    apcmag.com/6759/interview_with_con_kolivas_part_1_...

    Computers of today may be 1,000 times faster than they were a decade ago, yet the things that matter are slower.

    The standard argument people give me in response is 'but they do such more these days it isn't a fair comparison'. Well, they're 10 times slower despite being 1000 times faster, so they must be doing 10,000 times as many things. Clearly the 10,000 times more things they're doing are all in the wrong place.

    Word numbers, Part 1: Billion approaches
    conway.rutgers.edu/~ccshan/wiki/blog/posts/WordNum...
    quintessential computer science: first write a program to specify the problem, then interpret the program creatively to find the solution before the the universe ends.

    Norvig's Law

    Any technology that surpasses 50% penetration
    will never double again
    (in any number of months).
    Manageability - The Fallacies of Inheritance
    www.manageability.org/blog/stuff/inheritance_revis...
    inheritance is not essential to Object Oriented Programming. The essential features of OOP is Identity, Encapsulation and Polymorphism. Inheritance is only a means to achieve polymorphism in a statically typed language
    Manageability - The Fallacies of Inheritance
    www.manageability.org/blog/stuff/inheritance_revis...
    implementation inheritance is best done via delegation
    Programmers Need To Learn Statistics Or I Will Kill Them All
    www.zedshaw.com/rants/programmer_stats.html
    I see software developers begging for gazillions of dollars to buy some crap tool that doesn’t even mention “standard deviation”, but throws “user” around like it’s Dr. Phil treating Robert Downey Jr. for heroin addiction.
    Programmers Need To Learn Statistics Or I Will Kill Them All
    www.zedshaw.com/rants/programmer_stats.html
    Knuth once said: “Beware of bugs in the above code; I have only proved it correct, not tried it.”
    We want Arc to be good for writing programs, and one way to ensure that is to start writing programs while the language is still malleable
    coding, by Derek Young: The Curse of The Elegant Languages
    dmy999.com/article/23/the-curse-of-the-elegant-lan...
    the amount of good software written in a language is inversely proportional to the elegance of that language
    You hardly ever need to use explicit recursion in Haskell.  Every  
    useful way of doing recursion has already been captured in some  
    higher order function.
    The Fishbowl: Understanding Engineers: Feasibility
    fishbowl.pastiche.org/2007/07/17/understanding_eng...
    When an engineer says something is "non-trivial," it's the equivalent of an airline pilot calmly telling you that you might encounter "just a bit of turbulence" as he flies you into a cat 5 hurricane.
    Agence Levallois » Blog Archive » Lisp is a wonderful Lisp
    arcanes.fr.eu.org/~pierre/blog/2007/07/lisp-is-a-w...
    freedom gives you power, but not everybody is able to exercice freedom
    A Train of Thought - July 10th 2007 Edition - Jeremy D. Miller -- The Shade Tree Developer
    codebetter.com/blogs/jeremy.miller/archive/2007/07...
    Switch statements and deeply nested if/then statements are to logic bugs as stagnant water is to the mosquito population
    The Programming and Management Blog » What motivates programmers?
    blog.assembleron.com/2007/07/11/what-motivates-pro...
    If you give a programmer a job that does not involve solving something they will become unhappy.
    Why don’t Haskell Developers Use Windows? « Sententia cdsmithus
    cdsmith.wordpress.com/2007/07/06/why-dont-haskell-...
    Since Haskell does not attract the sort of people who are slaves to their platform, that means there are fewer people developing Haskell with Windows.
    where a Zipper gives O(1) mutation of an element, a Zipper2 gives O(1) splicing
    Information Processing: Memories of Feynman
    infoproc.blogspot.com/2007/07/feynman-video.html
    Feynman had a way of focusing in like a laser on any specialized knowledge he wanted to absorb from someone.
    java.net: Three Rules for Effective Exception Handling
    today.java.net/pub/a/today/2003/12/04/exceptions.h...

    Exceptions are a tremendous debugging aid because they help answer these three questions:

    • What went wrong?
    • Where did it go wrong?
    • Why did it go wrong?

    When exceptions are used effectively, what is answered by the type of exception thrown, where is answered by the exception stack trace, and why is answered by the exception message.

    QDB: Quote #779320
    bash.org/?779320
    <dsully> please describe web 2.0 to me in 2 sentences or less.
    <jwb> you make all the content. they keep all the revenue.
    Haskell/Zippers - Wikibooks, collection of open-content textbooks
    en.wikibooks.org/wiki/Haskell/Zippers
    Don't get impatient, you cannot solve problems by coding, you can only solve them by thinking.
    Chui’s counterpoint » Blog Archive » “Flow”
    www.redmountainsw.com/wordpress/archives/flow

    The path to “flow”:

    1. Immediate, meaningful, physical feedback
    2. Natural, ergonomic control
    3. Aesthetic pleasure
    4. Capture a wide range of input data
    5. Technology should serve simplicity
    6. Progressive complexity
    7. Activity oriented design
    Chui’s counterpoint » Blog Archive » “Flow”
    www.redmountainsw.com/wordpress/archives/flow
    When I want to eat cake, please do not offer me flour, eggs, and sugar.
    Why Are ALL Programming Languages So Low Level? | Lambda the Ultimate
    lambda-the-ultimate.org/node/1546
    In Haskell, there's no manual memory (de)allocation, concurrency's expressed through composable memory transactions, there are no loops beyond what you build out of recursive functions, the compiler handles evaluation order, types are expressed as sum-of-product rather than bunches of bits, and you can't update arbitrary memory locations.
    It is much more difficult to try to guess internal structure just from the observation of behavior than it is to create the structure that gives the behavior.
    Programming Bottom-Up
    www.paulgraham.com/progbot.html
    In Lisp, you don't just write your program down toward the language, you also build the language up toward your program. Language and program evolve together. When you work bottom-up, you will get a larger language with more abstract operators, and a smaller program written in it.
    Gmail - [Haskell-cafe] New New newbie question/help
    mail.google.com/mail/?fs=1&tf=1&view=cv&search=all...

    Personally, I prefer to read fromIntegral :: (Num b, Integral a) => a -> b like: 

    IF (b is a Num) AND (a is an Integral) THEN (fromIntegral is defined and is a function from a to b)

    JBoss Workflow JBpm and JBoss Rules (Drools) - Technology in plain English - Dublin Ireland
    www.firstpartners.net/blog/technology/uncategorize...

    a workflow engine (or Graph Oriented Programming in general) is about specifying a graph that represents an execution. The nodes can represent wait states.

    a rules engine is about specifying a set of rules and then applying an inference algorithm for a given set of facts. So given a set of rules and a set of facts and an inference algorithm, there is one calculation that results from it. It’s a one shot calculation that possibly creates new facts or modifies the input facts. The rules are a form of if-then-else statements and the inference algorithm specifies how these rules will be applied at runtime.

    One crucial difference between the workflow/BPM and rules is the fact that rules engines do not support wait states. And that is not necessary either because rules don’t specify any form of execution.

    The overlap is to be found in state transitions in workflow/BPM engines. Processes in workflow or BPM can be considered as state machines. Then one state transition can related to one application of facts to a set of rules by a rules engine. For each state transition in a workflow/BPM process, you could think of a set of rules that will calculate the next state from a given state.

    So in theory you could model all state transitions of a workflow/BPM process in terms of rules, but the wait states will remain the gaps. Those wait states are not representable in rules or facts.

    General Programming Patterns Derived from ARS
    www.lambda-bound.com/patterns.html
    A closure is an encapsulation of a lambda abstraction with its total environment. This environment consists of all the names of abstractions that this lambda abstraction has access to. Access to names in a lambda abstraction is controlled by the so called 'lexical scope'. Lexical scope can also be described as the context of a lambda abstraction in the program text.
    Ask Reddit: Are you in IT, and considered as valuable as the copier? (reddit.com)
    programming.reddit.com/info/20zg5/comments
    Happiness comes from being in a flow state, which is when you are working on problems that are just as big as take your full expertise to handle
    Stevey's Blog Rants: Rich Programmer Food
    steve-yegge.blogspot.com/2007/06/rich-programmer-f...
    Large Systems Suck

    This rule is 100% transitive. If you build one, you suck.
    norvig.com/experiment-design.html
    norvig.com/experiment-design.html
    It is easy to lie with statistics, but it is easier to lie without them.
    norvig.com/experiment-design.html
    norvig.com/experiment-design.html
    True randomness consists of a mixture of clumps and non-clumps. Randomness is different from homogeneity. 
    Gmail - [Haskell-cafe] Thought for today
    mail.google.com/mail/?fs=1&tf=1&view=cv&search=all...
    Data in Haskell is like Schrodinger's famous undead cat - it doesn't
    'exist' until you 'obverse' it.
    raganwald: Still failing, still learning
    weblog.raganwald.com/2007/06/still-failing-still-l...
    Project management is a social problem. It is 99.5% about getting everyone who knows something about the state of the project to share what they know with everyone else. Getting all the relevant information is 99.5% of the problem, analyzing the information is 0.5% of the problem.
    Wolfram Blog: Computable Data Functions: A Crazy Idea That Just Works
    blog.wolfram.com/2007/05/computable_data_functions...
    Stop thinking about data as something in a table, or a database, and start thinking about it just like any other mathematical function.
    Allowing Business Users To Program Your System Is A Recipe For Disaster
    haacked.com/archive/2007/06/03/allowing-business-u...
    The solution is not to make programming more like the way business users work now. The solution is to apply the lessons learned from software development into other business processes.
    Pick a data structure that embeds the semantics of the domain you're modelling and your life will be easier.
    Keep your code pure, so you can test harder, and the bugs will stay far away.
    Too Much Code: Why Java lost its mojo, and what Sun is doing about it
    toomuchcode.blogspot.com/2007/05/why-java-lost-its...
    The JRE is becoming the new POSIX

    Optimization

    Optimization is generally viewed as the purposeful act of improving something under a set of circumstances. It is also generally viewed as a beneficial and useful process. I take exception to this. Optimization is good only when important choices are final -- and they usually aren't. An optimized system has lost some of its freedom to become something else. Any choice that is optimized for a particular set of conditions will be harder to adapt to other conditions than if it were not as optimized.

    Optimization can only take place in one direction at a time (although that may consist of several conditions). If you want a change of direction, you will need to backtrack somewhat and start over. If you want a radically different solution, you may need to backtrack very far, and start all over again. The further you have progressed in one direction, the harder and more costly the change will be, because you may need to progress equally far in another direction before you get a system that is equally "good". This is why software systems are often discarded instead of attempted improved in a different direction. This is why software systems should be discarded instead of improving them in unintended directions.

    Optimization means loss of freedom to navigate the solution space. As such, it should not be performed prematurely, and if at all possible, should be done by machine, such that whatever the human being sees is more intent than implementation. Examples of premature optimization include: explicit typing in programming languages, and explicit layout specification in electronic documents, both in office documents and on the WWW.

    Unfortunately, designing any kind of system that is intended to be optimized by machine brings the implementation to a much higher level of abstraction, and few people can handle it unless trained not to think in terms of direct manipulation of the objects of the final product.

    Relevance: Design Patterns are Code Smells
    www.relevancellc.com/2007/5/17/design-patterns-are...
    Regardless of how you distinguish patterns from recipes, the programming language that you think in will be the programming language you design for.
    Gmail - [Haskell-cafe] Made me smile
    mail.google.com/mail/?fs=1&tf=1&view=cv&search=all...
    Invisible wrote:
    >>>> int main()
    >>>> {
    >>>>     typedef std::istream_iterator<std::string> Is;
    >>>>     typedef std::ostream_iterator<std::string> Os;
    >>>>     std::set<std::string> t((Is(std::cin)), Is());
    >>>>     std::copy(t.begin(), t.end(), Os(std::cout, "\n"));
    >>>> }

    > OK then.
    > main = interact $ unlines . sort . nub . words

    Pwned!
    How long before superintelligence?
    www.nickbostrom.com/superintelligence.html
    If we assume the upper bound on the computational power needed to simulate the human brain, i.e. if we assume enough power to simulate each neuron individually (10^17 ops), then Moore's law says that we will have to wait until about 2015 or 2024 (for doubling times of 12 and 18 months, respectively) before supercomputers with the requisite performance are at hand.
    The Paradox of Elegance
    programming.reddit.com/goto?id=1pbb4
    Good UI is hard. Not just the design, but the programming too. Coding an elegant UI is an endless process of fixing twitches, hitches, and glitches that no one will ever see or know about. When done well, the end result is a smooth, elegant, effortless UI interaction, but your customer won’t recognize the tireless effort you put in to make it happen. And that’s how it should be.
    Easylanguage: domain specific language for trading stocks | Lambda the Ultimate
    lambda-the-ultimate.org/node/2201
    It's disconcerting to me writing in a language where some words are necessary and others are not, but are usually put in so programs read more like English. Maybe the problem is that the syntactic flexibility obscures the fact that the computer is not interpreting English, and that programming is still a precise activity.
    Hard-Core Concurrency Considerations
    programming.reddit.com/goto?id=1p5rz
    Another nice advantage of using purely-functional data-structures is that they make it easy to implement temporal-databases that let you perform time-dependent queries.

    I just wanted to point out that if all you have is quick-reads then purely-functional is no different than a simple ReadWrite lock and that a super-pure implementation, as with Haskell, doesn't scale to multiple-CPU's or to highly concurrent updates. However, it can be used to good effect in combination with striping or other techniques.

    (A tangential note: Java's GC is getting so good in recent releases that P-F data-structures are becoming much more efficient (given that P-F generates more garbage).)

    p.p.s. One more advantage of functional data-structures (the largest advantage for me actually):

    They map well to log(or journal)-based storage. Functional data-structures never update old data, but instead, just create new versions. If your data-structure uses disk-based storage then this means that you never need to go back and overwrite your file; you only need to append data to the end of the file. This has two advantages:

    1. This works well with the physical characteristics of hard-disks. They have incredibly high transfer rates (10’s of Megs/sec) but very slow seek times (~ 200 seeks/sec if 5ms access time). If you are adding say 1k objects to a data-structure which requires 2 updates on average to a file then you’re looking at about 100 updates per second. If on the other-hand you write all of these updates to the end of the file then you’re looking at say 20,000 updates per second!

    2. You can’t corrupt old data with interrupted writes. The old data is always still there. The only place that a corruption occur is at the end of the file, in which case you just scan backwards until you find the previous good head of your data-structure.
    Faith, Evolution, and Programming Languages from Google EDU
    www.theserverside.com/news/thread.tss?thread_id=45...
    Generics in Java evolved directly from Haskell type classes
    Good news!
    101out.com/gn/
    "Have you ever seen people put a link in their profile to their HotOrNot picture, saying "Go here and vote me a 10!!"? Similar to the people who send links to their friends and say, "I just posted this, please Digg this for me!" The difference is that on HotOrNot, it doesn't work. On HotOrNot, you can cast votes for a picture in one of two ways. The first way is to go directly to the URL for someone's picture; the second way is to load the front page, where a random picture from the database is selected at random, and vote for whatever picture comes up. The catch is that the votes that you cast by going directly to someone's picture, are simply ignored in calculating the average score for that photo. The only votes that are counted are the votes cast for random pictures displayed on the front page. So if you want to manipulate the voting for your own photo, you'd have to load the front page hundreds of thousands of times waiting for your own picture to come up repeatedly, which is hard to do without being detected.
    Starting out on Forth - comp.lang.forth | Google Groups
    groups.google.com/group/comp.lang.forth/msg/5f7da0...
    Any given problem has a certain intrinsic level of complexity.  In the
    solution of the problem, this complexity will be conserved:  if you dive in
    with too little advance thought, your solution may become very complex by
    the time it's done.  On the other hand, if you invest more in thought,
    design, and preparation, you may be able to achieve a very simple solution
    (the complexity hasn't gone away, it's become embodied in the sophistication
    of the design).
    [Haskell] Newbie: what are the advantages of Haskell?
    www.haskell.org/pipermail/haskell/2007-April/01939...
    > Aren't Haskell's advantages outweighed by its complexity (Monads, etc.) and rigidity?
    I can sometimes feel that Haskell looses out on not being user friendly in the Java sense (i.e. "cut out any feature that can't be understood in five minutes by a chimp"). Some things do take some effort to learn, but there is a huge payoff for it (it's really powerful!). But yeah, there might be plenty of folks who will never bother learning about them, and they won't understand your code.
    [Haskell] Newbie: what are the advantages of Haskell?
    www.haskell.org/pipermail/haskell/2007-April/01939...
    I can quite literally *feel* "brain resources" being freed up when using Haskell, which I can use to get stuff done quicker (or probably more accurate: I can feel how much brainpower I waste on book keeping and keeping track of this "mental log" when using languages like C++)
    American Grey: Reading and Coreading
    meryrus.blogspot.com/2007/04/reading-and-coreading...
    At a blushing glance, comonads even look dual to monads. I like thinking of monads as computations that get values by adding structure, which means that comonads are computations that destroy the structure to obtain a value.
    Gmail - [Haskell-cafe] Is Excel a FP language?
    mail.google.com/mail/?fs=1&tf=1&view=cv&search=all...
    Excel is a zero-order functional
    language - a functional language in which you can't define functions.
    Amit's Thoughts: Lisp vs. Python: Syntax
    amitp.blogspot.com/2007/04/lisp-vs-python-syntax.h...
    Lisp seems to be optimized for writing code; Python seems to be optimized for reading it. Which you prefer may depend on how often you write new code vs. read unfamiliar code; I'm not entirely sure. What bothers me the most though is not that these two languages do different things, but that the people who argue about it seem to think that there is one “best” answer, and don't see that this is a tradeoff. When I'm writing code I prefer Lisp; when I'm reading code I prefer Python. I think this is an inherent tradeoff—any added flexibility for the writer means an added burden for the reader, and there is no answer that will be right for everyone.
    Write Readable Code By Making Its Intentions Clear
    haacked.com/archive/2007/04/20/write-readable-code...
    there are very few people who can read code who cannot write code themselves. It’s not like written or spoken natural languages, where understanding what someone else says does not require understanding why they said it that way.
    Gmail - [Haskell-cafe] How Albus Dumbledore would sell Haskell
    mail.google.com/mail/?fs=1&tf=1&view=cv&search=all...
    Formula 1 race car: you can't win the race with a car that doesn't risk breaking down halfway through the race.
    The way to Lisp | Tux Deluxe
    www.tuxdeluxe.org/node/153
    Lisp's real advantage remains in its extensibility which can readily be seen as stemming from a core feature of the language; the fact that Lisp programs are expressed as Lisp data structures.
    Linux: The Completely Fair Scheduler | KernelTrap
    kerneltrap.org/node/8059
    CFS's design is quite radical: it does not use runqueues, it uses a time-ordered rbtree to build a 'timeline' of future task execution, and thus has no 'array switch' artifacts (by which both the vanilla scheduler and RSDL/SD are affected). CFS uses nanosecond granularity accounting and does not rely on any jiffies or other HZ detail. Thus the CFS scheduler has no notion of 'timeslices' and has no heuristics whatsoever. There is only one central tunable, /proc/sys/kernel/sched_granularity_ns, which can be used to tune the scheduler from 'desktop' (low latencies) to 'server' (good batching) workloads." He went on to note, "due to its design, the CFS scheduler is not prone to any of the 'attacks' that exist today against the heuristics of the stock scheduler
    Software Development Lessons Learned from Go | Outsight Interactive
    www.outsightinteractive.com/blog/software_developm...
    Professional (9p) Japanese Go player Kajiwara Takeo said in 1986 that Go is science, art and game. Those chosen few may enter the Eternal Hall of Fame only, who combine the scientific precision, the artistic improvisation and the spiritual joy of the game in themselves. This is just as true of software development: With time and study both skills can be performed well, but both require a unique combination of logic creativity and sincere passion to perform beautifully.
    Jeff Cunningham: The ridiculous Java bashing needs to stop
    www.theserverside.com/news/thread.tss?thread_id=45...
    Java is not dynamic, and instant feedback in the form of REPL has been available in Lisp since 1956
    Stephen Ramsay » Chicken!
    lenz.unl.edu/wordpress/?p=15
    The Greatest Language Ever and the Greatest Language Possible are both doomed propositions. The former ignores the infinite variation of use cases, platforms, coding styles, and the sociology of individuals and groups. The latter does all of that and goes still further by arbitrarily choosing language features for which the “best” is likely to be a highly debatable matter. Like all good philosophical questions, these one’s don’t have concrete answers. We pose them not to arrive somewhere, but to stimulate thought and further innovation.
    ArchitectNotes - Varnish - Trac
    varnish.projects.linpro.no/wiki/ArchitectNotes
    Virtual memory was meant to make it easier to program when data was larger than the physical memory, but people have still not caught on.
    All sorts of useful things start to happen when the library types and primitives have been banished from your api
    I started learning Haskell precisely to solve problems like this. But, once I got into it, I realized that Haskell is a much better modeling language than the modeling language I was using (MOF/UML, the predecessors to EMF). Furthermore, all the infrastructure built on top of that modeling language was very easy to replace with Haskell code. As a result, I gave up that effort.

    You said "The benefits of the model+generate approach are well known," however I disagree. W3C DOM, MOF, UML, CORBA, and NetBeans 3.x-4.x are all obvious examples of the failure of the model+generate approach. If the modeling language is sufficiently powerful, then it should be feasible to execute the models directly using a (custom-built) interpreter. If the modeling language is weak then it is better to just do the modeling in Haskell or another more powerful language.

    The MDA idea was that you would have one model and then be able to use that model in a variety of different programming languages, without having to rewrite code in each target language. Now, people are getting this benefit via a "code, then translate" approach. For example, GWT allows the developer to write Java code, then generate the equivalent Javascript, without any hand-wavy models in between. JRuby lets one write code in Ruby to be used by code in Java; IronPython does the same for other .NET languages. In fact, C# is basically the .NET counterpart to EMF.

    FWIW, I also think that data based languages like ERD, Relax NG, and XQuery/XPath/XML Schema are a much closer fit to Haskell than EMF. EMF is designed to be translated any object-oriented, class-based, (soley) subtype-polymorphic, single-dispatched, single-inheritance language; i.e. Java. In fact, EMF is really a Java-optimized subset of what was supposed to become part of MOF 2.0.
    by Brian Smith <brianlsmith@gmail.com>
    .::t3rmin4t0r::. : observations/migration-patterns-of-codemonkeys.html
    t3.dotgnu.info/blog/observations/migration-pattern...
    Neil’s point-free blog » Haskell: an Imperative Language with Mutable State
    neilbartlett.name/blog/2007/04/11/haskell-an-imper...
    is Haskell really a pure functional language? In my opinion it is not – it’s much more useful than that. It’s a language that allows imperative programming, but uses its strong type system to keep side-effect-producing code from mixing freely with pure functional code. That makes it uniquely powerful.
    Shtetl-Optimized » Blog Archive » Logicians on safari
    scottaaronson.com/blog/?p=152
    Algorithms are good at describing dynamic processes, while scientific formulas or equations are more suited to static phenomena.
    Continuation Passing Style (CPS): where every function takes an extra argument, a function to call with its result
    Continuations are similar to goto statements, as both allow arbitrary control flow. However there are important differences. Continuations jump to program states, whereas goto statements jump to labelled positions in code. Goto statements can thus jump into non-sensical program states where variables haven't been initialised and so forth. Continuations don't allow this - you can only go back to an already visited program state. In this way continuations are more controlled than goto statements.
    Intel spills beans on Core 2 successor: SSE4, faster virtualization, bigger caches
    arstechnica.com/news.ars/post/20070328-intel-spill...
    VMware products use a binary translation engine that ingests regular x86 OS code and produces a "safe" subset; VMware claims that this binary translation approach is as fast as, or faster, than VT-based approaches because the OS doesn't have to do costly VM transitions in order to execute privileged instructions.
  • ProceduralProgramming. A program execution is regarded as a (partially ordered) sequence of procedure calls manipulating variables.

  • FunctionalProgramming. A program is regarded as a mathematical function, describing a relation between input and output.

  • ConstraintProgramming. A program is regarded as a set of equations describing relations between input and output.

  • ObjectOrientedProgramming. A program execution is regarded as a physical model, simulating the behavior of either a real or imaginary part of the world.
  • Technology in plain English » JBoss Workflow JBpm and JBoss Rules (Drools)
    www.firstpartners.net/blog/technology/uncategorize...

    - Workflow tends to be ‘wide’ where Rule Engines tend to be  ‘deep’.

    - Workflow is wide as the flow is spread over different people / actors and over time.

    - Rule Engines are ‘deep’ as they apply simple rules to solve complex problems, but in general the rules are applied ‘all at once’.

    Technology in plain English » JBoss Workflow JBpm and JBoss Rules (Drools)
    www.firstpartners.net/blog/technology/uncategorize...

    a workflow engine (or Graph Oriented Programming in general) is about specifying a graph that represents an execution. The nodes can represent wait states.

    a rules engine is about specifying a set of rules and then applying an inference algorithm for a given set of facts. So given a set of rules and a set of facts and an inference algorithm, there is one calculation that results from it. It’s a one shot calculation that possibly creates new facts or modifies the input facts. The rules are a form of if-then-else statements and the inference algorithm specifies how these rules will be applied at runtime.

    One crucial difference between the workflow/BPM and rules is the fact that rules engines do not support wait states. And that is not necessary either because rules don’t specify any form of execution.

    The overlap is to be found in state transitions in workflow/BPM engines. Processes in workflow or BPM can be considered as state machines. Then one state transition can related to one application of facts to a set of rules by a rules engine. For each state transition in a workflow/BPM process, you could think of a set of rules that will calculate the next state from a given state.

    So in theory you could model all state transitions of a workflow/BPM process in terms of rules, but the wait states will remain the gaps. Those wait states are not representable in rules or facts.

    Random thoughts:

     * Always ask for deletion confirmation after checking if the object can be deleted (avoid "are you sure" followed by "cannot delete")

    * Object evolution in time (versioning): none (simple update, history lost), new object with backreferencing (version tree, forking), new object with forward references

    * Object evolution methods: new object, diff only

    * Value Objects as object graph subgraphs (type masks)

    * Object storage: meta-level (object-attribute-value), table-per-class

    * Object representation in code: meta-level (Object getAttr(String)), typed attributes

    * Object storage, representation and versioning are orthogonal

    * {Model,domain,ontology}-driven interfaces

    * It's desirable mixing level and meta-level stored information (cold vs. hot spots)

    * Both free UI navigation and workflow-driven modes should be used where appropriate

    * Fine-grained pluggable entity sets (kits, packages) (needs weak coupling between entities, external relationship representation (excludes typed attributes (except for AOP mixins)))

    * Business objects with smart defaults (based on classloading (JMX maybe ?) with off-the-DB default classes)

    * Remote operation works over snapshots in time of data

    * Refactoring between level and meta-level (ex: making a class, extracting common attributes)

    * Draw graph edges first and nodes later so that edges don't clutter node labels

    * Value Objects as different views (interfaces context) including RO/RW access

    * Dynamic refactoring between frozen and hot spots
    Technology in plain English
    www.firstpartners.net/blog/

    the main features of Agile projects:

    • Working Software over Comprehensive documentation
    • Customer interaction over Contract negociation
    • Responding to change over following a plan
    • Individuals and interactions over processes and tools.
    Technology in plain English
    www.firstpartners.net/blog/

    No matter what your system does , be it insurance , banking , online travel booking or telecoms, the chances are it does the following things:

    • Gets information from users over the web
    • Does some business processing on that information
    • Saves the information in a database.

    At a conservative estimate , about 99% of Enterprise systems would fall into this category.

    If so, why do you need an architect , when you can use our ‘one size fits all’ architecture diagram (below)?! Most non-trivial systems, regardless of the language they are written in (be it Java, .Net , or your language of choice) follow the pattern seen in this diagram.

    3 Tier Enterprise Diagram

    There are 3 Pieces to the Solution:

    • Web Browser (for the user / client).
    • Web and Application Server - carry out business logic.
    • Database Back End - to store data and ensure data integrity.

    Within the Application Server (the middle bit above, which as Java Architects is the bit we are interested in), there are a further 3 tiers

    • A Presentation tier (or layer), which is mainly about talking to the user (it gets and sends requests to the web browser).
    • A Service layer , which is mainly about talking to back end such as databases, legacy systems (such as mainframes) and XML-Web services that we may use.
    • A Business layer, the ‘meat’ of the sandwich, where the ‘Value add’ is in terms of business processing and validation.

    For each of these layers , your priority in building them are slightly different.

    • The Presentation layer is the bit the user sees. You want it to be fast and give a good impression to the client. Underneath, use a standard framework (link: pick your framework here) and then customize the look and feel.
    • The Service layer you want to work fast and well (e.g. no data faults), but then then forget about. Unless things go wrong, no user is going to complement you on the quality of database persistence! Use standard libraries for the entire layer.
    • Unless your company is a clone or franchise, the business layer in the system is going to be completely different. Aside from the user-interface , concentrate most of your project effort here as this is the core of what system does. We’ve written quite a bit about how to increase the value-add of the business layer (link to O’Reilly Technical Articles)
    Technology in plain English » What comes after Java and .Net? Agents.
    www.firstpartners.net/blog/business/business-proce...

    Most systems until now have been centralised : A bit like the old Soviet Union, everything is centrally planned. The trouble is real-life isn’t like that - it’s a market economy with no central control. There’s a story about a Russian Diplomat posted to New York in the 60’s. On a visit to a bakery he asked - who decides how many loaves are baked in the city? The answer is no-one - each baker individually decides how many to bake based on how many he sold the day before. Somehow (almost) everybody gets fed.

    Current OO systems are like the Russian’s view: everything is centrally controlled. Agents are more like New-York (or Dublin) city today - a place full of people (agents) acting in their own self interest. Somehow everything works ok. Economists have a theory that backs this up ; in general a set of people acting in their own self interest gives the best solution at a global level. Or, if you prefer it’s a bit like Ants. Individual Ants are stupid, but together they are clever enough to mark a trail to food and carry it back to the Anthill. It’s called Emergent Behaviour - simple programs combining to give the answers to complex problems.

    So what are agents? Compared to Objects :

    • Agents act in their own self interest , they may decline a request if they think it makes them better off.Objects always respond to a request.
    • Agents have their own thread of control , 1 for each agent. Objects may have their own thread, but most objects don’t. - Agents are pro-active, and seek to improve their lot , according to pre-defined goals.
    • Agents are ‘Coarse Grained’ that is, a system will probably have a few agents will a lot of normal , dependent , objects. It’s similar to the way Enterprise Java Beans are used : not everything is an EJB , and there a still lots of Plain Old java Objects.
    • Objects are designed from the start to work together. Agents can be written by different people , perhaps with widely different goals in mind.
     
    Teach Yourself Programming in Ten Years
    www.norvig.com/21-days.html

    Here's my recipe for programming success:

    • Get interested in programming, and do some because it is fun. Make sure that it keeps being enough fun so that you will be willing to put in ten years.

    • Talk to other programmers; read other programs. This is more important than any book or training course.

    • Program. The best kind of learning is learning by doing. To put it more technically, "the maximal level of performance for individuals in a given domain is not attained automatically as a function of extended experience, but the level of performance can be increased even by highly experienced individuals as a result of deliberate efforts to improve." (p. 366) and "the most effective learning requires a well-defined task with an appropriate difficulty level for the particular individual, informative feedback, and opportunities for repetition and corrections of errors." (p. 20-21) The book Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life is an interesting reference for this viewpoint.

    • If you want, put in four years at a college (or more at a graduate school). This will give you access to some jobs that require credentials, and it will give you a deeper understanding of the field, but if you don't enjoy school, you can (with some dedication) get similar experience on the job. In any case, book learning alone won't be enough. "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter" says Eric Raymond, author of The New Hacker's Dictionary. One of the best programmers I ever hired had only a High School degree; he's produced a lot of great software, has his own news group, and through stock options is no doubt much richer than I'll ever be.

    • Work on projects with other programmers. Be the best programmer on some projects; be the worst on some others. When you're the best, you get to test your abilities to lead a project, and to inspire others with your vision. When you're the worst, you learn what the masters do, and you learn what they don't like to do (because they make you do it for them).

    • Work on projects after other programmers. Be involved in understanding a program written by someone else. See what it takes to understand and fix it when the original programmers are not around. Think about how to design your programs to make it easier for those who will maintain it after you.

    • Learn at least a half dozen programming languages. Include one language that supports class abstractions (like Java or C++), one that supports functional abstraction (like Lisp or ML), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), one that supports coroutines (like Icon or Scheme), and one that supports parallelism (like Sisal).

    • Remember that there is a "computer" in "computer science". Know how long it takes your computer to execute an instruction, fetch a word from memory (with and without a cache miss), read consecutive words from disk, and seek to a new location on disk. (Answers here.)

    • Get involved in a language standardization effort. It could be the ANSI C++ committee, or it could be deciding if your local coding style will have 2 or 4 space indentation levels. Either way, you learn about what other people like in a language, how deeply they feel so, and perhaps even a little about why they feel so.

    • Have the good sense to get off the language standardization effort as quickly as possible.
    Gmail - Inbox
    mail.google.com/mail/
    Interface: interactions with software (human-to-computer, computer-to-computer) -> so, an API should be considered "interface" (human-to-{library,framework,...})
    Database refactorings: 
  • Add Column
  • Alter Sequence
  • Create index
  • Create Sequence
  • Create Table
  • Drop Column
  • Drop Index
  • Drop Sequence
  • Drop Table
  • Insert Data
  • Modify Column
  • Rename Column
  • Rename Table
  • Custom SQL
  • Shirky: Ontology is Overrated -- Categories, Links, and Tags
    www.shirky.com/writings/ontology_overrated.html

    When Does Ontological Classification Work Well?

    Domain to be Organized

    • Small corpus
    • Formal categories
    • Stable entities
    • Restricted entities
    • Clear edges

    Participants

    • Expert catalogers
    • Authoritative source of judgment
    • Coordinated users
    • Expert users

    You can also turn that list around. You can say "Here are some characteristics where ontological classification doesn't work well":

    Domain

    • Large corpus
    • No formal categories
    • Unstable entities
    • Unrestricted entities
    • No clear edges

    Participants

    • Uncoordinated users
    • Amateur users
    • Naive catalogers
    • No Authority
    A Funny Java Flavoured Look at the World: 10 tips on writing reusable code
    hoskinator.blogspot.com/2006/06/10-tips-on-writing...

    10 tips on writing reusable code

    1. Keep the code DRY. Dry means Don't repeat yourself. This is one of the main changes I have tried to bring in. Always try to eradicate duplication and if you find any then move remove the duplication to a relevant place. Sometimes this has lead me to create Static Helper classes or sometimes move it to the class it makes most sense to have it.

    2. Make a class/method do just one thing. This is along the lines of the advice of giving the class only one reason to change. This often means creating methods that other methods use but this helps to make the methods/classes simple and less coupled.

    3. Write unit tests for your classes AND make it easy to test classes. Writing code that is easy to test is decoupled. If you write code and are thinking about writing a unit test for it then you tend to split up the code into smaller testable chunks.

    4. Remove the business logic or main code away from any framework code. Following the rules above will help this. An example I have seen is code that is inside Struts Actions classes, this code is practically impossible to reuse because of all the Struts dependencies that it now linked with.

    5. Try to think more abstractly and use Interfaces and Abstract classes. Try to hide dependencies of code behind a more Generic interface/abstract class. The benefit this gives the code is it creates a flexible point in the code where you can then hide future changes behind.

    6. Code for extension. Write code that can easily be extended in the future. This is particularly true with the above point. If you write code that uses interfaces then you can extend that interface at a later point.

    7. Don't write code that isn't needed. Do the simplest thing possible. Don't waste your time adding methods and classes that might be used in the future. Keep the code simple and focused on what you are trying to deliver. I think I read/heard Josh Bloch say once that "if in doubt, leave it out". Basically who wants to write code that no one (including yourself) is going to use again.

    8. Try to reduce coupling. When writing code think about the links and coupling the code is creating, does it need to be linked to those other classes.

    9. Be more Modular - make your code more modular, think modular, be modular.

    10. Write code like your code is an External API. Imagine the code you are writing is a self contained component.

    Abstraction and indirection are very different yet cooperating concepts with two completely different purposes in software development. Abstraction is used to reduce complexity. Indirection is used to reduce coupling or dependence.

    By creating a simple set of “rules” to evaluate an interface you can start to improve any existing or future code:

    • An abstract interface should not require any configuration to use.
    • A user of an abstract interface should not have to go through more than one function call in a chain to “find” any component they need.
    • If an abstract interface wraps another interface then it should reduce the number of entry points (functions, fields, methods, whatever) when compared to the interface being wrapped.
    • An abstract interface should not have the goal of being replaceable.
    • If an abstract interface stands alone (i.e. doesn’t wrap another) then it should have a minimum number of entry points necessary to provide its services to others.
    X Window System - Wikipedia, the free encyclopedia
    en.wikipedia.org/wiki/X_server

    Design principles of X

    In 1984, Bob Scheifler and Jim Gettys set out the early principles of X:

    • Do not add new functionality unless an implementor cannot complete a real application without it.
    • It is as important to decide what a system is not as to decide what it is. Do not serve all the world's needs; rather, make the system extensible so that additional needs can be met in an upwardly compatible fashion.
    • The only thing worse than generalizing from one example is generalizing from no examples at all.
    • If a problem is not completely understood, it is probably best to provide no solution at all.
    • If you can get 90 percent of the desired effect for 10 percent of the work, use the simpler solution. (See also Worse is better.)
    • Isolate complexity as much as possible.
    • Provide mechanism rather than policy. In particular, place user interface policy in the clients' hands.

    The first principle was modified during the design of X11 to: "Do not add new functionality unless you know of some real application that will require it."

    Martin Perez's weblog: Top ten ways to create a real J2EE disaster
    mpermar.blogspot.com/2006/07/top-ten-ways-to-creat...

    Top ten ways to create a real J2EE disaster

    • #10 Specifying the mechanism for data access without understanding the granularity of the data model

    • #9 Assuming the container will take care of transactions

    • #8 Using a stateless architecture

    • #7 Designing the application for deployment on a single server and leave scalability and realibility up to the container

    • #6 Utilizing popular technologies such as Web Services for component integration and remoting

    • #5 Rolling your own frameworks

    • #4 Distributing synchronous object graphs across servers

    • #3 Designing logic and data flows assuming the application is a single-user system

    • #2 Compensating for a lack of knowledge of the application domain by building in systemic flexibility

    • #1 Putting off system testing until the application is ready to deploy
    Classic Mistakes Enumerated
    www.stevemcconnell.com/rdenum.htm
    People-Related Mistakes Process-Related Mistakes Product-Related Mistakes Technology-Related Mistakes
    1. Undermined motivation

    2. Weak personnel

    3. Uncontrolled problem employees

    4. Heroics

    5. Adding people to a late project

    6. Noisy, crowded offices

    7. Friction between developers and customers

    8. Unrealistic expectations

    9. Lack of effective project sponsorship

    10. Lack of stakeholder buy-in

    11. Lack of user input

    12. Politics placed over substance

    13. Wishful thinking

    14. Overly optimistic schedules

    16. Insufficient risk management

    17. Contractor failure Insufficient planning

    18. Abandonment of planning under pressure

    19. Wasted time during the fuzzy front end

    20. Shortchanged upstream activities

    21. Inadequate design

    22. Shortchanged quality assurance

    23. Insufficient management controls

    24. Premature or too frequent convergence

    25. Omitting necessary tasks from estimates

    26. Planning to catch up later

    27. Code-like-hell programming

    28. Requirements gold-plating

    29. Feature creep

    30. Developer gold-plating

    31. Push me, pull me negotiation

    32. Research-oriented development

    33. Silver-bullet syndrome

    34. Overestimated savings from new tools or methods

    35. Switching tools in the middle of a project

    36. Lack of automated source-code control

    "convention over configuration" -> ontology
    "configuration over convention" -> folksonomy ?
    A business process management solution that improves productivity and profitability. Modular, open s
    www.fujitsu.com/global/services/software/interstag...


    With Interstage Business Process Manager, business users can:

    • Model - Design and visualize business process steps with ease using Interstage Business Process Manager’s intuitive graphical process modeler. Reuse ARIS Business Architect process models and Microsoft Visio process maps to leverage existing investments in business process modeling
    • Automate - Implement well-defined business processes that improves productivity and efficiency
    • Integrate - Leverage existing IT infrastructure. Realize the value of an enterprise-wide shared infrastructure centered around CentraSite, Fujitsu’s SOA repository. Utilize Interstage Business Process Manager's modular, open standards-based architecture to make integration into existing environments easy while guaranteeing interoperability with future investments
    • Manage - Track real-time process performance using Interstage Business Process Manager’s customizable Business Activity Monitoring (BAM) dashboards. Gain control over business operations with ARIS Process Performance Manager’s powerful process analytics and reporting capabilities
    • Optimize - Identify and eliminate process bottlenecks and maximize resource utilization to improve business process efficiencies.
    John Reynolds's Blog: Why Use A Database Instead Of ____?
    weblogs.java.net/blog/johnreynolds/archive/2006/07...
    Some people say that any problem can be solved just by adding an other layer of indirections. Problem with that: Information is invariant under indirection.
    Psychologists have identified a state of mind called flow in which we're capable of incredible concentration and productivity. The importance of flow to programming has been recognized for nearly two decades since it was discussed in the classic book about human factors in programming Peopleware: Productive Projects and Teams by Tom DeMarco and Timothy Lister (Dorset House, 1987). The two key facts about flow are that it takes around 15 minutes to get into a state of flow and that even brief interruptions can break you right out of it, requiring another 15-minute immersion to reenter. DeMarco and Lister, like most subsequent authors, concerned themselves mostly with flow-destroying interruptions such as ringing telephones and inopportune visits from the boss. Less frequently considered but probably just as important to programmers are the interruptions caused by our tools. Languages that require, for instance, a lengthy compilation before you can try your latest code can be just as inimical to flow as a noisy phone or a nosy boss. So, one way to look at Lisp is as a language designed to keep you in a state of flow.
    One Man Hacking: But Martin, Enterprise Software IS Boring
    ravimohan.blogspot.com/2006/07/but-martin-enterpri...

    Paul Graham (admittedly a biased source) says (emphasis mine),

    "It's pretty easy to say what kinds of problems are not interesting: those where instead of solving a few big, clear, problems, you have to solve a lot of nasty little ones....Another is when you have to customize something for an individual client's complex and ill-defined needs. To hackers these kinds of projects are the death of a thousand cuts.

    The distinguishing feature of nasty little problems is that you don't learn anything from them. Writing a compiler is interesting because it teaches you what a compiler is. But writing an interface to a buggy piece of software doesn't teach you anything, because the bugs are random. [3] So it's not just fastidiousness that makes good hackers avoid nasty little problems. It's more a question of self-preservation. Working on nasty little problems makes you stupid. Good hackers avoid it for the same reason models avoid cheeseburgers."

    The Eight Fallacies of Distributed Computing
    today.java.net/jag/Fallacies.html

    The Eight Fallacies of Distributed Computing 



    1. The network is reliable


    2. Latency is zero


    3. Bandwidth is infinite


    4. The network is secure


    5. Topology doesn't change


    6. There is one administrator


    7. Transport cost is zero


    8. The network is homogeneous
    Erlang processes generally communicate with other Erlang processes in a homogeneous environment (note: Erlang processes are not OS-level processes). But each process doesn't know a lot about other processes. There's no reason they all have to be written in the same language.
    The Universe of Discourse : Design patterns of 1972
    newbabe.pobox.com/~mjd/blog/2006/09/11/#design-pat...
    Patterns are signs of weakness in programming languages.
    E.W. Dijkstra Archive: On the cruelty of really teaching computing science (EWD 1036)
    www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx...
    The usual way in which we plan today for tomorrow is in yesterday's vocabulary.
    Many people do not realise that Excel spreadsheets are functional programs.
    AI - The art and science of making computers do interesting things that are not in their nature.
    Packrat Parsing: a Practical Linear-Time Algorithm with Backtracking
    pdos.csail.mit.edu/~baford/packrat/thesis/
    The primary disadvantage of packrat parsing is its storage cost, which is a constant multiple of the total input size rather than being proportional to the nesting depth of the syntactic constructs appearing in the input
    The Ex Factor - O'Reilly ONLamp Blog
    www.oreillynet.com/onlamp/blog/2006/09/the_ex_fact...
    Peter Scott made the point at OSCON 2006 that an average, one-hundred line Perl program can accomplish about as much work as an average, thousand line C program, yet developers take the thousand line program much more seriously than the hundred line program as it’s ten times the code.
    Patterns are about what to build, not how to build it.
    Any system in which two concurrent agents can name the same piece of data must also exhibit the standard problems of concurrency: broken serializability, race conditions, deadlocks, livelocks, lost event notifications, and so on. Concurrency control is simply a requirement if correctness is desired.
    Dr. Dobb's | Multitasking Alternatives and the Perils of Preemption | September 14, 2006
    www.ddj.com/dept/embedded/193000965
    Figure 1 - Ten Negative Implications of Preemption
    Cryptography | The non-denial of the non-self | Economist.com
    www.economist.com/science/displayStory.cfm?story_i...
    Dr Esponda sees great potential for using negative databases when there is a need to look at the intersection of many sets of data owned by different parties. Two or more banks, for example, might wish to work out which transactions they have in common without revealing the whole contents of their databases. Using negative databases to do this would, according to Dr Esponda, provide a robust back-up to traditional cryptography, which relies on codes that can be broken.
    Its about the progression of a Lisp programmer - the newbie realizes that the difference between code and data is trivial. The expert realizes that all code is data. And the true master realizes that all data is code.
    Paul’s Pontifications » Blog Archive » Silver Bullets Incoming!
    cogito.blogthing.com/2006/12/08/silverbulletsincom...

    Lines of code is a lousy metric

    I think that Dijkstra had it right: a line of code is a cost, not an asset. It costs money to write, and then it costs money to maintain. The more lines you have, the more overhead you have when you come to maintain or extend the application.

    Paul’s Pontifications » Blog Archive » Silver Bullets Incoming!
    cogito.blogthing.com/2006/12/08/silverbulletsincom...
    Libraries and languages are complicit: they affect each other in important ways. In the long run the language that makes libraries easier to write will accumulate more of them, and hence become more powerful.
    Paul’s Pontifications » Blog Archive » Silver Bullets Incoming!
    cogito.blogthing.com/2006/12/08/silverbulletsincom...
    Trying to retrofit ideas from one paradigm into a language designed for another is generally a bad idea.
    Ruby on Rails Development: The Software Complexity Triangle
    rubythis.blogspot.com/2006/12/software-complexity-...
    The points on the Software Complexity Triangle are Simplicity, Power, and Design:


    On this diagram, Simplicity represents the ease of using a system, both for end users as well as for operational support or back-office staff. Power represents the overall capability and depth of functionality of the system. Design represents the expertise of your software development team, particularly the depth and breadth of their technical skills as well as their knowledge of the problem domain in which they are working.
    The Semantic Web: Everything you wanted to know but were too afraid to ask. - O'Reilly XML Blog
    www.oreillynet.com/xml/blog/2006/12/the_semantic_w...
    it’s like installing a huge relational database on the internet, where anyone can add tables to the database, and anyone can add data to a table. Tables and data can map to one another if you want, like foreign and primary keys
    Enfranchised Mind » The Functional-Relational Impedance Match
    enfranchisedmind.com/blog/archive/2006/06/17/142
    To faithfully model SQL we must, on some level, faithfully model the relational calculus. And this is where I think the Object Oriented programmers go astray in trying to interface to SQL. In their hurry to make things into objects, they immediately (and without fail) declare the rows to be objects- and thus miss the fact that relational calculus and thus SQL is about relations, not rows.
    Enfranchised Mind » The Functional-Relational Impedance Match
    enfranchisedmind.com/blog/archive/2006/06/17/142
    Another advantage functional programming confers on interacting with a database is immutable data structures- the elements of an instantiated relation/table are immutable, and thus the question of what happens when you change a row of a table is completely avoided, because you can’t change a row of the table except by explicitly inserting them.
    RFC 1925 (rfc1925) - The Twelve Networking Truths
    www.faqs.org/rfcs/rfc1925.html
    Good, Fast, Cheap: Pick any two (you can't have all three)
    Etymon: Interpreter Pattern and Structural Recursion
    etymon.blogspot.com/2006/04/interpreter-pattern-an...
    We solve problems with computers, ultimately we do so with sequences of opcodes passed to the execution unit of our cpus; but the number of concepts we can express in a single sentence in machine code is limited, and the amount of detail we can choose to ignore when it is irrelevant to our solution is minimal. The act of climbing the language stack, (machine code -> symbolic assembly -> macro assembly -> C -> libc -> [java, Scheme, ML, etc]) is an exercise in increasing these two measures
    Nub Games » Liberating Myself from the von Neumann Style
    blogs.nubgames.com/code/?p=4
    The central problem with the von Neumann model is that it’s hard to reason about. The only way to understand a program written to the von Neumann architecture is to execute it.
    Nub Games » Liberating Myself from the von Neumann Style
    blogs.nubgames.com/code/?p=4
    those who do not understand Lisp are doomed to reinvent it (poorly)
    Haskell, bondage-and-discipline and separation-of-concerns programming « Data.Syntaxfree
    syntaxfree.wordpress.com/2007/01/08/haskell-bondag...
    The perception that monadic IO entails “jumping through hoops” is arguably an artifact of the sheer culture shock between programmers trying to get things done quickly and computer scientists trying to prove formal theories of program calculation.
    Haskell, bondage-and-discipline and separation-of-concerns programming « Data.Syntaxfree
    syntaxfree.wordpress.com/2007/01/08/haskell-bondag...
    Basically, what lazy evaluation brings to the table is that data-generating functions can be written abstractly, manipulated implicitly and computed only as actual results are requested.
    Paul’s Pontifications » Blog Archive » Composability and Productivity
    cogito.blogthing.com/2007/01/07/composablility-and...
    So what would a language look like if it got rid of all of these non-composable constructs? The answer, basically, is Haskell. The underlying goal of functional language designers is to make everything completely composable. Haskell is the language that has advanced furthest towards this goal.
    Ruminations of a Programmer: Why I should learn Lisp
    debasishg.blogspot.com/2007/01/why-i-should-learn-...
    With macros, closures, and run-time typing, Lisp transcends object-oriented programming.
    reddit.com: programming - what's new online
    programming.reddit.com/
    "Curried food and curried functions are both acquired tastes" 
    Good Math, Bad Math : Haskell: the Basics of Type Classes
    scienceblogs.com/goodmath/2007/01/haskell_the_basi...
    Type declarations let us say "the value of this parameter can't be just any value - it must be a value which is a member of this particular type"; type-class declarations let us say "the type parameter for instantiating this function can't be just any type - it must be a type which is a member of this type-class."
    Good Math, Bad Math : Haskell: the Basics of Type Classes
    scienceblogs.com/goodmath/2007/01/haskell_the_basi...
    Curry-Howard isomorphism, which shows that type systems for lambda calculus are isomorphic to inference systems in some logic. The simply-typed lambda calculus has a type system related to simple propositional logic; Haskell, with its type variables, has a type system derived from first order predicate logic.
    Ruminations of a Programmer: Syntax Extensibility, Ruby Metaprogramming and Lisp Macros
    debasishg.blogspot.com/2007/01/syntax-extensibilit...
    Abstraction, as they say, is an artifact of the solution domain, which should ultimately bring you closer to the problem domain.
    Service-oriented architecture - Wikipedia, the free encyclopedia
    en.wikipedia.org/wiki/Service-oriented_architectur...

    OASIS (the Organization for the Advancement of Structured Information Standards) defines SOA as the following:

    A paradigm for organizing and utilizing distributed capabilities that may be under the control of different ownership domains. It provides a uniform means to offer, discover, interact with and use capabilities to produce desired effects consistent with measurable preconditions and expectations.

    OASIS SOA Reference Model - Wikipedia, the free encyclopedia
    en.wikipedia.org/wiki/OASIS_SOA_Reference_Model
    (SOA) Service: A mechanism to enable access to one or more capabilities, where the access is provided using a prescribed interface and is exercised consistent with constraints and policies as specified by the service description
    bluebones.net » von Neumann on Programming
    bluebones.net/2006/09/von-neumann-on-programming/
    1. Conceptualize the problem mathematically and physically and give a rigorous but perhaps implicit set of equations describing it.
    2. Select a numerical algorithm, that is, an explicit arithmetical procedure (which may be approximate) to replace these rigorous mathematical expressions.
    3. Do a numerical analysis to estimate the precision of the approximation process by means of an investigation of the role of errors introduced by the procedure (truncation errors) and by the machine (round-off errors).
    4. Determine the scale factors so that the mathematical expressions do not assume values that fall outside the fixed range of the computer at any time during the course of the computation.
    5. Do the dynamic analysis by drawing a flow diagram.
    6. Write the static code and enter it into the machine.

    Description of programming from ‘Planning and Coding of Problems for an Electronic Computing Instrument’ by Goldstine and von Neumann, 1947-48. Quoted in ‘John von Neumann and the Origins of Modern Computing’ by William Aspray (MIT Press, 1990).

    Nub Games » One Month with Haskell
    blogs.nubgames.com/code/?p=17
    By being pure (no side effects), by being non-strict, and by structuring computation with monads, Haskell forces you to think differently in order to use it effectively.  This is the greatest difference between Haskell and other languages such as, say, Lisp, that allow you to think differently.
    Neal Gafter's blog: A Definition of Closures
    gafter.blogspot.com/2007/01/definition-of-closures...
    A closure is a function that captures the bindings of free variables in its lexical context.
    Neal Gafter's blog: A Definition of Closures
    gafter.blogspot.com/2007/01/definition-of-closures...

    What are the lexically scoped language constructs in Java?

    • The meaning of variable names.
    • The meaning of method names.
    • The meaning of type names.
    • The meaning of this.
    • The meaning of names defined as statement labels.
    • The referent of an unlabelled break statement.
    • The referent of an unlabelled continue statement.
    • The set of checked exceptions declared or caught.
    • The referent of a return statement.
    • The definite assignment state of variables.
    • The definite unassignment state of variables.
    • The reachability state of the code2.
    Good Math, Bad Math : Basics: Correlation
    scienceblogs.com/goodmath/2007/01/basics_correlati...
    Correlation is not the same thing as causation - but it's a darn good hint!
    The Little Calculist: The call stack is not a history
    calculist.blogspot.com/2006/03/call-stack-is-not-h...
    The evaluation context, i.e. call stack, is not about the history of the program execution. It contains a complete record of the remainder of the program execution, the work the program has left to do.
    The Little Calculist: The call stack is not a history
    calculist.blogspot.com/2006/03/call-stack-is-not-h...
    stack inspection is fundamentally about inspecting the future of the computation, not about recording its history
    a language only evolves if its designers and advocates can acknowledge problems
    Haskell Weekly News: January 31, 2007 | The Haskell Sequence
    sequence.complete.org/hwn/20070131
    Think of a monad as a spacesuite full of nuclear waste in the ocean next to a container of apples. now, you can't put oranges in the space suite or the nucelar waste falls in the ocean, *but* the apples are carried around anyway, and you just take what you need
    iScreen 1.1.0 released: POJO Validation Framework
    www.theserverside.com/news/thread.tss?thread_id=44...
    Validation is not designed to handle/support real business logic. Validation is a means to ensure that the data an object (or object graph) contains meets certain standards. It makes no judgment upon how that data fits within the overall business model. Business logic (and rules engines) represent decision-making capabilities. Validation engines don't.
    Too Much Code: Part 2: Languages and the Lesser-Skilled Developer
    toomuchcode.blogspot.com/2007/02/part-2-languages-...
    The idea of programming as a semiskilled task, practiced by people with a few months' training, is dangerous. We wouldn't tolerate plumbers or accountants that poorly educated. We don't have as an aim that architecture (of buildings) and engineering (of bridges and trains) should become more accessible to people with progressively less training. Indeed, one serious problem is that currently, too many software developers are undereducated and undertrained.
    Too Much Code: Part 2: Languages and the Lesser-Skilled Developer
    toomuchcode.blogspot.com/2007/02/part-2-languages-...
    good design often takes second place to deadlines -- and a language that has the appearance of slowing development won't get far, even if it offers a net gain
    Making it stick.: Misguided: The Road Not To Be Travelled
    patricklogan.blogspot.com/2007/02/misguided-road-n...
    The interaction between distributed (and therefore concurrent) activities involves two things: data transfer and coordination. Synchronisation to avoid race conditions is just one form of coordination. Systems also need to coordinate activities that don't share data. Message-passing covers all forms of coordination.
    Making it stick.: Misguided: The Road Not To Be Travelled
    patricklogan.blogspot.com/2007/02/misguided-road-n...
    The major advantage of STM as a system is that it gives you certain guarantees about composability of already working systems. It's not magical, it doesn't always ensure that things will play nicely together, but it does give you far more guarantees about the correctness of compositions than previous systems have.
    Enfranchised Mind » Thoughts on Parallelism
    enfranchisedmind.com/blog/archive/2007/02/08/191
    Do message passing, ala MPI or Erlang, at the top level, breaking the problem up into big chunks which can then be distributed over a local network or a highly non-uniform ccNUMA architecture. But then each chunk is solved in a microthread+STM approach, allowing for good utilization of local resources and tightly coupled parallel processes.
    Enfranchised Mind » Thoughts on Parallelism
    enfranchisedmind.com/blog/archive/2007/02/08/191
    The only advantage message passing has over STM in the emergent complexity department is that it encourages bigger chunks per thread (due to the relatively high cost of communication)- fewer interacting components means less emergent complexity. But fewer interacting components also means less parallelism, and less performance on future hardware.
    Enfranchised Mind » Thoughts on Parallelism
    enfranchisedmind.com/blog/archive/2007/02/08/191
    Wether it’s Erlang and message passing, Haskell and STM, or some hybrid, it looks like the solution is going to be functional programming plus something else. What really drove the adoption of OO programming was GUIs

    The question is asked over on LtU about my transactional memory rant...

    why is the under-the-covers complexity of STM bad, when the under-the-covers complexity of garbage collection is good?
    There is a glaringly obvious answer to this...

    A garbage collector eliminates tons of complexity from the application developer's burden, allowing the app developer to focus more on the true problem domain.

    Transactional memory does no such thing. Application developers have to think about shared memory, potential conflicts, how to express them as transactions, and as mental points out: ultimately how to *recover* from a transaction failure.

    λ Tony’s blog λ » Blog Archive » Ignorance is mostly bliss, but not always
    blog.tmorris.net/ignorance-is-mostly-bliss-but-not...
    Scala is what I consider a very pragmatic (to steal a buzzword from the hype generators) approach to software development as it exists today. It satisfies the incompetent assertions of the illegitimate authority (aka management) — “you must use Java (et al.)”, while still allowing a reasonably concise expression and programming paradigm e.g. Scala has pattern matching, case classes, variance annotations, higher-order functions and implicit defs (similar to Haskell type-classes). These features alone dramatically reduce the amount of repititious work that you otherwise do in more mainstream languages by one of those crazy orders of magnitude that would never be believed by a mainstream programmer and so could easily be explained away as nonsense with support from other ill-informed peers (those who know what I mean, know what I mean).
    Amazon.com: Purely Functional Data Structures: Books: Chris Okasaki
    www.amazon.com/Purely-Functional-Structures-Chris-...
    many functional data structures can compactly represent not just their current state, but all of their past states as well--a feature called "Persistence".
    Notes on Haskell: What's wrong with the For Loop, Revisited
    notes-on-haskell.blogspot.com/2007/02/whats-wrong-...
    Maybe the debate about adding closures to Java isn't really about adding closures to Java. Maybe it's about bringing higher order programming to Java, where the most vocal part of the debate involves complaining about the proposed syntax, or questioning the value making a large language definition even larger..
    Gmail - Inbox
    mail.google.com/mail/
    We know about as much about software quality problems as they knew about the Black Plague in the 1600s. We've seen the victims' agonies and helped burn the corpses. We don't know what causes it; we don't really know if there is only one disease. We just suffer -- and keep pouring our sewage into our water supply.          -- Tom Van Vleck

    "Yet by obscuring the true data source these solutions end up throwing away the most compelling feature of relational databases; the ability for the data to be queried."

    Microsoft, DLinq .NET Language-Integrated Query for Relational Data, May 2006
    Software Engineering Proverbs
    www.multicians.org/thvv/proverbs.html

    Wexelblat's Scheduling Algorithm:

    Choose two:

    • Good
    • Fast
    • Cheap
    Software Engineering Proverbs
    www.multicians.org/thvv/proverbs.html
    "If you think good architecture is expensive, try bad architecture."
    Notes on Haskell: Haskell: Raising the bar
    notes-on-haskell.blogspot.com/2007/02/haskell-rais...

    language features that any new language needs to provide today to "not suck":

    1. Object-literal syntax for arrays and hashes
    2. Array slicing and other intelligent collection operators
    3. Perl 5 compatible regular expression literals
    4. Destructuring bind (e.g. x, y = returnTwoValues())
    5. Function literals and first-class, non-broken closures
    6. Standard OOP with classes, instances, interfaces, polymorphism, etc.
    7. Visibility quantifiers (public/private/protected)
    8. Iterators and generators
    9. List comprehensions
    10. Namespaces and packages
    11. Cross-platform GUI
    12. Operator overloading
    13. Keyword and rest parameters
    14. First-class parser and AST support
    15. Static typing and duck typing
    16. Type expressions and statically checkable semantics
    17. Solid string and collection libraries
    18. Strings and streams act like collections
    How to write programs in two easy steps « Types, Programming, etc.
    edwinb.wordpress.com/2007/02/19/how-to-write-progr...

    how to write any computer program in two easy stages:

    • Design and implement the programming language which would be best for solving the problem.
    • Write the program in the language you’ve just implemented.
    Tantek's Thoughts — 2007 February
    tantek.com/log/2007/02.html#d19t1813
    Hypothesis 1: Human interface cognitive load is proportional to the number of clicks/keystrokes/gestures.
    Tantek's Thoughts — 2007 February
    tantek.com/log/2007/02.html#d19t1813
    Hypothesis 2: Human interface cognitive load is inversely proportional to interface latency.
    Tantek's Thoughts — 2007 February
    tantek.com/log/2007/02.html#d19t1813
    Hypothesis 3: The usability of an interface is inversely geometrically proportional to its cognitive load.
    messaging is something that should be built under an object transport layer, not on top of it. Messaging is a more general idiom than object method invocation.
    Any sufficiently complicated Lisp or Ruby program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Haskell.
    Raganwald: Haskell, Ruby and Infinity
    weblog.raganwald.com/2007/02/haskell-ruby-and-infi...
    Any sufficiently complicated Lisp or Ruby program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Haskell.
    Gmail - [Haskell-cafe] Trouble with record syntax and classes
    mail.google.com/mail/?fs=1&tf=1&view=cv&search=all...
    When you type "class Foo" in Java or C++, it does three things:

    1. It declares a new type called "Foo".

    2. It declares a _set_ of types (i.e. a "class").

    3. It declares that the type Foo (and all of its subtypes) is a member
    of the set of types Foo.

    In Haskell, these three operations are distinct.

    1. You declare a new type using "data" or "newtype".

    2. You declare a new set of types using "class".

    3. You declare that a type is a member of a class using "instance".
    Gmail - [Haskell-cafe] Trouble with record syntax and classes
    mail.google.com/mail/?fs=1&tf=1&view=cv&search=all...
    You can think of a type as a set of values.  For example, Bool is the
    set { False, True }.  A "class", then, is a set of types.

    The distinction between "set" and "class" comes from the various set
    theories (Goedel-Bernays-von Neumann set theory being the most common)
    which try to avoid Russell's Paradox.
    Yet Another Language Geek : Immutability, Purity, and Referential Transparency
    blogs.msdn.com/wesdyer/archive/2007/03/01/immutabi...
    Make it correct, make it clear, make it concise, make it fast.  In that order. 
    Nub Games » Haskell IO for Imperative Programmers
    blogs.nubgames.com/code/?p=22
    A language is strict if it evaluates the arguments to a function before it evaluates the function. A non-strict language doesn’t.
    Monads in functional programming provide a framework for aspect-aware computations to be composed to build higher-level aspect-aware computations. An aspect-aware computation is some basic computation that has been enhanced, augmented, or, more generally, just transformed, to become aware of some generic concern.
    Non-empty list - HaskellWiki
    www.haskell.org/haskellwiki/Non-empty_list
    Errors such as taking head or tail of the empty list in Haskell are equivalent to the dereferencing of the zero pointer in C/C++ or NullPointerException in Java. These errors occur because the true domain of the function is smaller than the function's type suggests.
    Half an Hour: Why the Semantic Web Will Fail
    halfanhour.blogspot.com/2007/03/why-semantic-web-w...
    The Semantic Web will never work because it depends on businesses working together, on them cooperating.
    Giles Bowkett: Can Your Rails App Write Itself?
    gilesbowkett.blogspot.com/2007/03/can-your-rails-a...
    The big open secret of software development is that good programmers aren't engineers at all -- we're artists, and artists who aren't living on the edge aren't living at all.
    Ten Questions with Joe Armstrong about Parallel Programming and Erlang | Thinking Parallel
    www.thinkingparallel.com/2007/03/20/ten-questions-...

    Shared memory systems are impossibly difficult to understand and get right, especially when errors occur. It’s bad enough without errors, but with errors it’s virtually impossible. If a program holds a lock and is messing around with shared memory and crashes how the heck can the other processes know what it was doing and fix up the errors?

    Transaction memories and pure message passing system suffer from none of these problems.

    Notes on a possible Gems-like environment using Haskell:

    * Functions shown as components with many input ports and one output port
    * Editor could interface with GHCi to infer types dinamically during design
    * Diagram show legend with associated colors to types
    * Connect suggestions based on types
    * Multiple connections from the output port can denote "let..in" expressions
    * Inference of function arguments based on unmatched variable names in the function body
    * When connecting, re-evaluate types of affected components
    * Components with "burned" inputs represent lambdas as their outputs
    * Ask for missing inputs at component runtime (tests during design)
    * Burns can be inferred according to types when connecting
    * When ambiguous burning, currying could be suggested, burning arguments starting from the first
    * Intellicut: auto-completion of connections
    * Algebraic data types accessor functions using OOP classical dot notation
    * How to represent recursion and pattern matching ?
    * Why are code gems separate from regular function gems ?
    The content on this page is provided by a Google Notebook user, and Google assumes no responsibility for this content.