Search

3/07/2014

同工不同酬?年薪 50 萬美金的工程師到底作哪些工作啊? | Winston Chen

同工不同酬?年薪 50 萬美金的工程師到底作哪些工作啊? | Winston Chen

他們究竟是作哪些事情,或是擁有哪些技術,讓他們如此值錢?這些東西有辦法用『學』的嗎? 首先,這篇是翻譯文章,原文在此:What kind of jobs do the software engineers who earn $500K a year do? 。我偶而會讀到幾篇我想要全文翻譯分享的文章,比如說上一篇祕技 - 沒有人教過你的應徵技巧跟這篇,翻譯分享之前,我都會直接聯絡原文作者,徵求同意,並作交換連結。一般而言(至少這兩篇拉),原文作者都會很啊薩力地大方同意,還會在來往的信件中不經意地露出他暗爽所受的內傷,總之我想說的是,不要亂去翻譯沒有版權的文章放到自己的平台上面,那內容不是你的,要轉載,要翻譯好歹也問一下原作者吧 XD 背景資訊 之前 Business Insider 出了一篇某個 Google 工程師拒絕年薪 50 萬工作,因為 Google 每年附他 300 萬美金的文章,有個對這數字很有興趣的人就上 Quora 問了,我要怎麼作才會跟他一樣?我也要到 Google 上班然後年薪 300 萬美金這樣(誰不想啊?) 這位叫 Amin Ariana 的創業家就上 Quora 寫了一則被讚到破表的回答,我自己非常同意,也受到很多啟發,因此跟 Amin 聯絡獲得允許,分享他的文章如下。 以下正文開始 聲明:我之前也是 Google 的員工,但是我的回答不代表 Google 的觀點。 首先,這問題問得有點奇怪,有點誤導人,好像只要工程師做了哪幾點,或是獲得哪些技能以後,就可以掛到年薪 50 萬的保證。其實 Business Insider 那邊說得很清楚了,50 萬美金其實是薪水跟股票的總和。 一類跟二類勞工 要了解高昂報酬背後的條件,讓我先先來打個比方。 假設你是村子裡面非常重要的,負責水源供給的勞工好了。這裡有兩種勞工類型:一類勞工,與二類勞工。 一類勞工會拎起一到兩個水桶,衝到水源旁邊,裝滿它們,把他們兩個挑回來,大概夠 20 個人喝吧,如此一來有水喝的村民就皆大歡喜了。這個勞工挑水的過程可能會喝掉一些水,然後回到村中,他可能可以分一些水回家作他的報酬。 二類勞工不太理所謂『公平分水』的概念,他會拿起一把鏟子,帶上一止水杯,然後忽然間就消失了。他跑到水源處,挖起一條可以通到村莊的小溪,希望可以把水源引過來。每當他拖著疲憊的身軀,拎著空杯子回到村莊的時候,總會引起一陣失望,但是不知道為什麼那村中的長老相信他,相信他在做的事情(還丟根骨頭給他啃,讓他不致餓肚子)。 某天,他直挺挺的站在村莊前面,他深後白涔涔地流躺著一條飲用水的小溪。這條小溪立刻把一類專門經營『水快遞』的勞工趕出市場,他們只好轉行,加入別的團隊。這個二類勞工呢,看他對這條小溪擁有多少的控制權,一般而言,他有小溪很大部分的擁有權。 後來村莊決定要把小溪整個買下來,整進整個村莊的供水系統,於是村莊拿了他們一部分的財產去換,比如說土地啊什麼的,這個二類勞工於是瞬間升級變成地主了。 村子裡面的媒體注意到村子給這個二類勞工的薪水奇高,別村的人根本挖不動他(他應該是有跟村子簽訂協議,比如要在村子裡留兩年,才能領完全額的報酬之類的),於是出了一篇報導,寫得好像別村出高價挖角,卻因為村子給的薪水太好,以致於這個二類勞工根本不會考慮。 這時候,一類勞工看了媒體報導,覺得村子虧待他們,同工不同酬(請看下面這個兩隻猴子同工不同酬的影片),心生不滿。 沙灘上的掘渠者 來說說一個真實的故事吧。 今年跨年的時候,我跑去 Monterey Bay 玩,沙灘上有個年輕人在挖洞,我饒有興致地站在高處看,我太太欣賞著沙灘美景,其他人根本不在意這個年輕人的舉動,沒有人理他。我指著他轉頭跟太太說:『你等著看,30分鐘以後,周遭的所有人都會加入,幫這個年輕人挖』 30 分鐘以後,他挖出了一條小渠道,從他沙灘上的城堡直挺挺的延伸到海邊有水的地方,希望把海水引入渠道,注入他的護城河。那渠道還不夠深,海水還進不來,於是年輕人忙著加深河道。又過了 5 分鐘,原本站在旁邊看熱鬧的小孩們開始加入,動手幫忙。10 分鐘以後,周遭的機個大人也開始挖掘。15 分鐘以後,一個靦腆的,拎著相機的外國人也投入幫忙。60 分鐘之內,這位二類勞工影響了 15 個一類勞工自願投入,一起把海水引入護城河。 文章開頭的照片就是我當時照的,永久地紀念我對個人力量的賭注。那個拿著紫色桶子的傢伙就是渠道的創始者,不過照片上看不出來就是了。 新聞報導總是很喜歡忽略很多真實的細節,這篇年薪 50 萬的報導就忽略掉『汗水並不等價』這個部分。二類勞工願意突破現狀,孤獨地,有時候可能還要挨餓一小段時間來引入村子賴以維生的水源,一類勞工則是用自己完成的工作與技能去交換薪水,兩者最主要的差異是冒險,而且不保證一定會回收。 村子裡有遠見的那群人可以說都是二類勞工(在 Goolge 裡面領高新的那群),他們篳路藍縷,以啟山林,連結了村莊的水源。這些拿很多股票的傢伙大概是下列其中一種: 在 Goolge 當初創立時,就已經負責創造其核心價值的那群人 自己業餘的時候玩玩自己的專案(side project),然後公司覺得超級有用,很有價值的那群人。[譯注:Gmaill 其實就是這樣從 Side Project 長成現在 Goolge 核心產品的。] 自己開新創公司,被 Google 買進來的 (比較少拉)不知道為什麼有辦法成為某種核心科技或是技能的唯一提供者 除此之外,這種待遇大都是憑空想像出來的,用來賣很多很多 Business Insider 文章的這樣(以台灣的例子來說,就是商周,還有今週刊那些 XD)。 價值 190 億美金的不錄取通知 每顆心都會歌唱,唱得不完整,直到另一顆心跟著附和。 - 柏拉圖 多謝大家的熱情支持,本文在 Quora 上面已經累積了 12 萬則瀏覽,Quora 真是太屌了。 我收到很多評論,有一部分跟我說上列的故事很難應用到他們的生活中,另一部分的評論問到跟公司談判股權的技巧,希望要到 50 萬美金收入的方式,其他的評論則說我這篇文章根本沒有回答到他的問題。大部分的評論者都是一類勞工,還在想怎麼作才能炒高自己的市場價值,獲得更高的『收入』。 那我再來說個故事吧,一個發生在上列文章出來一個禮拜之內的故事,希望這次會具體一點,比較好懂。 2009 年 5 月,有個一類勞工應徵 Twitter ,但是他被拒絕了,於是 2009 年 8 月,他又跑去 Facebook 應徵,他也被拒絕了,怎麼辦?他決定自己出來試試看,挑起二類勞工的大樑,從『增進人類溝通』的水源處,挖起那條之前拒絕他一類服務的那兩間公司都非常需要的小溪。 一路走來,他與跟他一起挖小溪的朋友影響了 55 人加入團隊,一起努力,村中的長老也丟了些骨頭給他,一開始只有 25 萬美元,接下來 8 百萬美元,眼看著小溪越來越成功,紅杉創投到後來注入 5000 萬美元的資金。 我寫這篇文章的 3 小時前, CNN 剛剛報導他們二類勞工的作品被 Facebook 以 190 億美金收購(你沒聽錯, 190 億美元)。 Facebook 買了 Whatsapp。而幫 Facebook 挖了五年小溪的 Brian Acton ,正式成為 Facebook 的股東,正是那個當初拒絕他工作申請的 Facebook 。 在他開挖之前(開 Whatsapp 公司之前),他曾經寫下了這兩條推特訊息: 推特總部不要我。沒有關係,反正從我家過去很遠。 Facebook 也不要我。不過那是個很厲害人們社交的好機會。我很期待接下來的人生旅程。 你覺得那 55 個人有需要去跟 Facebook 談判,要 50 萬美金的薪水嗎?還是你覺得當那些人獲利了結,要離 Facebook 出走時, Facebook 會砸下重金,並拿出股票來留人? 二類勞工不會去比較,或是談判薪水,因為他們不是在出賣他們的勞力給村莊(公司),他們賣的是被低估的財富,那些出價的村莊沒有別的選擇,只能拿出相對於這些財富的數字,這些二類勞工端出來的財富,可以讓村莊與自己雙雙受益(你看看 Facebook 往上衝的股價就知道)。 你可以想想,要賣掉你挖通的水源時,有沒有哪個村莊願意坐在談判桌的另一邊。當村莊決定買水的時候,薪水條中多出來的幾個零,都不過是基本條件罷了。 Amin Ariana 現駐矽谷,是個軟體創業家。

2/24/2014

Bitcoins the hard way

Ken Shirriff's blog: Bitcoins the hard way: Using the raw Bitcoin protocol Ken Shirriff's blog: Bitcoin mining the hard way: the algorithms, protocols, and bytes

Electrum Bitcoin Wallet

Electrum Bitcoin Wallet

Instant on: Your client does not download the blockchain, it uses a remote server. Forgiving: Your wallet can be recovered from a secret seed. Safe: Your seed or private keys are not sent to the server. Information received from the server is verified using SPV No downtimes: Several public servers are available, you can switch instantly. Ubiquitous: You can use the same wallet on different computers, it will auto-synchronize. Cold Storage: You can have secure offline wallets and still safely spend from an online computer. Open: You can export your private keys into other Bitcoin clients. Tested and audited: Electrum is open source and was first released in November 2011.

2/17/2014

Oleg Andreev - Bitcoin Non-Technical FAQ

Oleg Andreev - Bitcoin Non-Technical FAQ

How fast are the transactions? Transactions are secured by being included in a block. Blocks are generated approximately every 10 minutes. Including the time to propagate a transaction through the network, today it usually takes about 15 minutes to verify inclusion in a block. For better security, one can wait until more blocks are added after the block with the transaction. How transactions are secured? Transactions are grouped into blocks and each block contains the signature of the previous block, thus making up a chain of blocks. The security of the system is based on computational difficulty to generate blocks parallel to the main chain. The more blocks are created after the block containing your transaction, the harder it is to fork the chain and make the transaction invalid. Therefore, no transaction is 100% confirmed. Instead, there is a confirmation number — a number of blocks built after the transaction. Zero confirmations means that the transaction is not yet included in any block (unconfirmed). One confirmation means that the transaction is included in one block and there are no more blocks after it yet. Today for small transactions one or two confirmations (10-20 minutes) are considered enough. For bigger transactions it is recommended to wait for at least six confirmations (1 hour). One known exception is 120 confirmations required by the protocol for the use of generated bitcoins. This is because miners (those who create blocks) have the most of computing power in the network and must have extra incentive to play fairly and generate blocks in the main chain without attempting to double-spend their rewards. What do miners do exactly? Miners create blocks. To create a block one needs to create a file containing unconfirmed transactions (that are not yet included in any other block), add a timestamp, a reference to the latest block and a transaction sending 50 bitcoins from nowhere to any address. Then, the miner needs to compute a signature for the block (which is basically a very long number). This signature is called hash and the process of computing is called hashing. Computing a single hash takes very little time. But to make a valid block, the value of its hash must be smaller than some target number. The hash function is designed to be hard to reverse. That is, you cannot easily find some file contents that will produce the desired hash. You must alternate the contents of the given file and hash it again and again until you get a certain number. In the case of Bitcoin, there is a field in a file called “nonce” which contains any number. Miners increment that number each time they compute a hash until they find a hash small enough to be accepted by other clients. This may take a lot of computing resource depending on how small is the target hash value. The smaller the value, the smaller the probability of finding a valid hash. There is no guarantee that you need to spend a certain amount of time to find a hash. You may find it quickly or not find it at all. But in average, the small enough value of block hash takes time to create. This constitutes a protection against creation of a parallel chain: to fork the chain you will need to spend more resources than the people who created the original blocks What are the parameters of the network? Here are some parameters of the Bitcoin chain. They may be different for alternative currencies based on the Bitcoin software (like Namecoin). The minimum amount of bitcoins is 0.00000001 BTC. Blocks are created every 10 minutes. Block size is limited to 1 Mb. Difficulty is adjusted every 2016 blocks (approx. every two weeks) Initial reward for a block is 50 BTC. Reward is halved every 210 000 blocks (approx. four years). Points #5 and #6 imply that the total number of bitcoins will not exceed 21 million. Why are blocks created every 10 minutes? The 10 minute interval is designed to give enough time for the new blocks to propagate to other miners and allow them to start computation from a new point as soon as possible. If the interval was too short, miners would frequently create new blocks with the same parent block, which would lead to a waste of electricity, a waste of network bandwidth and delays in transaction confirmations. If it was too long, a transaction would take longer to get confirmed. Why is the block size limited to 1 Mb? The block size is limited to make a smoother propagation through the network, the same reason why the 10 minute interval was chosen. If the blocks were allowed to be 100 Mb in size, they would be transferred slower, potentially leading to many abandoned blocks and a decrease in the overall efficiency. Today a typical size of a block is 50-200 Kb which makes a lot of room for growth. In the future it is possible to increase block size when the networks get faster. Decreasing time interval would not change much because the security of transactions depends on the actual time, not the number of blocks. How can the protocol be changed? The protocol is a list of rules that every client must follow in order to validate transactions and have their transactions validated by others. Hence, if you change the rules for yourself, other clients will simply reject your transactions and you probably will not be able to accept theirs. This makes it hard to change the protocol. If there is a change that a vast majority of clients will find useful, then it is possible to publicly agree that starting with the block number X, new rules will apply. This will give a certain amount of time to everyone to update the software.

Turning speech into actionable data

Introducing Wit Speech API

How does it work? Behind the scene, Wit combines various state-of-the-art Natural Language Processing techniques and several speech recognition engines in order to achieve low latency and high robustness to both surrounding noise and paraphrastic variations (there are millions of ways to say the same thing). Fortunately, you don’t need to care about all this machinery. We focus all our energy into creating the simplest developer experience possible. You can be up and running in a few minutes using our website. Wit will adapt to your domain over time, from ice-cream distribution to space missions. Wit makes no assumptions and remains 100% configurable.

Oleg Andreev - Journalist's guide to describe Bitcoin and not look like an idiot

Oleg Andreev - Journalist's guide to describe Bitcoin and not look like an idiot

When writing about Bitcoin many journalists use certain phrases that are not quite correct and do not explain anything to everyone else. Dear journalist, if you read this short article you will finally understand what are you talking about and outperform 99% of your colleagues. In a short paragraph, Bitcoin can be described like this (you can take my text without asking): Bitcoin is a payment network with its own unit of account and no single controlling entity behind it. Users make transactions between each other directly and verify them independently using cryptographic signatures. To prevent duplicate spendings, many specialized computers spend a lot of computing power to agree on a single history of transactions. Due to historical reasons, this process is called “mining” because new bitcoins are created as a reward for performing this work. Anyone who validates next block of transactions can claim transaction fees and a fixed amount of new bitcoins. Transactions are validated at a constant rate (10 minutes in average) and every four years allowed amount of new bitcoins is halved. This means that the total amount of bitcoins is limited by the protocol (21M total, 11M already created). Transaction fees are not fixed and determined by the market. Bitcoin mining is secondary to the whole idea and the term “mining” is unfortunate (early Bitcoins were generated before anyone was doing any transactions yet, so the whole process was called “mining” instead of “paying for transaction verification”). One common pitfall is to start talking about mining without describing its real purpose. It is not to generate new units (who would need them?), it is to validate transactions. Bitcoins are valuable only because of robust payment network which is maintained by the miners. And miners get paid for their work in form of transaction fees and newly generated bitcoins. Second common pitfall is to say that miners “solve complex algorithms”. They do not solve anything. They do two things: transaction verification (checking digital signatures and throwing away invalid and duplicate transactions), and a long and boring computation which means a repetitive computation of a well-known algorithm with slightly different input until a “good enough” number appears as a result that will be accepted by other users as a proof of performed work. This has nothing to do with “math problems” or any other intellectual task. It is merely a way to guarantee that the resulting number really took some time to produce. This allows people to build a single chain of transactions and see that it would be economically impossible to produce a parallel chain (without trusting each other personally). The last pitfall in describing mining is saying something like “tasks are getting more complex over time”. Tasks are not getting any more complex. The are all the same and not complex at all (any amateur programmer can understand them). But the difficulty of a boring “proof of work” is adjusted by everyone every 2 weeks to maintain the same rate of transaction validation (10 minutes). If people throw more resources at mining, difficulty will rise. If mining gets less profitable, some computers will be shut down and the difficulty will get lower. If a miner produces a “proof” which is not difficult enough, it will not be accepted by other users. The last point is related to amount of units available. In fact, “1 Bitcoin” is a name for 100 million smallest units, thus the total amount of units ever possible is around 2100 trillion. Alternative currencies based on Bitcoin source code sometimes advertise more units (e.g. Litecoin has 4 times more), but the difference is only in names and divisibility of the total money supply, not in actual value (if you cut a pie in 10 pieces instead of 5, the total value does not really change). So it would be fair to mention that 1 bitcoin is much more divisible than dollars and euros. Hopefully, this knowledge will help you to avoid common mistakes when writing your article and make some friends in enthusiastic Bitcoin community.

Tech Notes: React, JSX, and CoffeeScript

Tech Notes: React, JSX, and CoffeeScript

CoffeeScript instead of JSX If you're using CoffeeScript, your source code isn't JavaScript to begin with. But turns out that CoffeeScript's flexible syntax makes it relatively painless to use the underlying API directly. Start with shortening the DOM alias and writing more or less the same code as above. Also note that you don't need to explicitly return as the last statement in a function is implictly returned, and that the function literal syntax for argumentless function is just a bare ->:
R = React.DOM
# ...

render: ->
  R.p(null, R.a({href:'foo'}, 'bar'))
But you can do better. First, CoffeeScript knows to insert the curlies on an object literal because of the embedded colon.
  R.p(null, R.a(href:'foo', 'bar'))
And then you can remove the parens by splitting across lines. When providing args to a function, a comma+newline+indent continues the argument list. Much like Python, the visual layout follows the semantic nesting.
  R.p null,
    R.a href:'foo', 'bar'
In fact, beyond the first argument, the trailing commas are optional when you have newlines. Here's the same thing again with two links inside the <p>:
  R.p null,
    R.a href:'foo', 'bar'  # note omitted comma here
    R.a href:'foo2', rel:'nofollow', 'second link'
CoffeeScript also makes every statement into an expression, which is a familiar feeling coming from functional programming. It means you can use statement-like keywords like if and for on the right hand side of an equals sign, or even within a block of code like the above. Here's a translation of the (7-line) <ol> example from above.
R.ol null,
  for result in @results
    R.li key:result.id, result.text
There is one final feature of CoffeScript that I find myself using, which is an alternative syntax for object literals. For example, suppose in the above example the "key" attribute needs to be computed from some more complicated expression:
R.ol null,
  for result, index in @results
    resultKey = doSomeLookup(result, index)
    R.li key:resultKey, result.text
The simplification is that, within a curly-braced object literal, entries without a colon use the variable name as the key. The above could be equivalently written:
R.ol null,
  for result, index in @results
    key = doSomeLookup(result, index)
    R.li {key}, result.text
This is particularly useful when the attributes you want to set have meaningful names -- key is pretty vague, but if you construct an href and a className variable it's pretty clear where they are going to be used. These can be mixed with normal key-value pairs, too, like:
href = ...
className = ...
R.li {href, className, rel:'nofollow'}, ...
Putting it all together, here's a larger example, part of an implementation of an "inline edit" widget. To the user, this widget is some text with a "change" button to its right, where clicking on "change" swaps the line of text out for an edit field positioned in the same place, allowing the user to make a change to the value directly. (Like how it works in a spreadsheet.) The first branch of the if is the widget's initial state; the @edit function flips on the @state.editing flag.
render: ->
  if not @state.editing
    R.div null,
      @props.text
      ' '  # space between text and button
      R.span className:'link-button mini-button', onClick:@edit, 'change'
  else
    R.div style:{position:'relative'},
      R.input
        style:{position:'absolute', top:-16, left:-7}
        type:'text', ref:'text', defaultValue:@props.text
        onKeyUp:@onKey, onBlur:@finishEdit
To get a feel for these rules, you can just experiment and look at the generated JavaScript. Or you can go to coffeescript.org and click the "Try CoffeeScript" tab, where you can enter nonsense expressions there just to experiment with the syntax.

2/15/2014

Netflix颠覆HR:我们只雇「成年人」 | 极客公园

Netflix颠覆HR:我们只雇「成年人」 | 极客公园

Netflix 究竟是如何吸引和管理人才的? 只招最优秀的,把不够优秀的请走 回溯到 2001 年,互联网泡沫破灭打乱了公司的 IPO 计划,我们还裁掉了 1/3 的员工。但圣诞节时转机来了,DVD 播放机成为热门礼品,公司的 DVD 邮寄订阅业务也意外暴涨。 有一天我和工程师约翰谈话,说希望尽快替他找到帮手。裁员之前,约翰手下有三名工程师。可他的回答却出人意料:“我宁可自己做,也不要二流手下。”原来,过去约翰要花大量时间去管理员工并收拾他们的烂摊子。 这句话日后反复在我耳畔回响:你能为员工提供的最佳福利,不是请客吃饭和团队活动,而是招募优秀的员工,让他们和最优秀的人一起工作! 如果你希望团队里都是最优秀的员工,那么你必须要请能力不足的人离开。 2002 年形势好转后,Netflix 成功 IPO,当时公司急需专业精算师和经验丰富的财务专员,而会计劳拉已经不胜任这份工作。劳拉曾为公司做出了很大的贡献,有人提议给她特设一个职位,但我直接告诉她,我们愿意提供一笔可观的离职补偿金。 当时,我甚至做好了迎接泪水的准备,没想到劳拉很轻松地说:她对离开表示遗憾,但丰厚的离职补偿金可以让她考虑重返校园或参加培训,寻找新的职业发展路径。 只雇用、奖励和容忍「成年人」 从业三十年,我发现很多大公司的 HR 往往花太多时间用于拟定人力资源管理的条例,以应付一小撮与公司利益不一致的员工,结果往往得不偿失。我们根本不会让这种人进入公司,我们筛选出的人是真正的“成年人”。 自 Netflix 创始起,我们就制定了带薪假期的规定,并且一直用内部的办公系统记录出勤情况。公司上市后,审计师提出异议,认为应引入正式的办公考勤系统,对员工的休假时间做出清晰的解释。但里德和我都认为,只要不违反相关法律,何必在意繁文缛节? 现在,Netflix 的员工可以自行决定休假计划,HR 只是给出指导性意见。比如,财务部门的员工不要在季初和季末最繁忙时休假;如果要连续休假 30 天,要先与 HR 面谈。 在差旅和报销制度上,我们告诉员工,公司想节省开支,希望员工把公司的钱当成自己的钱,这大大降低了公司成本。很多公司都通过代理机构订票,但如果相信员工会遵守「公司利益最优先原则」,让他们自行在网上订票,就可以省下一大笔中介费。 和很多经理一样,我也会时不时和员工吃工作餐,如果是为了招聘或销售目的,餐费就可以报销;如果是和同事不涉及工作的用餐,餐费则不能报销。总之,只要遵循「成年人」做法的原则,绝大多数员工都会遵守制度。 对员工直言他们的表现 在很久以前,我们就取消了正式的评估制度。某些职能部门员工的业绩好坏一目了然,而且,偶尔一次的考核也没有连贯性。 比如,工程师玛利亚被招进公司是负责查找漏洞的。但由于技术的更新,我们很快发现这项工作可以全自动化。经理要求玛利亚参加评估,以防炒掉她时可能出现的劳务纠纷。但是我说:“大家都知道这出戏会怎么演下去。你先定目标,她根本无法达标,你每周都要跟她进行一次难堪的谈话,最后她还是会被炒掉。这对 Netflix 又有什么好处?” 我建议他,不妨直接告诉玛利亚:你的能力已经不符合公司需要了。以我的经验,只要告知实情,人们总是能够应对变化。 取消了正式的业绩评估后,我们设立了「非正式的」360 度考评制度。我们提出尽可能简洁的问题:你觉得你的同事「应该做什么」、「不要做什么」。简单、诚恳、定期地以探讨的方式进行评估,效果远远好过正式考评制度。 而对于管理者,我们的要求是,要确保员工理解公司发展的核心动力和盈利模式。即使你招到了充满干劲的员工,你仍需要告诉他们公司是怎么赚钱的,让他们理解怎么做能帮助公司成功。 股票期权不应是“金手铐” 在伊拉克战争期间,时任美国国防部部长拉姆斯菲尔德说:“你是要带着已有的军队参战,而不是带领一支你所期待的队伍。”不过,我却告诉 Netflix 的经理们要反其道而行之:伟大的团队完成伟大的工作,打造一支伟大的团队就是你的首要职责。 Netflix 从 DVD 邮寄租赁业务向流媒体服务转型时,就曾面临这样的挑战。我们急需那些曾在亚马逊和谷歌等大公司有云计算研发经验的人才,但显然,这些人才不容易被挖。 此时,我们的薪酬体制起了很大的作用。Netflix 的薪酬原则也遵循这样的理念:坦诚待人、把员工当成年人对待。比如,公司提供的年薪中没有「绩效奖金」,因为我们相信市场主导的薪酬标准,只要招对了人,没有年终奖既不会让他们变懒,也不会让他们变笨。事实上,我们通常会给出高出市场平均水平的薪酬,在年终也会发放超出员工预期的福利。 另外,一般公司都会在提供一份有竞争力年薪的同时,搭配固定的股票期权。而我们让员工自己选择股票期权在整体薪酬中的占比。每个月公司都以稍低于股价的价格发放一定的期权,而且允许即时兑现。 我们觉得,股票期权不应该是为了降低离职率的「金手铐」,如果你获得了更好的发展机会,就该在离开时带走你应得的全部。

2/10/2014

#7300 (Keypress not getting arrow keys in chrome) – jQuery Core - Bug Tracker

Events - keydown, keypress, keyup

keypress Fires when an actual character is being inserted in, for instance, a text input. It repeats while the user keeps the key depressed.
JavaScript Madness: Keyboard Events
There are many other special keys on a typical keyboard that do not normally send characters. These include the four arrow keys, navigation keys like Home and Page Up, special function keys like Insert and Delete, and the function keys F1 through F12. Internet Explorer and WebKit 525 seem to classify all of these with the modifier keys, since they generate no text, so in those browsers there is no keypress event for them, only keyup and keydown. Many other browsers, like Gecko, do generate keypress events for these keys, however.
#7300 (Keypress not getting arrow keys in chrome) – jQuery Core - Bug Tracker
I've reviewed the bulk of tickets regarding keypress on both the Chrome, Chromium and Webkit bug trackers and it would appear that there are no intentions on supporting correct keypress behavior from any of these camps now or in the future. The reason for this is that a) keypress and its behavior is not mentioned specifically in any specs and b) Although FireFox and Opera support this feature, Webkit (used by Chrome and Safari) decided to copy the IE behavior in this case which reserves arrow keypresses for internal browser behavior only. There is no way that jQuery can circumvent this behavior and it is instead recommended that you use keydown instead as this is supported.
keyboard events -
Detecting arrow key presses in JavaScript - Stack Overflow Use keydown, not keypress for non-printable keys such as arrow keys:
function checkKey(e) {
    e = e || window.event;
    alert(e.keyCode);
}

document.onkeydown = checkKey;
arrow keys are only triggered by onkeydown, not onkeypress keycodes are: left = 37 up = 38 right = 39 down = 40