欢迎来到皮皮网网首页

【活动咨询网源码】【weex源码分析】【angularjs源码解读】hadoop map源码

来源:ziparchive类源码 时间:2024-11-23 23:28:20

1.如何分布式运行mapreduce程序
2.如何使用Python为Hadoop编写一个简单的MapReduce程序
3.如何在MaxCompute上运行HadoopMR作业
4.要成为一名专业的程序员,从零开始需要怎么一步步来比较好,要把最底层的先学精通吗?(个人认为)求学长

hadoop map源码

如何分布式运行mapreduce程序

       ã€€ã€€ä¸€ã€ 首先要知道此前提 转载

       ã€€ã€€è‹¥åœ¨windows的Eclipse工程中直接启动mapreduc程序,需要先把hadoop集群的配置目录下的xml都拷贝到src目录下,让程序自动读取集群的地址后去进行分布式运行(您也可以自己写java代码去设置job的configuration属性)。

       ã€€ã€€è‹¥ä¸æ‹·è´ï¼Œå·¥ç¨‹ä¸­bin目录没有完整的xml配置文件,则windows执行的mapreduce程序全部通过本机的jvm执行,作业名也是带有“local"字眼的作业,如 job_local_。 这不是真正的分布式运行mapreduce程序。

       ã€€ã€€ä¼°è®¡å¾—研究org.apache.hadoop.conf.Configuration的源码,反正xml配置文件会影响执行mapreduce使用的文件系统是本机的windows文件系统还是远程的hdfs系统; 还有影响执行mapreduce的mapper和reducer的是本机的jvm还是集群里面机器的jvm

       ã€€ã€€äºŒã€ 本文的结论

       ã€€ã€€ç¬¬ä¸€ç‚¹å°±æ˜¯ï¼š windows上执行mapreduce,必须打jar包到所有slave节点才能正确分布式运行mapreduce程序。(我有个需求是要windows上触发一个mapreduce分布式运行)

       ã€€ã€€ç¬¬äºŒç‚¹å°±æ˜¯ï¼š Linux上,只需拷贝jar文件到集群master上,执行命令hadoop jarPackage.jar MainClassName即可分布式运行mapreduce程序。

       ã€€ã€€ç¬¬ä¸‰ç‚¹å°±æ˜¯ï¼š 推荐使用附一,实现了自动打jar包并上传,分布式执行的mapreduce程序。

       ã€€ã€€é™„一、 推荐使用此方法:实现了自动打jar包并上传,分布式执行的mapreduce程序:

       ã€€ã€€è¯·å…ˆå‚考博文五篇:

       ã€€ã€€Hadoop作业提交分析(一)~~(五)

       ã€€ã€€å¼•ç”¨åšæ–‡çš„附件中EJob.java到你的工程中,然后main中添加如下方法和代码。

       ã€€ã€€public static File createPack() throws IOException {

       ã€€ã€€File jarFile = EJob.createTempJar("bin");

       ã€€ã€€ClassLoader classLoader = EJob.getClassLoader();

       ã€€ã€€Thread.currentThread().setContextClassLoader(classLoader);

       ã€€ã€€return jarFile;

       ã€€ã€€}

       ã€€ã€€åœ¨ä½œä¸šå¯åŠ¨ä»£ç ä¸­ä½¿ç”¨æ‰“包:

       ã€€ã€€Job job = Job.getInstance(conf, "testAnaAction");

       ã€€ã€€æ·»åŠ ï¼š

       ã€€ã€€String jarPath = createPack().getPath();

       ã€€ã€€job.setJar(jarPath);

       ã€€ã€€å³å¯å®žçŽ°ç›´æŽ¥run as java application 在windows跑分布式的mapreduce程序,不用手工上传jar文件。

       ã€€ã€€é™„二、得出结论的测试过程

       ã€€ã€€ï¼ˆæœªæœ‰ç©ºçœ‹ä¹¦ï¼Œåªèƒ½é€šè¿‡æ„šç¬¨çš„测试方法得出结论了)

       ã€€ã€€ä¸€. 直接通过windows上Eclipse右击main程序的java文件,然后"run as application"或选择hadoop插件"run on hadoop"来触发执行MapReduce程序的测试。

       ã€€ã€€1,如果不打jar包到进集群任意linux机器上,它报错如下:

       ã€€ã€€[work] -- ::, - org.apache.hadoop.mapreduce.Job - [main] INFO org.apache.hadoop.mapreduce.Job - map 0% reduce 0%

       ã€€ã€€[work] -- ::, - org.apache.hadoop.mapreduce.Job - [main] INFO org.apache.hadoop.mapreduce.Job - Task Id : attempt___m__0, Status : FAILED

       ã€€ã€€Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class bookCount.BookCount$BookCountMapper not found

       ã€€ã€€at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:)

       ã€€ã€€at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:)

       ã€€ã€€at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:)

       ã€€ã€€at org.apache.hadoop.mapred.MapTask.run(MapTask.java:)

       ã€€ã€€at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:)

       ã€€ã€€at java.security.AccessController.doPrivileged(Native Method)

       ã€€ã€€at javax.security.auth.Subject.doAs(Subject.java:)

       ã€€ã€€at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:)

       ã€€ã€€at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:)

       ã€€ã€€Caused by: java.lang.ClassNotFoundException: Class bookCount.BookCount$BookCountMapper not found

       ã€€ã€€at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:)

       ã€€ã€€at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:)

       ã€€ã€€... 8 more

       ã€€ã€€# Error:后重复三次

       ã€€ã€€-- ::, - org.apache.hadoop.mapreduce.Job - [main] INFO org.apache.hadoop.mapreduce.Job - map % reduce %

       ã€€ã€€çŽ°è±¡å°±æ˜¯ï¼šæŠ¥é”™ï¼Œæ— è¿›åº¦ï¼Œæ— è¿è¡Œç»“果。

       ã€€ã€€

       ã€€ã€€2,拷贝jar包到“只是”集群master的$HADOOP_HOME/share/hadoop/mapreduce/目录上,直接通过windows的eclipse "run as application"和通过hadoop插件"run on hadoop"来触发执行,它报错同上。

       ã€€ã€€çŽ°è±¡å°±æ˜¯ï¼šæŠ¥é”™ï¼Œæ— è¿›åº¦ï¼Œæ— è¿è¡Œç»“果。

       ã€€ã€€3,拷贝jar包到集群某些slave的$HADOOP_HOME/share/hadoop/mapreduce/目录上,直接通过windows的eclipse "run as application"和通过hadoop插件"run on hadoop"来触发执行

       ã€€ã€€å’ŒæŠ¥é”™ï¼š

       ã€€ã€€Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class bookCount.BookCount$BookCountMapper not found

       ã€€ã€€at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:)

       ã€€ã€€at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:)

       ã€€ã€€å’ŒæŠ¥é”™ï¼š

       ã€€ã€€Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class bookCount.BookCount$BookCountReducer not found

       ã€€ã€€

       ã€€ã€€çŽ°è±¡å°±æ˜¯ï¼šæœ‰æŠ¥é”™ï¼Œä½†ä»ç„¶æœ‰è¿›åº¦ï¼Œæœ‰è¿è¡Œç»“果。

       ã€€ã€€4,拷贝jar包到集群所有slave的$HADOOP_HOME/share/hadoop/mapreduce/目录上,直接通过windows的eclipse "run as application"和通过hadoop插件"run on hadoop"来触发执行:

       ã€€ã€€çŽ°è±¡å°±æ˜¯ï¼šæ— æŠ¥é”™ï¼Œæœ‰è¿›åº¦ï¼Œæœ‰è¿è¡Œç»“果。

       ã€€ã€€ç¬¬ä¸€ç‚¹ç»“论就是: windows上执行mapreduce,必须打jar包到所有slave节点才能正确分布式运行mapreduce程序。

       ã€€ã€€äºŒ 在Linux上的通过以下命令触发MapReduce程序的测试。

       ã€€ã€€hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/bookCount.jar bookCount.BookCount

       ã€€ã€€

       ã€€ã€€1,只拷贝到master,在master上执行。

       ã€€ã€€çŽ°è±¡å°±æ˜¯ï¼šæ— æŠ¥é”™ï¼Œæœ‰è¿›åº¦ï¼Œæœ‰è¿è¡Œç»“果。

       ã€€ã€€2,拷贝随便一个slave节点,在slave上执行。

       ã€€ã€€çŽ°è±¡å°±æ˜¯ï¼šæ— æŠ¥é”™ï¼Œæœ‰è¿›åº¦ï¼Œæœ‰è¿è¡Œç»“果。

       ã€€ã€€ä½†æŸäº›èŠ‚点上运行会报错如下,且运行结果。:

       ã€€ã€€// :: INFO mapreduce.JobSubmitter: Cleaning up the staging area /tmp/hadoop-yarn/staging/hduser/.staging/job__

       ã€€ã€€Exception in thread "main" java.lang.NoSuchFieldError: DEFAULT_MAPREDUCE_APPLICATION_CLASSPATH

       ã€€ã€€at org.apache.hadoop.mapreduce.v2.util.MRApps.setMRFrameworkClasspath(MRApps.java:)

       ã€€ã€€at org.apache.hadoop.mapreduce.v2.util.MRApps.setClasspath(MRApps.java:)

       ã€€ã€€at org.apache.hadoop.mapred.YARNRunner.createApplicationSubmissionContext(YARNRunner.java:)

       ã€€ã€€at org.apache.hadoop.mapred.YARNRunner.submitJob(YARNRunner.java:)

       ã€€ã€€at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:)

       ã€€ã€€at org.apache.hadoop.mapreduce.Job$.run(Job.java:)

       ã€€ã€€at org.apache.hadoop.mapreduce.Job$.run(Job.java:)

       ã€€ã€€at java.security.AccessController.doPrivileged(Native Method)

       ã€€ã€€at javax.security.auth.Subject.doAs(Subject.java:)

       ã€€ã€€at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:)

       ã€€ã€€at org.apache.hadoop.mapreduce.Job.submit(Job.java:)

       ã€€ã€€at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:)

       ã€€ã€€at com.etrans.anaSpeed.AnaActionMr.run(AnaActionMr.java:)

       ã€€ã€€at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:)

       ã€€ã€€at com.etrans.anaSpeed.AnaActionMr.main(AnaActionMr.java:)

       ã€€ã€€at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

       ã€€ã€€at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)

       ã€€ã€€at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)

       ã€€ã€€at java.lang.reflect.Method.invoke(Method.java:)

       ã€€ã€€at org.apache.hadoop.util.RunJar.main(RunJar.java:)

       ã€€ã€€ç¬¬äºŒç‚¹ç»“论就是: Linux上,只需拷贝jar文件到集群master上,执行命令hadoop jarPackage.jar MainClassName即可分布式运行mapreduce程序。

如何使用Python为Hadoop编写一个简单的MapReduce程序

       MichaelG.Noll在他的Blog中提到如何在Hadoop中用Python编写MapReduce程序,韩国的gogamza在其Bolg中也提到如何用C编写MapReduce程序(我稍微修改了一下原程序,因为他的Map对单词切分使用tab键)。我合并他们两人的文章,也让国内的Hadoop用户能够使用别的语言来编写MapReduce程序。  首先您得配好您的Hadoop集群,这方面的介绍网上比较多,这儿给个链接(Hadoop学习笔记二安装部署)。HadoopStreaming帮助我们用非Java的编程语言使用MapReduce,Streaming用STDIN(标准输入)和STDOUT(标准输出)来和我们编写的Map和Reduce进行数据的交换数据。任何能够使用STDIN和STDOUT都可以用来编写MapReduce程序,比如我们用Python的sys.stdin和sys.stdout,或者是C中的stdin和stdout。  我们还是使用Hadoop的例子WordCount来做示范如何编写MapReduce,在WordCount的例子中我们要解决计算在一批文档中每一个单词的出现频率。首先我们在Map程序中会接受到这批文档每一行的数据,然后我们编写的Map程序把这一行按空格切开成一个数组。并对这个数组遍历按"1"用标准的输出输出来,代表这个单词出现了一次。在Reduce中我们来统计单词的出现频率。    PythonCode  Map:mapper.py  #!/usr/bin/envpythonimportsys#mapswordstotheircountsword2count={ }#inputcomesfromSTDIN(standardinput)forlineinsys.stdin:#removeleadingandtrailingwhitespaceline=line.strip()#splitthelineintowordswhileremovinganyemptystringswords=filter(lambdaword:word,line.split())#increasecountersforwordinwords:#writetheresultstoSTDOUT(standardoutput);#whatweoutputherewillbetheinputforthe#Reducestep,i.e.theinputforreducer.py##tab-delimited;thetrivialwordcountis1print'%s\t%s'%(word,1)  Reduce:reducer.py  #!/usr/bin/envpythonfromoperatorimportitemgetterimportsys#mapswordstotheircountsword2count={ }#inputcomesfromSTDINforlineinsys.stdin:#removeleadingandtrailingwhitespaceline=line.strip()#parsetheinputwegotfrommapper.pyword,count=line.split()#convertcount(currentlyastring)tointtry:count=int(count)word2count[word]=word2count.get(word,0)+countexceptValueError:#countwasnotanumber,sosilently#ignore/discardthislinepass#sortthewordslexigraphically;##thisstepisNOTrequired,wejustdoitsothatour#finaloutputwilllookmoreliketheofficialHadoop#wordcountexamplessorted_word2count=sorted(word2count.items(),key=itemgetter(0))#writetheresultstoSTDOUT(standardoutput)forword,countinsorted_word2count:print'%s\t%s'%(word,count)  CCode  Map:Mapper.c  #include#include#include#include#defineBUF_SIZE#defineDELIM"\n"intmain(intargc,char*argv[]){ charbuffer[BUF_SIZE];while(fgets(buffer,BUF_SIZE-1,stdin)){ intlen=strlen(buffer);if(buffer[len-1]=='\n')buffer[len-1]=0;char*querys=index(buffer,'');char*query=NULL;if(querys==NULL)continue;querys+=1;/*nottoinclude'\t'*/query=strtok(buffer,"");while(query){ printf("%s\t1\n",query);query=strtok(NULL,"");}}return0;}h>h>h>h>  Reduce:Reducer.c  #include#include#include#include#defineBUFFER_SIZE#defineDELIM"\t"intmain(intargc,char*argv[]){ charstrLastKey[BUFFER_SIZE];charstrLine[BUFFER_SIZE];intcount=0;*strLastKey='\0';*strLine='\0';while(fgets(strLine,BUFFER_SIZE-1,stdin)){ char*strCurrKey=NULL;char*strCurrNum=NULL;strCurrKey=strtok(strLine,DELIM);strCurrNum=strtok(NULL,DELIM);/*necessarytocheckerrorbut.*/if(strLastKey[0]=='\0'){ strcpy(strLastKey,strCurrKey);}if(strcmp(strCurrKey,strLastKey)){ printf("%s\t%d\n",strLastKey,count);count=atoi(strCurrNum);}else{ count+=atoi(strCurrNum);}strcpy(strLastKey,strCurrKey);}printf("%s\t%d\n",strLastKey,count);/*flushthecount*/return0;}h>h>h>h>  首先我们调试一下源码:  chmod+xmapper.pychmod+xreducer.pyecho"foofooquuxlabsfoobarquux"|./mapper.py|./reducer.pybar1foo3labs1quux2g++Mapper.c-oMapperg++Reducer.c-oReducerchmod+xMapperchmod+xReducerecho"foofooquuxlabsfoobarquux"|./Mapper|./Reducerbar1foo2labs1quux1foo1quux1  你可能看到C的输出和Python的不一样,因为Python是把他放在词典里了.我们在Hadoop时,会对这进行排序,然后相同的单词会连续在标准输出中输出.  在Hadoop中运行程序  首先我们要下载我们的测试文档wget页面中摘下的用php编写的MapReduce程序,供php程序员参考:Map:mapper.php  #!/usr/bin/php$word2count=array();//inputcomesfromSTDIN(standardinput)while(($line=fgets(STDIN))!==false){ //removeleadingandtrailingwhitespaceandlowercase$line=strtolower(trim($line));//splitthelineintowordswhileremovinganyemptystring$words=preg_split('/\W/',$line,0,PREG_SPLIT_NO_EMPTY);//increasecountersforeach($wordsas$word){ $word2count[$word]+=1;}}//writetheresultstoSTDOUT(standardoutput)//whatweoutputherewillbetheinputforthe//Reducestep,i.e.theinputforreducer.pyforeach($word2countas$word=>$count){ //tab-delimitedecho$word,chr(9),$count,PHP_EOL;}?>  Reduce:mapper.php  #!/usr/bin/php$word2count=array();//inputcomesfromSTDINwhile(($line=fgets(STDIN))!==false){ //removeleadingandtrailingwhitespace$line=trim($line);//parsetheinputwegotfrommapper.phplist($word,$count)=explode(chr(9),$line);//convertcount(currentlyastring)toint$count=intval($count);//sumcountsif($count>0)$word2count[$word]+=$count;}//sortthewordslexigraphically////thissetisNOTrequired,wejustdoitsothatour//finaloutputwilllookmoreliketheofficialHadoop//wordcountexamplesksort($word2count);//writetheresultstoSTDOUT(standardoutput)foreach($word2countas$word=>$count){ echo$word,chr(9),$count,PHP_EOL;}?>  作者:马士华发表于:--

如何在MaxCompute上运行HadoopMR作业

       MaxCompute(原ODPS)有一套自己的MapReduce编程模型和接口,简单说来,这套接口的输入输出都是MaxCompute中的Table,处理的数据是以Record为组织形式的,它可以很好地描述Table中的数据处理过程,然而与社区的Hadoop相比,编程接口差异较大。Hadoop用户如果要将原来的Hadoop MR作业迁移到MaxCompute的MR执行,需要重写MR的代码,使用MaxCompute的接口进行编译和调试,运行正常后再打成一个Jar包才能放到MaxCompute的平台来运行。这个过程十分繁琐,需要耗费很多的开发和测试人力。如果能够完全不改或者少量地修改原来的Hadoop MR代码就能在MaxCompute平台上跑起来,将是一个比较理想的方式。

       çŽ°åœ¨MaxCompute平台提供了一个HadoopMR到MaxCompute MR的适配工具,已经在一定程度上实现了Hadoop MR作业的二进制级别的兼容,即用户可以在不改代码的情况下通过指定一些配置,就能将原来在Hadoop上运行的MR jar包拿过来直接跑在MaxCompute上。目前该插件处于测试阶段,暂时还不能支持用户自定义comparator和自定义key类型,下面将以WordCount程序为例,介绍一下这个插件的基本使用方式。

       ä½¿ç”¨è¯¥æ’件在MaxCompute平台跑一个HadoopMR作业的基本步骤如下:

       1. 下载HadoopMR的插件

       ä¸‹è½½æ’件,包名为hadoop2openmr-1.0.jar,注意,这个jar里面已经包含hadoop-2.7.2版本的相关依赖,在作业的jar包中请不要携带hadoop的依赖,避免版本冲突。

       2. 准备好HadoopMR的程序jar包

       ç¼–译导出WordCount的jar包:wordcount_test.jar ,wordcount程序的源码如下:

       package com.aliyun.odps.mapred.example.hadoop;

       import org.apache.hadoop.conf.Configuration;

       import org.apache.hadoop.fs.Path;

       import org.apache.hadoop.io.IntWritable;

       import org.apache.hadoop.io.Text;

       import org.apache.hadoop.mapreduce.Job;

       import org.apache.hadoop.mapreduce.Mapper;

       import org.apache.hadoop.mapreduce.Reducer;

       import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

       import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

       import java.io.IOException;

       import java.util.StringTokenizer;

       public class WordCount {

       public static class TokenizerMapper

       extends Mapper<Object, Text, Text, IntWritable>{

       private final static IntWritable one = new IntWritable(1);

       private Text word = new Text();

       public void map(Object key, Text value, Context context

       ) throws IOException, InterruptedException {

       StringTokenizer itr = new StringTokenizer(value.toString());

       while (itr.hasMoreTokens()) {

       word.set(itr.nextToken());

       context.write(word, one);

       }

       }

       }

       public static class IntSumReducer

       extends Reducer<Text,IntWritable,Text,IntWritable> {

       private IntWritable result = new IntWritable();

       public void reduce(Text key, Iterable<IntWritable> values,

       Context context

       ) throws IOException, InterruptedException {

       int sum = 0;

       for (IntWritable val : values) {

       sum += val.get();

       }

       result.set(sum);

       context.write(key, result);

       }

       }

       public static void main(String[] args) throws Exception {

       Configuration conf = new Configuration();

       Job job = Job.getInstance(conf, "word count");

       job.setJarByClass(WordCount.class);

       job.setMapperClass(TokenizerMapper.class);

       job.setCombinerClass(IntSumReducer.class);

       job.setReducerClass(IntSumReducer.class);

       job.setOutputKeyClass(Text.class);

       job.setOutputValueClass(IntWritable.class);

       FileInputFormat.addInputPath(job, new Path(args[0]));

       FileOutputFormat.setOutputPath(job, new Path(args[1]));

       System.exit(job.waitForCompletion(true) ? 0 : 1);

       }

       }

       3. 测试数据准备

       åˆ›å»ºè¾“入表和输出表

       create table if not exists wc_in(line string);

       create table if not exists wc_out(key string, cnt bigint);

       é€šè¿‡tunnel将数据导入输入表中

       å¾…导入文本文件data.txt的数据内容如下:

       hello maxcompute

       hello mapreduce

       ä¾‹å¦‚可以通过如下命令将data.txt的数据导入wc_in中,

       tunnel upload data.txt wc_in;

       4. 准备好表与hdfs文件路径的映射关系配置

       é…ç½®æ–‡ä»¶å‘½åä¸ºï¼šwordcount-table-res.conf

       {

       "file:/foo": {

       "resolver": {

       "resolver": "c.TextFileResolver",

       "properties": {

       "text.resolver.columns.combine.enable": "true",

       "text.resolver.seperator": "\t"

       }

       },

       "tableInfos": [

       {

       "tblName": "wc_in",

       "partSpec": { },

       "label": "__default__"

       }

       ],

       "matchMode": "exact"

       },

       "file:/bar": {

       "resolver": {

       "resolver": "openmr.resolver.BinaryFileResolver",

       "properties": {

       "binary.resolver.input.key.class" : "org.apache.hadoop.io.Text",

       "binary.resolver.input.value.class" : "org.apache.hadoop.io.LongWritable"

       }

       },

       "tableInfos": [

       {

       "tblName": "wc_out",

       "partSpec": { },

       "label": "__default__"

       }

       ],

       "matchMode": "fuzzy"

       }

       }

要成为一名专业的程序员,从零开始需要怎么一步步来比较好,要把最底层的先学精通吗?(个人认为)求学长

       前言

       你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,活动咨询网源码不如从工作中的需求出发)

       建议:

       不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少年通用。

       回顾一下历史,看看历史上时间线上技术的发展,你才能明白明天会是什么样。

       一定要动手,例子不管多么简单,建议至少自己手敲一遍看看是否理解了里头的细枝末节。

       一定要学会思考,思考为什么要这样,而不是那样。还要举一反三地思考。weex源码分析

       注:你也许会很奇怪为什么下面的东西很偏Unix/Linux,这是因为我觉得Windows下的编程可能会在未来很没有前途,原因如下:

       现在的用户界面几乎被两个东西主宰了,1)Web,2)移动设备iOS或Android。Windows的图形界面不吃香了。

       越来越多的企业在用成本低性能高的Linux和各种开源技术来构架其系统,Windows的成本太高了。

       微软的angularjs源码解读东西变得太快了,很不持久,他们完全是在玩弄程序员。详情参见《Windows编程革命史》

       所以,我个人认为以后的趋势是前端是Web+移动,后端是Linux+开源。开发这边基本上没Windows什么事。

       启蒙入门

       1、 学习一门脚本语言,例如Python/Ruby

       可以让你摆脱对底层语言的libcurl epoll 源码恐惧感,脚本语言可以让你很快开发出能用得上的小程序。实践项目:

       处理文本文件,或者csv (关键词 python csv, python open, python sys) 读一个本地文件,逐行处理(例如 word count,或者处理log)

       遍历本地文件系统 (sys, os, path),例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果

       跟数据库打交道 (python sqlite),写一个小脚本统计数据库里条目数量

       学会用各种print之类简单粗暴的方式进行调试

       学会用Google (phrase, domain, use reader to follow tech blogs)

       为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是wifi电话源码脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。

       2、 用熟一种程序员的编辑器(不是IDE) 和一些基本工具

       Vim / Emacs / Notepad++,学会如何配置代码补全,外观,外部命令等。

       Source Insight (或 ctag)

       使用这些东西不是为了Cool,而是这些编辑器在查看、修改代码/配置文章/日志会更快更有效率。

       3、 熟悉Unix/Linux Shell和常见的命令行

       如果你用windows,至少学会用虚拟机里的linux, vmware player是免费的,装个Ubuntu吧

       一定要少用少用图形界面。

       学会使用man来查看帮助

       文件系统结构和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …

       学会使用一些文本操作命令 sed/awk/grep/tail/less/more …

       学会使用一些管理命令 ps/top/lsof/netstat/kill/tcpdump/iptables/dd…

       了解/etc目录下的各种配置文章,学会查看/var/log下的系统日志,以及/proc下的系统运行信息

       了解正则表达式,使用正则表达式来查找文件。

       对于程序员来说Unix/Linux比Windows简单多了。(参看我四年前CSDN的博文《其实Unix很简单》)学会使用Unix/Linux你会发现图形界面在某些时候实在是太难用了,相当地相当地降低工作效率。

       4、 学习Web基础(HTML/CSS/JS) + 服务器端技术 (LAMP)

       未来必然是Web的世界,学习WEB基础的最佳网站是W3School。

       学习HTML基本语法

       学习CSS如何选中HTML元素并应用一些基本样式(关键词:box model)

       学会用 Firefox + Firebug 或 chrome 查看你觉得很炫的网页结构,并动态修改。

       学习使用Javascript操纵HTML元件。理解DOM和动态网页(Dynamic HTML: The Definitive Reference, 3rd Edition - O'Reilly Media) 网上有免费的章节,足够用了。或参看 DOM 。

       学会用 Firefox + Firebug 或 chrome 调试Javascript代码(设置断点,查看变量,性能,控制台等)

       在一台机器上配置Apache 或 Nginx

       学习PHP,让后台PHP和前台HTML进行数据交互,对服务器相应浏览器请求形成初步认识。实现一个表单提交和反显的功能。

       把PHP连接本地或者远程数据库 MySQL(MySQL 和 SQL现学现用够了)

       跟完一个名校的网络编程课程(例如:(升级版为Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。