谈技术人员研究方向

为了更清楚的看清自己,拿一个成熟工业领域用设计汽车的例子来类比软件设计与开发。

技术人员的学习与实践有三个层次

第一层次 了解专业知识与原理

作为一名汽车设计师,在正式上岗之前,首先要了解汽车的各种原理。如引擎、燃料、悬挂,制动、碟鼓,ABS,风阻,油耗,安全防撞等知识,设计汽车目标并不仅是制造一个漂亮的外壳或者让轮子转起来。相反它一个有机的整体,一个系统的工程,你必须有综合的了解才能进行下一步。

软件技术也是如此,在入行之前,我们要了解计算机基础知识、操作系统、内存、网络、协议、TCP/IP、数据库/SQL、存储、数据结构、Web,HTML等专业知识。对于每一种知识你要知其然并知其所以然。比如HTML你不能只象一般的IT人员那样简单的知道它是一种描述网页的语言,而是要知其所覆盖范围,其所长和不所长,为什么有了HTML还要用JavaScript/Flash。

这个层次主要主要目标是知其所用。大部分技术人员应该不局限于长久停留在这一阶段。

第二层次 掌握工具、搭造环境

在汽车设计领域就是你的汽车模型建造工具,验证环境,测试工具,分析工具。你要能清晰的知道它们的特性,了解它们的限制及如何去规避。在软件领域,工具主要是指计算机语言,它是你制造原型及最终产品的工具。不同的场景适合不同的工具,合适的工具能帮助你如虎添翼,但语言也并不是多多益善,通常精通2-3种足矣。了解多种不如精通一种。除了工具还要建立自己得心应手的环境,就像比亚迪要建造自己的的汽车试验场一样,有了合适的环境,才能让你能高效的设计,开发,测试及验证。Jon Bentley,世界著名计算机科学家,被誉为影响算法发展的十位大师之一,他在《编程珠玑》中提到贝尔实验室的环境对他成就的巨大帮助

I came to the Labs because I enjoy balancing the theoretical and the applied, because I want to build products and write books. The pendulum has swung back and forth during my years at the Labs, but my management has always encouraged a wide range of activities.

能熟练使用工具只是对开发人员最低的要求,代表你有能力开发软件产品。但是你是满足一辈子都是重复造一种QQ车还是有更高的追求。比如在国内,某些行业几乎和10年前没什么区别,比如在企业管理应用领域,10年前用VB/Delphi做企业应用,大家都在谈人脉和关系在项目中的关键作用。10年后不用Delphi了,改用Java/SSH,其它一切如旧。这样的领域,开发人员和打一辈子铁的铁匠没什么区别,大家都是把活干得更熟了,除此之外,所获寥寥。

第三层次 学会设计
这时应跳出语言之争与语言迷恋,语言的细节了解得再多,也只是一名工匠,大部分优秀的应用只用到语言及框架不到1/3的特性。你应该寻找有价值的领域深入研究, 就如乔布斯所说

你的工作将填满你的一大块人生,唯一获得真正满足的方法就是做你相信是伟大的工作,而唯一做伟大工作的方法是爱你所做的事。如果你还没找到这些事,继续找,别停顿。尽你全心全力,你知道你一定会找到。而且,如同任何伟大的关系,事情只会随着时间愈来愈好。
所以,在你找到之前,继续找,别停顿。

首先应达到在单个专业领域能够游刃有余,比如如何设计一个简单的网站爬虫。注意有兴趣的设计与干活完成任务的重大区别,你设计的每个产品,它不单是个工作任务,而应该把它看作一个艺术品,这样才能保证你能不断的进步。注意不单要完成功能,否则永远无法达到更高境界。

下一步设计相对更全面领域的产品,比如考虑一个游戏服务器的方方面面或可以设计一个类twitter系统。慢慢的,你才会有自己积累的东西。

最后, 什么是开发人员有意义的方向?
从汽车行业来看,主要任务是学习国外先进公司的经验,在关键领域缩小与其差距,软件开发领域看来也是如此。有些领域虽然高深和有趣,但如果行业暂时需求不大,专注这方面研究难免敝帚自珍。研究业界有需求的领域并寻找有应用需求的场合方可达到开放人员价值的最大化。比如在热门的云存储云计算,虚拟化到不太热门的数据挖掘等都存在一定的空白去填补。最好是在有需求有环境的公司内开展。国内科研机构做表面文章的太多,因此感觉不是合适的场地。

只有找到你感兴趣的方向,才会达到王国维说的第二境界,“衣带渐宽终不悔,为伊消得人憔悴”。至于更高境界,自然是水到渠成。

在这个社会里,你只有做出令人尊敬的产品,才能赢得认可。就像Mini设计在汽车行业流芳百世的榜样,在技术行业里,学识,名望,人脉,金钱带来的价值都是可估量的,不可估量的是对行业留下的创新设计,让你无愧于工程师这个称号。

2009/9/3 on blackberry
(第一次写说教类的东西,由于视界及眼光高度有限,难免思路局限,仅供自勉)

广告:广州技术沙龙已经创建Google Group讨论组,主要关注广州及华南地区技术讨论及线下活动组织,欢迎加入

http://groups.google.com/group/guangzhou-tech-party

利用Gearman来实现远程监控与管理

Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,Gearman更偏向于任务分发功能。它的任务分布非常简单,简单得可以只需要用脚本即可完成。Gearman最初用于LiveJournal的图片resize功能,由于图片resize需要消耗大量计算资源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面。

gearman

Gearman分布式任务实现原理上只用到2个字段,function name和data。function name即任务名称,由client传给job server, job server根据function name选择合适的worker节点来执行。data通常为执行任务所需的自定义的内容,比如简单的做法可以把需要执行的脚本当成data即可(当然要注意其中的安全防范)。如果有多个worker可以处理同一个function name, 则job server会自动分配一个。当用于远程监控场景时,我们可以让每个worker注册成不同的业务名称,以达到方便控制每台worker节点的目的。

下面介绍Gearman实践中可用于多服务器管理的一些小功能,如果你的服务器有多台,重复执行命令过于繁琐,那可以借助下面一些脚本来完成一些有趣的功能。比如要实时看到所有服务器上的 netstat -nat | grep 80, 按下面步骤搭好环境之后,只需要几行脚本代码即可实现。

1. 安装gearman
最早的gearman是perl版的,由于国内开发人员对perl熟悉的不多,所以推荐安装C版本
http://gearman.org/index.php?id=download
解开后 ./configure; make; make install 即可

2. 启动 job server
cd sbin; ./gearmand -d

3. 到 worker 节点启动 worker

先按步骤1在worker机上安装 gearman, 然后创建一个执行worker的python脚本。

#!/usr/bin/env python
import os

def main():
    cmd = raw_input()
    print os.popen(cmd).read()

if __name__ == "__main__":
    main()

cd bin; ./gearman -w -h <job_server_ip> -f server1 — ./monitor.py

4. 通过远程 web 管理
JSP示例:

<%@ page language="java" import="java.util.*,java.util.concurrent.*,
org.gearman.client.*,org.gearman.common.*"%><%!
        private static String host = "192.168.1.1";
        private static int port = 4730;
        public String testGearman(String func, String data) {
                byte[] input = data.getBytes();
                String uniqueId = null;

                GearmanJobServerConnection conn =
                    new GearmanNIOJobServerConnection(host, port);
                GearmanClient client = new GearmanClientImpl();
                client.addJobServer(conn);
                GearmanJob job = GearmanJobImpl.createJob(func, input, uniqueId);
                Future<GearmanJobResult> f = client.submit(job);
                GearmanJobResult jr = null;
                String result = null;
                try {
                        jr = f.get(3, TimeUnit.SECONDS);
                        result = new String(jr.getResults());
                } catch (Exception e) {
                        result = e.getMessage();
                }

                client.shutdown();
                return result;
        }
%><%
out.println(testGearman("test", "netstat -nat | grep 80");
%>

PHP示例:

# Create our client object.
$client= new GearmanClient();

# Add default server (localhost).
$client->addServer();

echo "Sending job\n";

# Send reverse job
$result = $client->do("server1", "netstat -nat | grep 80");
if ($result)
  echo "Success: $result\n";

第一期广州技术沙龙活动总结

活动搞完,一般都得总结一下。但人们对自己当事的东西通常很难表达。就像以前学校考试,每次考完被问考得怎样,往往不知道该怎么回答。大部分题目感觉像是做对了,但又不知道是否符合“标准答案”。考试的标准答案是老师定的,那活动或者演讲的“标准答案”呢,则是在每个参与者心中。

现场情况

很多参会的同学都做了精彩的总结,很客观,所以我也没必要进一步补充了。本次计划人数是50人,结果超出了一点,所以会场有点挤。(还有不少同学后到的,实际人数比照片上要多)
第一期广州技术沙龙
不足

根据大家的反馈来看,主要有以下几点

1. 交流机会不足

本次也是依照传统的活动方式,演讲加提问,然后剩下时间小范围自由交流然后散会。由于会议室较小人又偏多,所以技术沙龙变成了技术演讲会。这个也是我们技术沙龙需要继续思考的一个问题,是限制参加人数以便形成多方讨论?还是召集更多的技术人来进行单向技术分享会?(当然不管哪种方式,并不妨碍我们用视频直播,视频及演讲稿分享等方式传达给更多群体)

2. 不够专业及深入

由于我选的Key value store题目过大,所以大部分内容只能蜻蜓点水。最大的价值可能就是给对这些方面感兴趣的同学提供一个参考的学习方向。

演讲稿说明

大家感兴趣的可能是Benchmark那部分,其实那个只是花了几个小时的功夫,因为手头的测试试验环境相对比较全面,所以测试起来也没费什么周折。其实我自己最看重、最希望传达的是演讲稿的后半部分,希望大家在设计自己的网络应用的时候,能够借鉴一些先进的分布式思想,指导自己少走一些弯路。部分观点其实我也没有实践经验,但是根据自己目前手头的一些应用的现状,觉得应用这些思想到系统中可以极大的提高系统的可扩展性及可维护性。Dynamo等Paper像一座桥梁,可以拉近我们与国外分布式设计思想的距离,让我们在这些已经被认可的方法的基础上去发现新的问题,迎接更有意义的挑战。

由于这次要组织活动,所以基本没同来参会的各位向往已久的同学深入交流,这个是最大的遗憾。

下一期的技术沙龙是zhuzhaoyuan的nginx源码剖析方面话题,预计在9月中上旬召开,地点在网易。

附:搜集到一些同学的作业