All of the interesting technological, artistic or just plain fun subjects I'd investigate if I had an infinite number of lifetimes. In other words, a dumping ground...

Friday 13 May 2011

A Guide to Undefined Behavior in C and C++, Part 1

http://blog.regehr.org/archives/213

Thursday 12 May 2011

What are important languages to learn to understand different approaches and concepts?

http://stackoverflow.com/questions/3958630/what-are-important-languages-to-learn-to-understand-different-approaches-and-conc

Matters of practicality are highly subjective, so I will simply say that learning different language paradigms will only serve to make you a better programmer. What is more practical than that?

Functional, Haskell - I know you said that you didn't want to, but you should really really reconsider. You've gotten some functional exposure with Clojure and even Python, but you've not experienced it to its fullest without Haskell. If you're really against Haskell then good compromises are either ML or OCaml.

Declarative, Datalog - Many people would recommend Prolog in this slot, but I think Datalog is a cleaner example of a declarative language.

Array, J - I've only just discovered J, but I find it to be a stunning language. It will twist your mind into a pretzel. You will thank J for that.

Stack, Factor/Forth - Factor is very powerful and I plan to dig into it ASAP. Forth is the grand-daddy of the Stack languages, and as an added bonus it's simple to implement yourself. There is something to be said about learning through implementation.

Dataflow, Oz - I think the influence of Oz is on the upswing and will only continue to grow in the future.

Prototype-based, Javascript/Io/Self - Self is the grand-daddy and highly influential on every prototype-based language. This is not the same as class-based OOP and shouldn't be treated as such. Many people come to a prototype language and create an ad-hoc class system, but if your goal is to expand your mind, then I think that is a mistake. Use the language to its full capacity. Read Organizing Programs without Classes for ideas.

Expert System, CLIPS - I always recommend this. If you know Prolog then you will likely have the upper-hand in getting up to speed, but it's a very different language.

Frink - Frink is a general purpose language, but it's famous for its system of unit conversions. I find this language to be very inspiring in its unrelenting drive to be the best at what it does. Plus... it's really fun!

Functional+Optional Types, Qi - You say you've experience with some type systems, but do you have experience with "skinnable* type systems? No one has... but they should. Qi is like Lisp in many ways, but its type system will blow your mind.

Actors+Fault-tolerance, Erlang - Erlang's process model gets a lot of the buzz, but its fault-tolerance and hot-code-swapping mechanisms are game-changing. You will not learn much about FP that you wouldn't learn with Clojure, but its FT features will make you wonder why more languages can't seem to get this right.

Enjoy!


Tuesday 3 May 2011

Secrets of Power Negotiating

http://www.korokithakis.net/posts/secrets-power-negotiating/

Nibbling. This is the principle of getting something extra, after everything else has been agreed upon. For example, you agree to buy a couch for a price, and then say "can you throw in that pillow as well?". The other person has made up their mind, so they're more receptive to adding something extra.

Higher authority. Always have a "higher authority" that you have to "check with" before you can make a decision. This ensures both that you will have more time to think about the deal, and that you will be able to put more pressure on the other party without leading to confrontation (as you do not appear to be the one responsible for the pressure).

Good guy, bad guy. This is the well-known technique of saying "I think this is a great offer, but X doesn't think so", and can be used effectively with the higher authority technique.

Impasse. If the negotiations reach an impasse, you can try to set the specific matter aside and talk about the other points of the negotiation, even if they are the minor ones. This establishes momentum and makes it easier for both parties to settle the point they were at an impasse on earlier.

Agree with people. No matter what peolpe say, agree with them and then gently nudge them to another direction. Arguing makes them go on the defensive and impedes the negotiation.

Flinch. This one is self-explanatory. Always flinch and act indignant at the first offer, no matter how good it may be. This leads the other party to believe that the offer is not good enough.

Play dumb. Don't show your hand, it's better to play dumb than to flaunt your intelligence to the other party. This makes them underestimate and sympathize with you

Be prepared to walk away. Once you decide to close the deal at any cost, you have lost the negotiation. Always be prepared to walk away.

The power of writing. Seeing something in writing is much more powerful than just hearing about it. Always use writing (the more official-looking the better) when possible.

Don't make the first offer. If you make the first offer, you're revealing the range you want to go for. Always let the other person make the first offer, if possible.

Congratulate at the end. Never gloat after a negotiation, congratulate the other person and make them feel good about the negotiation.

Be the one who writes the contract. Try to be the person who writes the contract. This allows you to add a few details that the other party has to negotiate out of the contract afterwards.

Fait accompli. This is the principle of sending the other party a proposal with the assumption that they are going to accept it exactly the way it's written. For example, you can send a contract and a cheque to the other party, thus putting them in the position that they have to either decide whether to take the slightly modified offer, or come back to the negotiation and draw it out, risking failure.

Think in real money. Convert quotes to scales that make sense. If, for example, someone quotes you a price in cents per day for a contract that will last for years, it can add up to a significant cost increase. Always think in terms of real money.

Red herring. Add terms to the negotiation that you don't really care about, just so you can give them away later to gain something else from the other party.

Puppy dog. This is the practice of letting people try products before buying them, at which point they will be hooked to the product and have a much higher chance at purchasing it. Try to make people think about the benefits of the deal in the long term, this way they will be more likely to forgo the short-term costs.

Reluctant buyer. Act like you aren't very interested in the offer. This gives you leverage.

Want it all. Ask for as many things as you can, even things you don't want. This way, you set the other person up to "win" by making you relinquishing terms you didn't even care for. It also helps you get more things than you initially planned for.

Don't split the difference. Never split the difference yourself, but always try to get the other person to split their offer. This way you can split the difference over and over again on their end without relinquishing anything of yours.

These are the points in the book that come to mind. I haven't explained them in nearly as much detail as the book does, and I haven't provided ways to counter each technique when other people use it on you. So, if you felt that this list is interesting, I would urge you to buy the book. I heavily recommend it.

tim's shared items

Add to Google Reader or Homepage