1. Sentry

    或许你不太会喜欢异常,特别是那些发生后继而沉默在应用日志里那些,你不知道从何开始,因为它们看起来并非那么平易近人,但是用户吵着他的数据有问题,你只得硬着头皮在多个服务器的日志里,翻箱倒柜,试着从堆栈里发现些什么,但是毫无线索,因为你发现这根本是一桩无头命案,没有足够的上下文,不知道哪个才是这个用户的某个操作引起的异常,请求链接更无从谈起,好吧,再去nginx日志里看看吧……
    但幸运的是,你不是孤独的,Disqus也面临着同样的问题,因此而开发了Sentry,它是一款精致的Django应用,目的在于帮助开发人员从散落在多个不同服务器上毫无头绪的日志文件里发掘活跃的异常,继而找到潜在的臭虫,当然这个是概述,像其他监控工具一样,sentry也是分为客户端和服务端,客户端分布在你的每个应用服务器上,在异常发生时django会通知它,继而客户端再把详细的异常信息以及相关的用户、请求数据(包括cookie和环境信息)发送到服务端,这样一来就像sentry网站上鼓吹的,它天生就是实时的了。服务端是一个http server,是接收客户端发送异常信息和相关数据,按照异常名称进行归类存储到单独的数据库中,同时提供漂亮的web界面,方便开发检索异常记录,上图:

    扇贝部署sentry的当周,开发生活就全部围绕在修复bug中——自己写的代码所产生的异常已经发生xxx次了,就摆在sentry web界面,紧急优先级排在前3名,你还不去修复?现在我们每天都会习惯性的前往sentry看看有没有发生新的异常,发布时更是紧盯着sentry这个晴雨表。这样不但可以让开发时刻关注自己的代码质量,也可以了解到一个异常就有可能是一个用户的流失,尽快地修复一个bug就可以最小化损失。  

    如何部署?

    服务端:  

    1. pip install sentry
    2. sentry start

    客户端:

    1. pip install raven
    2. 在django的settings.py文件里的INSTALL_APPS加上一行:


    INSTALLED_APPS = [  
           …  
           # We recommend adding the client to capture errors   # seen on this server as well                      
          ‘raven.contrib.django’,
    ]


    3. 将服务端机器上的sentry配置文件中的SENTRY_KEY一行复制到settings.py文件里  
     cat ~/.sentry/sentry.conf.py ,复制该行: SENTRY_KEY = xxxxx
    4. 指定sentry服务端:     SENTRY_SERVERS = [‘http://your.sentry.server/sentry/store/’] 

  2. Release it中稳定模式的一些理解

         这些模式就像设计模式一样,在我们的系统中不是看你使用了多少模式,或者说是否严格的遵守了这些模式,模式能解决的是大部分通用的情景,但是在实际应用时也要看上下文。

         Why bother this? 我们系统不是孤立存在,他依赖着很多服务(一个完全不依赖任何资源、服务的系统,几乎是不存在的,当然你可以举出反例,但我觉得这个系统的存在也没有太多意义),很多时候他和这些服务工作的很好但是如果你对他们没有任何防范的话,某天他会让你尝到苦头。

         在Release it! 一书中举出一些模式以防止某些经常发生的问题再次发生(本书作者提到自己所解决过的线上故障都是新问题,是因为他从不让同一个错误重复发生),的确是经验之谈,这里说下个人的理解。

         使用超时

         网络通常是不可靠的,我们的应用不能永远等待一个不知道何时才能响应的服务,我们对每个依赖和服务设置超时时间,如果在这个超时时间之内服务还不响应的话,就放弃,让应用继续服务,一方面我们已经尽了最大努力,一方面防止因为无尽的等待以至于因为不断的有新的请求发起导致连接资源耗尽,应用挂住。

         断路器

         大家都应该知道断路器是怎么工作的,当某个电器因为短路或者其他某些原因使得线路过热而断掉电源,然后可以重新开启电源,使得其他电器正常工作,而你接下来的事情就是检查那个有问题的电器。 同样,我们的系统也是如此,当某一个子系统出现问题或者在几次尝试确定失败之后,应该停止使用这个子系统,使得不会影响整个系统。

         防水壁

         就像轮船的防水舱一样,我们系统应当在漏水时仍然不会沉船。 防水壁这个我个人感觉和断路器有点类似,但是作者似乎对于防水壁更强调的是物理系统需要分区,在某个物理系统出现问题时,要使得其他物理系统不受影响,以保证整个系统继续工作。而且分区的主要手段就是冗余物理设备。

         稳定状态

         主要是说尽量不要没事干在线上机器上做些事情,然后举了些常见场景,例如数据清理以及日志文件、内存cache的问题。

         快速失败

         前面说的使用超时是面向服务消费方,即调用者的建议,而这个主要是面向服务提供方的,如果服务方的系统能够在可能发现失败前,立即回复失败的响应。这样调用方就不会一直等待服务方了(但是在为了保护自己,在不确定服务方是否采用了快速失败的模式,你最好还是设置超时)。但是如何预先知道将会失败呢,作者举了个简单的例子:当一个请求到来时,发现连接池没有可用的连接,应当立即拒绝这个连接请求。

         握手

         我们都知道TCP/IP协议的三次握手,主要是用来协调两台设备之间的通信,但是http协议以及RMI,CORBA等等很多通信协议本身都没有做好握手的工作,握手的好处在于一方忙时,另一方能知道他忙,会在后面不再做请求,或者间隔一个设置的时间再作尝试。 幸好看到作者强调了下底层协议最好需要握手,即通信很昂贵的时候,否则个人觉得握手有点鸡肋。

        Test Harness(这个不知道怎么翻译合适)

        集成测试只是证明在系统规约里明确好的正常情况是否ok,但是无法跳出规约进行测试,test harness是一种接近于边界或者说极端情况下对整个系统进行极限测试的方法,发现系统的漏洞和问题,其目的就像是一名恶意的黑客,极尽所能使得系统崩溃或者发生异常行为。

        解耦中间件

        从统一进程里编程语言里的方法调用到进程间通信到远程方法调用再到消息队列最终到不同时间不同地点不同进程间的通信,这是一个解耦的过程,越是解耦的设计,越能减少级联失败的发生。

        我说一下自己曾经就碰到过的问题,准确的说是我制造了这个问题: 在一个项目里我负责编写一个java库以供java前端开发人员访问后台的某个提供http服务的引擎,我使用了HttpClient来请求这个http服务,在这个整个开发过程中,一切都很顺利,然后就交付上线了。不幸的事情发生了,当天晚上前端就匆忙打电话通知我,坏事发生了:日志里显示有大量的读超时异常抛出,线上机器全部被挂住,初始大家以为后台服务有问题导致超时,但是后来dump了下java 堆栈信息,发现大量线程被Block住,查看了代码发现我写的某处有线程安全问题,使得连接并没有正确放回连接池,导致在连接池全部耗尽,新的请求获取不到连接,但是这并不足以使得机器全部挂住,后来一个有经验的开发指出,httpclient连接池默认的获取连接的超时时间是永久等待,这使得不断来到的新请求永久的等待可用的连接,吃不会放弃,等待队列中堆积了成千上万的请求,最终机器挂住。

  3. Nerd指导手册

    闲着没事翻译这篇文章(每天翻译一些):The Nerd Handbook - http://www.randsinrepose.com/archives/2007/11/11/the_nerd_handbook.html

    keyboard

         Nerd需要项目因为他们不断创造新事物。亘古不变。你注意到他们在晚餐闲聊时间歇性的停顿了吗?那是你所面对的nerd的脑袋正忙于他的项目。    

         但是这个项目不大可能是nerd的日常工作,因为在他的眼里,工作就是“待在办公室,完成某件事”。我们接下来会花些篇幅来探索下这种表面上注意力不集中的结果,但是现在,这个项目是你的这位nerd正在开发的一件头等大事,虽然我并不知道这是怎样的事,但是你应当知道。

        从某个角度来说,你本身就是你的nerd伙伴的“项目”。你被他“瞩目关注”着,因为你就是你的nerd生活中崭新的开发领域。你成为你的nerd朋友的当前“项目”,这也许算是你的福气——恭喜你。但也不要太得意,因为他会更换“项目”,并且这样的事一旦发生,你将摸不着头脑,不知道以往他在你身上的注意都去了哪。幸运的是,这篇手册可能对你有所帮助。

        关于性别:方便起见,在本文中,我的nerd原型是一名男性。实际生活中将有许多女性nerd,但本文中所有的这些观察两者都适用。

        理解你的nerd和计算机的关系。虽然有些陈词滥调,但是一个nerd的确是为他的计算机所铸就,而你需要理解为什么。
        首先,在这颗星球上绝大多数人要么不知道一台计算机如何工作,要么就是看了之后认为计算机“有魔法”。但是nerd们却清楚计算机是如何运作的,他们深谙计算机的工作方式。当你问nerd:“我点了这个,但是过了许久才出来一个东西,你知道哪里有问题?”,他们知道问题所在。在nerd的大脑里有着计算机硬件和软件的模型。当世界上所有其他人看起来是魔法使然的时候,他知道这个魔法是一长串二进制的0,1数字在以惊人的速度流窜过你的屏幕,他甚至知道如何让这些比特流动的更快。

       nerd将他的工作,也许是他的生活,完完全全建立在计算机上,我们将会看到,这种亲密的关系已经改变了他的世界观。他将这个世界看成是一个完全可知的系统,只要给他足够的时间和努力。这就是你的nerd所接受的易破灭的幻想,但却是一个令人欣慰的想法,足以让你的nerd愉悦的渡过一整天。但是当这个幻想破灭时,你将会发现…

       你的nerd有控制欲的问题。你的nerd生活在一个等宽字体的世界里。当其他人在在一堆眼花缭乱的字体中寻觅合适的字体时,你的nerd已经慎重的选好了一个等宽字体,这是他用来在终端命令行上玩转这个世界的字体,而与此同时,其他人正笨拙的操纵着鼠标。

      选择这种字体的原因当然是它的实用性,等宽字体有着已知的宽度,在同一行中的十个字母和其他另外一行的十个字母的宽度是相同的,如此一来,就能把这个世界划分到X/Y坐标分别具有某种含义的一个令人愉悦的网格结构中去。

       这些控制欲的问题意味着你的nerd对他周围环境的激烈的变化很敏感,例如旅行,例如工作变化。这些系统重新定义的事件使得你的nerd认识到世界并不总是或者说完全是一个可知的地方,而且直到他重现这个幻想,他将一直感到沮丧,行动没有规律。我在“系统重新定义”事件期间制作了一个难以置信的“短保险丝”,我有可能在某个愚蠢的鸡毛蒜皮的小事中将它烧毁,这是因为…

      你的nerd为自己建造了一个“洞穴”。 我曾经在其他地方写过关于“洞穴”的文章,但是这里仍然会提到其中一些基本的问题。“洞穴”是用来能够让你的nerd做他喜爱的事情——折腾他的项目。如果你想要理解你的nerd,那就目不转睛的朝着这个洞穴看吧。他是如何布置这个“洞穴”?他何时打算进去?他在里面待多久?

    Each object in the Cave has a particular place and purpose. Even the clutter is well designed. Don’t believe me? Grab that seemingly discarded Mac Mini which has been sitting on the floor for two months and hide it. You’ll have 10 minutes before he’ll come stomping out of the Cave — “Where’s the Mac?”

    The Cave is also frustrating you because your impression is that it’s your nerd’s way of checking out, and you are, unfortunately, completely correct. A correctly designed Cave removes your nerd from the physical world and plants him firmly in a virtual one complete with all the toys he needs. Because…

    Your nerd loves toys and puzzles. The joy your nerd finds in his project is one of problem solving and discovery. As each part of the project is completed, your nerd receives an adrenaline rush that we’re going to call The High. Every profession has this — the moment when you’ve moved significantly closer to done. In many jobs, it’s easy to discern when progress is being made: “Look, now we have a door”. But in nerds’ bit-based work, progress is measured mentally and invisibly in code, algorithms, efficiency, and small mental victories that don’t exist in a world of atoms.

    There are other ways your nerd can create The High and he does it all the time. It’s another juicy cliché to say that nerds love video games, but that’s not what they love. A video game is just one more system where your nerd’s job is to figure out the rules that define it, which will enable him to beat it. Yeah, we love to stare at games with a bazillion polygons, but we get the same high out of playing Bejeweled, getting our Night Elf to Level 70, or endlessly tinkering with a Rubik’s Cube. This fits nicely with the fact that…

    Nerds are fucking funny. Your nerd spent a lot of his younger life being an outcast because of his strange affinity with the computer. This created a basic bitterness in his psyche that is the foundation for his humor. Now, combine this basic distrust of everything with your nerd’s other natural talents and you’ll realize that he sees humor is another game.

    Humor is an intellectual puzzle, “How can this particular set of esoteric trivia be constructed to maximize hilarity as quickly as possible?” Your nerd listens hard to recognize humor potential and when he hears it, he furiously scours his mind to find relevant content from his experience so he can get the funny out as quickly as possible.

    This quick wit is only augmented by the fact that…

    Your nerd has an amazing appetite for information. Many years ago, I dubbed this behavior NADD, and you should read the article to learn more and to understand what mental muscles your nerd has developed.

    How does a nerd watch TV? Probably one of two ways. First, there’s watching TV with you where the two of you sit and watch one show. Then there’s how he watches by himself when he watches three shows at once. It looks insane. You walk into the room and you’re watching your nerd jump between channels every five minutes.

    “How can you keep track of anything?”

    He keeps track of everything. See, he’s already seen all three of these movies… multiple times. He knows the compelling parts of the arcs and is mentally editing his own versions while watching all three. The basic mental move here is the context switch, and your nerd is the king of the context switch.

    The ability to instantly context switch also comes from a life on the computer. Your nerd’s mental information model for the world is one contained within well-bounded tidy windows where the most important tool is one that allows your nerd to move swiftly from one window to the next. It’s irrelevant that there may be no relationship between these windows. Your nerd is used to making huge contextual leaps where he’s talking to a friend in one window, worrying about his 401k in another, and reading about World War II in yet another.

    You might suspect that given a world where context is constantly shifting, your nerd can’t focus, and you’d be partially correct. All that multi-tasking isn’t efficient. Your nerd knows very little about a lot. For many topics, his knowledge is an inch deep and four miles wide. He’s comfortable with this fact because he knows that deep knowledge about any topic is a clever keystroke away. See…

    Your nerd has built an annoyingly efficient relevancy engine in his head. It’s the end of the day and you and your nerd are hanging out on the couch. The TV is off. There isn’t a computer anywhere nearby and you’re giving your nerd the daily debrief. “Spent an hour at the post office trying to ship that package to your mom, and then I went down to that bistro — you know — the one next the flower shop, and it’s closed. Can you believe that?”

    And your nerd says, “Cool”.

    Cool? What’s cool? The business closing? The package? How is any of it cool? None of it’s cool. Actually, all of it might be cool, but your nerd doesn’t believe any of what you’re saying is relevant. This is what he heard, “Spent an hour at the post office blah blah blah…”

    You can be rightfully pissed off by this behavior — it’s simply rude — but seriously, I’m trying to help here. Your nerd’s insatiable quest for information and The High has tweaked his brain in an interesting way. For any given piece of incoming information, your nerd is making a lightning fast assessment: relevant or not relevant? Relevance means that the incoming information fits into the system of things your nerd currently cares about. Expect active involvement from your nerd when you trip the relevance flag. If you trip the irrelevance flag, look for verbal punctuation announcing his judgment of irrelevance. It’s the word your nerd says when he’s not listening and it’s always the same. My word is “Cool”, and when you hear “Cool”, I’m not listening.

    Information that your nerd is exposed to when the irrelevance flag is waving is forgotten almost immediately. I mean it. Next time you hear “Cool”, I want you to ask, “What’d I just say?” That awkward grin on your nerd’s face is the first step in getting him to acknowledge that he’s the problem in this particular conversation. This behavior is one of the reasons that…

    Your nerd might come off as not liking people. Small talk. Those first awkward five minutes when two people are forced to interact. Small talk is the bane of the nerd’s existence because small talk is a combination of aspects of the world that your nerd hates. When your nerd is staring at a stranger, all he’s thinking is, “I have no system for understanding this messy person in front of me”. This is where the shy comes from. This is why nerds hate presenting to crowds.

    The skills to interact with other people are there. They just lack a well-defined system.

    Advanced Nerd Tweakage

    If you’re still reading, then I’m thinking that your nerd is worth keeping. Even though he’s apt to vanish for hours, has a strange sense of humor, doesn’t like you touching his stuff, and often doesn’t listen when you’re talking directly at him, he’s a keeper. Go figure.

    My advice:

    Map the things he’s bad at to the things he loves. You love to travel, but your nerd would prefer to hide in his cave for hours on end chasing The High. You need to convince him of two things. First, you need to convince him that you’re going to do your best to recreate his cave in his new surrounding. You’re going to create a quiet, dark place here he can orient himself and figure out which way the water flushes down the toilet. Traveling internationally? Carve out three days somewhere quiet at the beginning of the trip. Traveling across the US? How about letting him chill on the bed for a half-day before you drag him out to see the Golden Gate Bridge?

    Second, and more importantly, you need to remind him about his insatiable appetite for information. You need to appeal to his deep love of discovering new content and help him understand that there may be no greater content fire hose than waking up in a hotel overlooking the Grand Canal in Venice where you don’t speak a word of Italian.

    Make it a project. You might’ve noticed your nerd’s strange relation to food. Does he eat fast? Like really fast? You should know what’s going on here. Food is thrown into the irrelevant bucket because it’s getting in the way of the content. Exercise, too. Thing is, you want your nerd to eat healthily so that he’s here in another thirty years, so how do you change this behavior? You make diet and exercise the project.

    For me, exercise became the project ten years ago after a horrible break-up. When the project was no longer the Ex, I dove into exercise every single day of the week. There were charts tracking my workouts, there were graphs tracking my weight, and there was the exercise. Every single day for two years until the day I passed out in a McDonald’s post-workout after not eating for a day. Ok, so time for a new project. Yeah, nerds also have moderation issues. That’s another essay.

    Significant nerd behavioral change is only going to happen if your nerd engages in the project heart and soul, otherwise it’s just another thought for the irrelevant bucket.

    People are the most interesting content out there. If you’ve got a seriously shy nerd on your hands, try this: ask him how many folks are in his buddy list? How many friends does he have in Facebook? How many folks are following him on Twitter? LiveJournal? My guess is that, collectively, your nerd interacts with ten times more people than you think he does. He can do this because the interaction is via a system he understands — the computer.

    Your nerd knows that people are interesting. Just because he can’t look your best friend straight in the eye doesn’t mean he doesn’t want to know what makes her tick, but you need to be the social buffer — the translation layer. You need to find one common thread of interest between your nerd and your friend and then he’ll engage because he will have found relevance.

    The Next High

    As you discovered when you were the project, your nerd’s focus can be deliciously overwhelming, but it will stop. Once a nerd believe he fully knows how a system works, the challenge to understand ceases to exist and he moves on in search of The Next High.

    While I don’t know who you are or why in the world you chose a nerd for your companion, I do know that you are not a knowable system. I know that you are messy, just like your nerd. Being your own quirky self will be more than enough to present new and interesting challenges to your nerd.

    Besides, it’s just as much a nerd’s job to figure you out and maybe someone somewhere is writing an article about your particular quirks. Good news, he’s probably reading it right now.

  4. The best way to complain is to make things.

    — James Murphy

  5. 人咬狗

         我个人是比较喜欢抱怨的,对许多事情不满,有悖于James Murphy说的The best way to complain is to make things.但是我毅然决然stop from making things,而且最近又有人建议我“顺其自然”,那我就随性牢骚一下。

        看公司每天的纷纷扰扰的邮件总是让人有种世界和平、奥特曼可以退休的感觉,这很好,但我这个人天生有着阴暗心理,唯恐天下不乱,太平和使我不大习惯,但是某天有封邮件使我愕然,这是一封对于公司业务复杂使得代码存在着bug的提议,当然,具体详情我就不透漏了,这里我也罗嗦一下关于业务需求的问题。

        许多业务需求为了达到某种让用户看起来不空洞、有内涵的内容和特性,而在前台甚至后台做了许多”创口贴”,然后坐等着由于这个需求的上线带来的各种所谓的效果,用各种拼音或者英文混杂的缩写名词术语以及正面反馈的数据来表达这个效果。我不太懂这行水有多深,但是我根据自己的常识以及经验来看,在某个页面上加个颜色花哨的链接或者按钮,而且又放在那么明显的位置,只要是一个四肢健全,知道点击链接不会死人的用户,基本都会好奇的去点一下的,所以哪怕那个链接指向的是一个500 Internal Server Error页面,都会有人点击的。但是你可以想象到在效果数据出来,发出庆功邮件那个弹冠相庆的场面,几近让人感动至落泪。

        当然其实你搞这么多花样,作为开发其实也管不着,可奇怪的是,当需求上线有问题时会找到开发工程师为啥需求没弄清,当讨论需求时,你提出这个需求太复杂而且技术上不好实现,他们说你照着作就行。其实也无所谓,毕竟直接出错的人是写代码的人,但是呢,如果说你搞这个花样,并没有解决不了用户遇到的问题,而是异想天开认为可能会解决用户的问题的话,就是另一种情况了,当然绝大部分需求都是异想天开,也就是——猜,猜用户喜欢什么,猜这个功能会有用,当然这个也无可厚非,其实也难为这些提需求的人了,他们自己毕竟不是使用阿里巴巴服务的真实用户,怎么会知道真实用户的痛处。我们的 用户也不是作家,他们没法把他们的真实需求表达出来,他们只能说“我找不到我想要的东西”,而这个问题才是最本质的问题,你界面再好看,交互再好,都是浮云,对于用户来说不是很重要,对于公司来说,你要让用户忍受你的界面丑陋但是不得不使用你的服务,当然界面好看最好不过,谁愿意忍受让自己不舒服的的东西呢,但是这些都不是本质问题,本质是内容不好,用户找不到想要的内容,如果这个问题解决不了,我估计“裂缝“会越来越大。所以,不必每天想着怎么在页面上搞点能够让用户点击的东西,也不用天天调整某某数据显示的个数。集中力量把内容质量提升以及内容过滤精确度提高,这才会用户care的。
        再说技术,像上次轮子一文中提到的那样,技术这块因为业务繁杂的缘故,已经沦为一种每个人都能上的玩物,这不算可悲的,可悲的是它从没有怨言,真是哀其不幸,怒其不争。而每个开发似乎都有种倾向,往项目经理的方向发展(这几乎是必由之路了),都想着能受到赏识,搞个一官半职的,这种开发者典型的特征是喜欢开会,以和每个人搞好关系为工作核心,以和为贵,妥协,从来不对别人说“不“,对技术不思进取,当然这也不能说是坏事,老实说甚至是有追求有理想的有为青年的代表。可是这带来一个极大的问题,这种开发不会拒绝提出有时是荒诞需求的人,因为他需要迎合他,以取得良好的关系,否则当你每次或直接或委婉的拒绝这个需求,指出其不合理时,无论是否你的理由足够充分,关系裂缝就会出现,而这是不被允许的。所以妥协或者麻木成为应用系统的代码复杂,剪不断,理更乱的罪魁祸首。bug丛生,开发周期变长,新员工学习成本大,等等各种问题。然而,是什么导致了这样的问题,我觉得还是文化,没有技术的氛围,以PD为核心的开发模式,当然这也和贵国的世界观有关系:以和为贵。

  6. 轮子

    2179138271_21b30fcbb0.jpg

    在公司有个奇怪的现象,凡事都自己搞一套,就是造轮子:开发难用又落伍的web框架,制定私有的xml格式传输数据(tag名一眼就能让人看出是个c程序 员设计的及其精简的变量名),自己编制http server(老实说编写者自己都不知道http server到底是个啥概念,甚至都可能没看过http协议,返回xml数据,content-type都没有),编写自己http client类库,etc…如此这般,诸如此类,如有雷同,不是巧合。 当然这其中有些是可以理解的,“历史问题”嘛,但是大家仍然继续使用这些不但降低开发效率,难用,bug丛生的“产品”,原因是什么?有人给出答案,为了 统一,为了节省维护成本,为了安逸,为了不必要的风险,但是亲爱的,你有没有想过,作为一名开发人员,开发效率如此低下,是多么痛苦,你说搞计算机的人, 都懒得要命,没有好的工具,怎么干活。管理者为了增加开发产出,只有像数据库的水平扩展一样,不断的通过招聘新员工来解决问题。这就是问题,我认为机器/ 技术能解决的问题,一定不要人来干。资本家就是这么认为的,如果机器比人便宜,那么他一定会用机器来取代人。我们虽然不是资本家,也不是慈善家,为了解决 就业问题,大肆的招聘人员,但是道理是一样的,你认为统一大家使用的技术/工具,是为了减少维护、管理成本,但是这样的结果无疑增加了开发人员的开发成 本,当今什么最贵?人才最贵。你让这么多人才干些本来机器可以胜任的事情,罪过阿,大家本来可以用更好的工具和技术,轻松的解决一些重复、复杂的事情,然 后做些机器目前干不了的事情更加体现开发人员价值的事,这样不但自己有成长,建立信心,给公司也带来很大的价值。 而且统一这个东西,真讨厌。你说如果让每个人天天穿一样的衣服,说同样的话,一样的观点,公司卖同样的东西,都信仰同一个裆,会是个什么样子?你可以制定 一个基本的规则(面向接口编程),但是不要统一成一样东西(面向实现编程)。就像现在大家在讨论为什么 Google 做不出 Instagram,google的Big table是很好(这点比我的公司好,东西做的不好还要求大家都用),但是不是任何应用场景都合适呢(可能就是nosql和关系数据库之争了)?公司产品 这么多,应用场景都不一样,干嘛都用一个自己的私有web框架,而且你说节省成本,省在哪里,一个正式的文档都没有,你说开源的web框架不适合,出了问 题没人管,你把开源社区放到哪去了。而且你觉得自己公司的东西出了问题就一定有人帮你解决吗。成熟点,好不好。写框架的人只有个把个,你找人可以,人家大 牛一定会找个小弟先让他了解大牛他写的东西然后帮他回答问题,你一个人文还好,万一人多了,你觉得他能及时响应你吗。最大问题在于,原作者人家辞职不干 了,怎么办?这个时候你再想想一个开源社区对于一个开源产品为何如此只要,他让用户之间相互帮助,分享经验,你有什么问题去社区里吼两声,肯定会有人愿意 帮助你的,你会惊异于人们施多么愿意帮助他人。

  7. 免费提供图片上传服务

    完全免费,本打算自己写博客用,但不敢独自享受。限制是大小在1M以内,需要google账户,地址:http://minicabinet.appspot.com/,希望你喜欢。

  8. 旅行的意义

    第36个故事里有个问题,是问,如果 让你选择,你愿意拿读书的学费去环游世界还是继续读书? 对于我现在来说是离职旅行还是继续工作,但是这两个问题似乎都很难抉择(没错,我就这是这么纠结的人):如果不读书,就去环游世界,我不知道旅行对我来说 都意味着什么,我会用心发掘我所见到的一切吗?看见海我想到的是什么?凡高为什么喜欢普罗斯旺这个城市?天晓得,我甚至不知道什么是美,什么是旅行的意 义。可是如果没有旅行,或许你会不快乐,因为我们“不快乐的唯一原因是不知道如何安静的呆在他的房间里”,正如我以前所说的,如果我们每个人抛弃固有的看 法、知识。假装不认识这个世界,就好像你以前从未来过这里,每个事物都是新鲜的,也许你会有些特别感受,你感到好奇,你想了解它,你觉得这一切多么有趣, 即便是呆在屋子里也不会感到单调(恩,这就是为什么会有《我的卧室之旅》这篇文章),那么何必去旅行呢。当然这很难办到,原因是我们读的书还不够多,我们 的思想在这个金钱基础的社会里难以的得到提升,我们有的是欲望,我们希望有更多的钱,去更多的城市,去旅行,当然也有人会去读书,具体读的是什么我不清 楚,反正是金融阿营销阿管理阿XX小时掌握XX—— 我想了想,目的倒也单一。 诚实的说,在读完《旅行的艺术》之后, 我反思自己的经历,我通常呆在某个城市往往会向往着另一座城市去旅行,而丝毫感觉不到,现在所在城市有任何魅力。就像现在,我觉得杭州没啥好玩的,想回到 苏州作次旅行(虽然我在苏州读过四年的书),而我在苏州的时候,却又想着会南京旅行(我最终在大学最后一年完成了这个愿望,真相在此), 而我在南京时从未想过旅行。原因是什么?恩,我觉得是这样的,至少对我来说如此:你来到一个陌生的地方,你会觉得有一种身份的转变,你在这里没有家庭、没 有朋友,你会表现出一种肆无忌惮和自由自在,胆大妄为,会有些奇怪的举动,或者说有些特别的想法,你觉得这个城市是在为你准备的,所以我来了,表演开始 吧。 另外,今年列出的A Plan For 2010,有一条要去西藏的,这个计划实施不了了,意外的是,却去了别的计划之外的地方:黄山和厦门,well,不管也算是上了山下了海了。

  9. Coding Alone

    写代码是我的工作,我也乐在其中,你可以想象一下在某个风轻云淡的炎热夏日,我在面对屏幕在宿舍不停的敲打键盘,间歇时便啜口白开水,然后继续… 一个web应用,从数据库设计,业务逻辑代码,很酷的特性,前端页面和样式一手包办,老实说如果让别人帮我作,我都不放心,我担心他写出东西不符合我的期 望,又难以启齿说他写得不好。这样,我发现一直以来都是一个人在写代码,我可以写出一个别人都喜欢用的应用程序,但是却没有人会在看完你写了一段很酷的代 码而大声称好,也没有人乐意指出我的不足,跟你说这块代码写的有问题。我觉得很沮丧,就像你写的书无人问津。而即使现在在公司里也不例外——团队之间的合 作似乎并不体现在共同参与同一个项目,更多的是一种依赖关系。项目里你负责的部分写好了代码,只要它工作正常,在项目计划好的时间内完成,那就成,没有人 在意你写成什么样。我想结对编程可能会是个好主意,但是结对编程绝对是幻想,公司不大可能付出这样的成本,但是我觉得可以尝试,就像Thoughts on two months of pairing说的那样,结对编程真的会解决一些问题,”Get Shit Done”,而且对现在的我来说可以解决我的问题。结对编程的好处是:

    • 两个人之间可以互相督促,把工作完成,提升效率。
    • review对方的代码,减少bug。就像Thoughts on two months of pairing说的那样,有时你写另了一段代码觉得ok,但是经过别人的review就很容易发现问题,然后自己再看时就发现自己写的有多么荒谬。
    • 互相学习和提升。每个人都是在这技术领域唯一的冒险者,有着不同的理解和技巧,大家可以取长补短。

    另外,我并不想把结对编程和敏捷开发联系起来,虽然更多时候,结对编程就是一种敏捷开发的方式,因为我想强调的是结对编码要优于独自编码。 Jeff Atwood的On Working Remotely也 谈到他曾经一个人编码的经历,现在他在家中和他的code partner一起“甜蜜”地工作,在“野外”寻找一个这样的code partner我觉得比找gf还要困难,因为两个人需要在编码水平差不多的情况下,对编程的理解需要一致,有共同的想法和目标,但最重要的是两人需要既是 code partner也是朋友。

  10. A Plan For 2010

    (标题山寨的是Paul Graham的A Plan For Spam) 我想,就像故事开始的那样,在娘胎里兀自孤独了许久后你出生的地方,第一次诚惶诚恐睁开眼 睛,每一物都是初次见面,”hello,world!”——你这样想,回到故事的现在,现在就是现在,此时此刻,你还不知道你的未来如何的现在,尝试想像 你从未见过这世界,计划着重新认识每一个已知的以及素未谋面尚待探索的未知的新事物,抱着贾宝玉初试云雨之情,抱着齐天大圣大闹天宫般严谨朴素之情怀,重 新定义你对阳光绿叶的理解,重新审视周围的人与事,重新理解歪心狼为何历经磨难却无法取得真经,而唐僧师徒却一路玩山游水还拿了特等奖,恩,是该让生命变 得 有意义的时候了!——你这样想,但是即便是行乐须及时,我想即使在活了四分之一世纪的现在,有规律的计划一下当下的生活,也并非是亡羊补牢的勾当——你也 这样想,对吧?当计划不成功时,亡羊补牢犹未晚。

    1. 读书看碟。每周看一部电影,每两个月看一本书,作为产出我需要每月写一 篇文章,按照Michael A. CovingtonHow to Write More Clearly, Think More Clearly, and Learn Complex Material More Easily所说,你不知道你知道直到你写到(You don’t know what you know until you try to express it)。 为什么要看电影,读书? 我们听音乐,用别人的节奏当作自己的节奏; 我们看电影,用别人的经历丰满自己的经历; 我们读书,用别人的思想充斥自己的思 想; 我们看A片,用别人的高潮引发自己的高潮。 看别人挣扎, 看别人梦想。 幻想娱乐生活,空想改变人生。
    2. 既然在我看来学习和生活没什么区别,那么我想把学习的计划也纳入到今年的计划中来,而且首当其冲(成语 可能用的不合适)。 分布式数据存储方案 - NoSQL 关注nosql已经一段时间了,但没有深入研究各个nosql实现的底层代码,我想先还是拿neo4j开刀,原因有以下:1. 他是用java实现的,方便我阅读代码,而且里面的读写实现大多是Java NIO,而我正好在学习NIO,其次正因为他是java实现,所以不妨碍我clojure去实现一个山寨版本。2. neo4j用的是nosql最复杂的一种存储方式,基于图的数据库(graph-based db),而且是唯一的一个实现,山寨它有价值,像MongoDB,CouchDB,Redis, and Tokyo Cabinet这些是基于key-value或者key-collections的。
    3. 去西藏。本打算尼泊尔,但是Shiny后来觉得太 远,所以改去西藏,为什么去西藏?可以有很多理由,比如西藏是天堂之类的话,我想最根本的可能是我天生不喜欢安居乐业。
    4. 山寨 foursquare。Shiny同学要创业,我作为他为数不多的酒肉朋友之一,需要利用工作之余的时间帮助他。
    5. 坚持游泳和跑步 为什么是这两种运动?虽然我很喜欢乒乓和桌球,但是从运动量来看远远不及游泳和跑步,当然,这不是主要原因,最根本地还是因为跑步是免费的,而且没有被 河鞋的可能,任何时间任何地点都可以跑步,再加上最近看了村上春树的《当我谈跑步时我谈些什么》,虽然村上大叔完全是在装B,我还是给了他薄面,看了 108页,然后扔给教授看了(教授也很喜欢跑步,说实话,主要是受了他的影响)。而游泳,我刚学会游泳(冬天学会游泳倒是有点离奇),对这个运动很着迷, 而且在附近的江南体育中心也不是很远,重要的是不用自己买单,当然即使现在要自己付钱的话,我也会去的。

    有些事情是 可以在计划之内的,比如快乐,有些却无法计划,比如死亡,既然如此,趁未被死亡计划的时候,花些时间去计划追求快乐吧。 许多年后,再回到出生的地方,你带着固有的这份孤独,就像是与生俱来,你没的选择,他不是麦当劳可以有A、B、C套餐。