恩,这是个算不上项目的项目
主要是提供免费空间以及免费博客的想法而已,服务器放着也是放着 多帮助别人还是极好的。
以下是简介:
ItPP团队看到了很多求免费空间的朋友,作为过来人,我们很清楚的了解,一个月上百元的服务器费用对很多人来说(尤其是学生),也是一笔不小的开支。
所以我们决定了发起这个项目,用来帮助想要拥有自己的博客或者网站的朋友!
附上链接
个人博客扶持项目
最后,再次:欢迎任何喜欢互联网的朋友加入我们
Try To Rewrite The World.
一些优秀博客的文章,以及博主认为非常不错的原创文章。
恩,这是个算不上项目的项目
主要是提供免费空间以及免费博客的想法而已,服务器放着也是放着 多帮助别人还是极好的。
以下是简介:
ItPP团队看到了很多求免费空间的朋友,作为过来人,我们很清楚的了解,一个月上百元的服务器费用对很多人来说(尤其是学生),也是一笔不小的开支。
所以我们决定了发起这个项目,用来帮助想要拥有自己的博客或者网站的朋友!
附上链接
最后,再次:欢迎任何喜欢互联网的朋友加入我们
由4个刚刚成年的菜鸟程序员(爱好者)组建的 业余 团队 成立了 , 团队主页 ITPP.TOP 。
InTernet Positive People 在互联网行业快乐的挣扎,这是我们最美好的期望。
当然,我们每个人都有自己的学习和工作,处在实习阶段和在社会上努力的初 成年人 , 是我们的组成。
同样,欢迎 16岁以上能独立思考的喜爱互联网的菜鸟加入。当然,如果你是已经在职的IT成功人士,也可以加入,来一起寻找过去和未来,心中的那一种感情……
以上 by:ETby ;
由于前段时间断网,就没碰电脑。然后再我不在的时候,家里人给我刷成Xp系统的了,我用了几天用不下去了,然后就换成了Win8的系统。
用了将近一个月Win8,体验了一下现代化的感觉。嘛,其实根本差不了多少。就是除了有时候和朋友玩两把英雄联盟而已。
这一年发生的事情很多,我也在急速成长。
我一直在问自己:你想要成为一个什么样的人?你要如何赚钱并且生存下去?你怎么看待这个家族?你想如何改变家庭现状?
结果,我发现:在这个世界上,我想要改变一些东西的话。以我现在的能力,还完全不够。
我也在思考,是不是应该放弃计算机?然后像其他人一样,过着普通但还算幸福的生活。 结果,我的意识给了我绝对的答案 —— “No”。
不可以,做不到。我不甘心!
不甘心放弃,在付出代价,得到很多痛苦的回忆之后;
不甘心自己的命运被父母掌控,随心所欲的任凭他们摆布;
不甘心受到的屈辱与嘲笑就此化作烟尘散去;
不甘心过着如此贫穷的生活,不敢买衣服,不敢买贵一点的午饭,不敢买自己喜欢的设备,甚至不敢去找个女朋友、结婚这种事情更是想都不敢想。
所以,我想改变世界。改变我身边的一切,然后在极度的恐惧中——离开这个世界。我怕死,非常怕。所以我需要一条走不到尽头的道路,因为我不想再死之前,感受绝望、感受无聊。无聊亦是最大的绝望,在我的思维模式中。我恐惧它,但又无力去改变,所以无需要一座独木桥。过则生,亦则死。这是我在这游戏中,在这伟大的地球Online中,唯一的一次抵抗。
对不起了,明明是一次正常的状态改变。却因为我这扭曲的思维方式,成为一篇莫名其妙的文章。原谅我,我的小伙伴们;还有Linux,你是我觉得很不错的朋友,是我的信仰之一。请助我一臂之力……
—— by:Etby
当我们说起函数式编程来说,我们会看到如下函数式编程的长相:
上面的那些东西太抽象了,还是让我们来循序渐近地看一些例子吧。
我们先用一个最简单的例子来说明一下什么是函数式编程。
先看一个非函数式的例子:
1
2
3
4
|
int cnt; void increment(){ cnt++; } |
那么,函数式的应该怎么写呢?
1
2
3
|
int increment( int cnt){ return cnt+1; } |
你可能会觉得这个例子太普通了。是的,这个例子就是函数式编程的准则:不依赖于外部的数据,而且也不改变外部数据的值,而是返回一个新的值给你。
我们再来看一个简单例子:
1
2
3
4
5
6
7
8
9
10
|
def inc(x): def incx(y): return x + y return incx inc2 = inc( 2 ) inc5 = inc( 5 ) print inc2( 5 ) # 输出 7 print inc5( 5 ) # 输出 10 |
我们可以看到上面那个例子inc()函数返回了另一个函数incx(),于是我们可以用inc()函数来构造各种版本的inc函数,比如:inc2()和inc5()。这个技术其实就是上面所说的Currying技术。从这个技术上,你可能体会到函数式编程的理念:把函数当成变量来用,关注于描述问题而不是怎么实现,这样可以让代码更易读。
在函数式编程中,我们不应该用循环迭代的方式,我们应该用更为高级的方法,如下所示的Python代码
1
2
3
|
name_len = map ( len , [ "hao" , "chen" , "coolshell" ]) print name_len # 输出 [3, 4, 9] |
你可以看到这样的代码很易读,因为,这样的代码是在描述要干什么,而不是怎么干。
我们再来看一个Python代码的例子:
1
2
3
4
5
6
|
def toUpper(item): return item.upper() upper_name = map (toUpper, [ "hao" , "chen" , "coolshell" ]) print upper_name # 输出 ['HAO', 'CHEN', 'COOLSHELL'] |
顺便说一下,上面的例子个是不是和我们的STL的transform有些像?
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <iostream> #include <algorithm> #include <string> using namespace std; int main() { string s= "hello" ; string out; transform(s.begin(), s.end(), back_inserter(out), :: toupper ); cout << out << endl; // 输出:HELLO } |
在上面Python的那个例子中我们可以看到,我们写义了一个函数toUpper,这个函数没有改变传进来的值,只是把传进来的值做个简单的操作, 然后返回。然后,我们把其用在map函数中,就可以很清楚地描述出我们想要干什么。而不会去理解一个在循环中的怎么实现的代码,最终在读了很多循环的逻辑 后才发现原来是这个或那个意思。 下面,我们看看描述实现方法的过程式编程是怎么玩的(看上去是不是不如函数式的清晰?):
1
2
3
4
|
upname = [ 'HAO' , 'CHEN' , 'COOLSHELL' ] lowname = [] for i in range ( len (upname)): lowname.append( upname[i].lower() ) |
对于map我们别忘了lambda表达式:你可以简单地理解为这是一个inline的匿名函数。下面的lambda表达式相当于:def func(x): return x*x
1
2
3
|
squares = map ( lambda x: x * x, range ( 9 )) print squares # 输出 [0, 1, 4, 9, 16, 25, 36, 49, 64] |
我们再来看看reduce怎么玩?(下面的lambda表达式中有两个参数,也就是说每次从列表中取两个值,计算结果后把这个值再放回去,下面的表达式相当于:((((1+2)+3)+4)+5) )
1
2
|
print reduce ( lambda x, y: x + y, [ 1 , 2 , 3 , 4 , 5 ]) # 输出 15 |
Python中的除了map和reduce外,还有一些别的如filter, find, all, any的函数做辅助(其它函数式的语言也有),可以让你的代码更简洁,更易读。 我们再来看一个比较复杂的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
num = [ 2 , - 5 , 9 , 7 , - 2 , 5 , 3 , 1 , 0 , - 3 , 8 ] positive_num_cnt = 0 positive_num_sum = 0 for i in range ( len (num)): if num[i] > 0 : positive_num_cnt + = 1 positive_num_sum + = num[i] if positive_num_cnt > 0 : average = positive_num_sum / positive_num_cnt print average # 输出 5 |
如果用函数式编程,这个例子可以写成这样:
1
2
|
positive_num = filter ( lambda x: x> 0 , num) average = reduce ( lambda x,y: x + y, positive_num) / len ( positive_num ) |
C++11玩的法:
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <iostream> #include <algorithm> #include <numeric> #include <string> #include <vector> using namespace std; vector num {2, -5, 9, 7, -2, 5, 3, 1, 0, -3, 8}; vector p_num; copy_if(num.begin(), num.end(), back_inserter(p_num), []( int i){ return (i>0);} ); int average = accumulate(p_num.begin(), p_num.end(), 0) / p_num.size(); cout << "averge: " << average << endl; |
我们可以看到,函数式编程有如下好处:
1)代码更简单了。
2)数据集,操作,返回值都放到了一起。
3)你在读代码的时候,没有了循环体,于是就可以少了些临时变量,以及变量倒来倒去逻辑。
4)你的代码变成了在描述你要干什么,而不是怎么去干。
最后,我们来看一下Map/Reduce这样的函数是怎么来实现的(下面是Javascript代码)
1
2
3
4
5
6
7
|
var map = function (mappingFunction, list) { var result = []; forEach(list, function (item) { result.push(mappingFunction(item)); }); return result; }; |
下面是reduce函数的javascript实现(谢谢 @下雨在家 修正的我原来的简单版本)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
function reduce(actionFunction, list, initial){ var accumulate; var temp; if (initial){ accumulate = initial; } else { accumulate = list.shfit(); } temp = list.shift(); while (temp){ accumulate = actionFunction(accumulate,temp); temp = list.shift(); } return accumulate; }; |
前面提到过多次的函数式编程关注的是:describe what to do, rather than how to do it. 于是,我们把以前的过程式的编程范式叫做 Imperative Programming – 指令式编程,而把函数式的这种范式叫做 Declarative Programming – 声明式编程。
下面我们看一下相关的示例(本示例来自这篇文章 )。
比如,我们有3辆车比赛,简单起见,我们分别给这3辆车有70%的概率可以往前走一步,一共有5次机会,我们打出每一次这3辆车的前行状态。
对于Imperative Programming来说,代码如下(Python):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
from random import random time = 5 car_positions = [ 1 , 1 , 1 ] while time: # decrease time time - = 1 print '' for i in range ( len (car_positions)): # move car if random() > 0.3 : car_positions[i] + = 1 # draw car print '-' * car_positions[i] |
我们可以把这个两重循环变成一些函数模块,这样有利于我们更容易地阅读代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
from random import random def move_cars(): for i, _ in enumerate (car_positions): if random() > 0.3 : car_positions[i] + = 1 def draw_car(car_position): print '-' * car_position def run_step_of_race(): global time time - = 1 move_cars() def draw(): print '' for car_position in car_positions: draw_car(car_position) time = 5 car_positions = [ 1 , 1 , 1 ] while time: run_step_of_race() draw() |
上面的代码,我们可以从主循环开始,我们可以很清楚地看到程序的主干,因为我们把程序的逻辑分成了几个函数,这样一来,我们的代码逻辑也会变得几个 小碎片,于是我们读代码时要考虑的上下文就少了很多,阅读代码也会更容易。不像第一个示例,如果没有注释和说明,你还是需要花些时间理解一下。而把代码逻辑封装成了函数后,我们就相当于给每个相对独立的程序逻辑取了个名字,于是代码成了自解释的。
但是,你会发现,封装成函数后,这些函数都会依赖于共享的变量来同步其状态。于是,我们在读代码的过程时,每当我们进入到函数里,一量读到访问了一 个外部的变量,我们马上要去查看这个变量的上下文,然后还要在大脑里推演这个变量的状态, 我们才知道程序的真正逻辑。也就是说,这些函数间必需知道其它函数是怎么修改它们之间的共享变量的,所以,这些函数是有状态的。
我们知道,有状态并不是一件很好的事情,无论是对代码重用,还是对代码的并行来说,都是有副作用的。因此,我们要想个方法把这些状态搞掉,于是出现了我们的 Functional Programming 的编程范式。下面,我们来看看函数式的方式应该怎么写?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
from random import random def move_cars(car_positions): return map ( lambda x: x + 1 if random() > 0.3 else x, car_positions) def output_car(car_position): return '-' * car_position def run_step_of_race(state): return { 'time' : state[ 'time' ] - 1 , 'car_positions' : move_cars(state[ 'car_positions' ])} def draw(state): print '' print 'n' .join( map (output_car, state[ 'car_positions' ])) def race(state): draw(state) if state[ 'time' ]: race(run_step_of_race(state)) race({ 'time' : 5 , 'car_positions' : [ 1 , 1 , 1 ]}) |
上面的代码依然把程序的逻辑分成了函数,不过这些函数都是functional的。因为它们有三个症状:
1)它们之间没有共享的变量。
2)函数间通过参数和返回值来传递数据。
3)在函数里没有临时变量。
我们还可以看到,for循环被递归取代了(见race函数)—— 递归是函数式编程中带用到的技术,正如前面所说的,递归的本质就是描述问题是什么。
pipeline 管道借鉴于Unix Shell的管道操作——把若干个命令串起来,前面命令的输出成为后面命令的输入,如此完成一个流式计算。(注:管道绝对是一个伟大的发明,他的设哲学就 是KISS – 让每个功能就做一件事,并把这件事做到极致,软件或程序的拼装会变得更为简单和直观。这个设计理念影响非常深远,包括今天的Web Service,云计算,以及大数据的流式计算等等)
比如,我们如下的shell命令:
1
|
ps auwwx | awk '{print $2}' | sort -n | xargs echo |
如果我们抽象成函数式的语言,就像下面这样:
1
|
xargs( echo, sort(n, awk( 'print $2' , ps(auwwx))) ) |
也可以类似下面这个样子:
1
|
pids = for_each(result, [ps_auwwx, awk_p2, sort_n, xargs_echo]) |
好了,让我们来看看函数式编程的Pipeline怎么玩?
我们先来看一个如下的程序,这个程序的process()有三个步骤:
1)找出偶数。
2)乘以3
3)转成字符串返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
def process(num): # filter out non-evens if num % 2 ! = 0 : return num = num * 3 num = 'The Number: %s' % num return num nums = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] for num in nums: print process(num) # 输出: # None # The Number: 6 # None # The Number: 12 # None # The Number: 18 # None # The Number: 24 # None # The Number: 30 |
我们可以看到,输出的并不够完美,另外,代码阅读上如果没有注释,你也会比较晕。下面,我们来看看函数式的pipeline(第一种方式)应该怎么写?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
def even_filter(nums): for num in nums: if num % 2 = = 0 : yield num def multiply_by_three(nums): for num in nums: yield num * 3 def convert_to_string(nums): for num in nums: yield 'The Number: %s' % num nums = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] pipeline = convert_to_string(multiply_by_three(even_filter(nums))) for num in pipeline: print num # 输出: # The Number: 6 # The Number: 12 # The Number: 18 # The Number: 24 # The Number: 30 |
我们动用了Python的关键字 yield,这个关键字主要是返回一个Generator,yield 是一个类似 return 的关键字,只是这个函数返回的是个Generator-生成器。所谓生成器的意思是,yield返回的是一个可迭代的对象,并没有真正的执行函数。也就是 说,只有其返回的迭代对象被真正迭代时,yield函数才会正真的运行,运行到yield语句时就会停住,然后等下一次的迭代。(这个是个比较诡异的关键 字)这就是lazy evluation。
好了,根据前面的原则——“使用Map & Reduce,不要使用循环”,那我们用比较纯朴的Map & Reduce吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def even_filter(nums): return filter ( lambda x: x % 2 = = 0 , nums) def multiply_by_three(nums): return map ( lambda x: x * 3 , nums) def convert_to_string(nums): return map ( lambda x: 'The Number: %s' % x, nums) nums = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] pipeline = convert_to_string( multiply_by_three( even_filter(nums) ) ) for num in pipeline: print num |
但是他们的代码需要嵌套使用函数,这个有点不爽,如果我们能像下面这个样子就好了(第二种方式)。
1
2
3
|
pipeline_func(nums, [even_filter, multiply_by_three, convert_to_string]) |
那么,pipeline_func 实现如下:
1
2
3
4
|
def pipeline_func(data, fns): return reduce ( lambda a, x: x(a), fns, data) |
好了,在读过这么多的程序后,你可以回头看一下这篇文章的开头对函数式编程的描述,可能你就更有感觉了。
最后,我希望这篇浅显易懂的文章能让你感受到函数式编程的思想,就像OO编程,泛型编程,过程式编程一样,我们不用太纠结是不是我们的程序就是OO,就是functional的,我们重要的品味其中的味道。
补充:评论中redraiment的这个评论大家也可以读一读。
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途)
程序员这个职业究竟可以干多少年,在中国这片神奇的土地上,很多人都说只能干到30岁,然后就需要转型,就像《程序员技术练级攻略》这篇文章很多人回复到这种玩法会玩死人的一样。我在很多面试中,问到应聘者未来的规划都能听到好些应聘都说程序员是个青春饭。因为,大多数程序员都认为,编程这个事只能干到30岁,最多35岁吧。每每我听到这样的言论,都让我感到相当的无语,大家都希望能像《21天速成C++》那样速成,好多时候超级有想和他们争论的冲动,但后来想想算了,因为你无法帮助那些只想呆在井底思维封闭而且想走捷径速成的人。
今天,我们又来谈这个老话题,因为我看到一篇论文,但是也一定会有很多人都会找出各种理由来论证这篇论文的是错的,无所谓了,我把这篇文章送给那些和我一样准备为技术和编程执着和坚持的人。
首先,我们先来看一篇论文《Is Programming Knowledge Related to Age?》(PDF链接),这篇论文是两个北卡罗莱纳州立大学计算机科学系的两个人Patrick Morrison 和 Emerson Murphy-Hill 对StackOverflow.com上的用户做了相关的数据挖掘得出来的一些数据。(我们知道StackOverflow.com上的数据是公开的,任何人都可以用来分析和统计,所以这篇论文的真实性是有的)
数据采样和清洗条件如下:(数据全量是1694981用户,平均年龄30.3岁)
上述的条件一共过滤出84,248名程序员,平均年龄:29.02岁,平均Reputaion在1073.9分。
下面我们来看一下他们的年龄分布图:我们可以看到程序员年纪的正态分布(高点在25岁左右,但是中点在29岁左右)
然后,计算每个人每个月的Reputation,这样可以找到这个用户的真正的活跃时间,这样便于计算这个程序员的真实能力。(总声望 / 活跃时间),可以得到他平均每个月得来的Reputation。
我们来看看程序员的能力和年龄段的分布图:(你可能会大吃一惊)
上图中我们可以看到,程序员的能力在从25岁左右开始上升,一直到50岁后才会开始下降。所以说,程序员吃的不是青春饭。只有码农,靠蛮力,用体力而不是用脑力的程序员才是吃青春饭的人。
论文的作者分析了Tag,用了最近5年内比较流行的技术Tag,然后用了一套比较严谨的算法来查看那些所谓的“老程序员”是否在新技术上跟上不了,所谓跟不上,也就是这些老的程序员在回答这些新技术上并不活跃。所谓老,就是37岁以上的程序员(就是我现在的年纪)。
得到了下表:可以看到,老程序员和年轻的程序员对于一些新技术的学习来说也是差不多的,甚至有些项还超过了年轻的程序员。
论文的结论是:
1)程序员技术能力上升是可以到50岁或60岁的。
2)老程序员在获取新技术上的能力并不比年轻的程序员差。
最后,我说一说我的一些感受:
(全文完)
Copyright © 2001 by Eric S. Raymond
翻译:Barret
翻译水平有限,欢迎来信指教,我的Email是barret(a)ynmail.com, 但请勿问电脑技术问题(反正也不懂)。
允许未经作者及译者的同意进行非商业目的的转载,但必须保持原文的完整性。
作为 Jargon File 的编辑和 一些其他有名的类似性质文章的作者,我经常收到充满热情的网络新手的email提问(确实如此) “我如何才能成为一名出色的黑客?”非常奇怪的是似乎没有任何的FAQ或者Web形式的文档来说明这个 十分重要的问题,因此我写了一份。
如果你现在读的是这份文档的离线拷贝,那么请注意当前最新版本(英文版)在 http://www.tuxedo.org/~esr/faqs/hacker-howto.html可以得到。
注意:在这份文档最后有 FAQ(常问问题解答)。 请在向我提出任何关于这份文档的疑问之前读两遍。
目前这份文档有很多翻译版本: 保加利亚语, 简体中文, 繁体中文, 丹麦语, 荷兰语, 法语, 德语, 匈牙利语, 印尼语, 日语, 朝鲜语, 葡萄牙语, 俄语及 瑞典语。 注意由于这份文档时有修正,所以以上翻译版本可能有不同程度的过时。
Jargon File 包含了一大堆关于“hacker”这个词的定义,大部分与技术高超和热衷解决问题 及超越极限有关。但如果你只想知道如何 成为 一名黑客, 那么只有两件事情确实相关。
这可以追溯到几十年前第一台分时小型电脑诞生, ARPAnet 实验也刚展开的 年代,那时有一个由程序设计专家和网络名人所组成的, 具有分享特点的文化社群。 这种文化的成员创造了 “hacker” 这个名词。黑客们建立了 Internet。 黑客们发明出了现在使用的 UNIX 操作系统。黑客们使 Usenet 运作起来, 黑客们让 WWW 运转起来。如果你是这个文化的一部分,如果你对这种文化有所贡献,而且 这个社群的其它成员也认识你并称你为 hacker, 那么你就是一位黑客。
黑客精神并不仅仅局限在软件的黑客文化中。 有人用黑客态度对待其它事情,如电子学和音乐—— 事实上,你可以在任何最高级别的科学和艺术活动中发现它。 精于软件的黑客赞赏这些在其他领域的同类并把他们也称作黑客—— 有人宣称黑客天性是绝对独立于他们工作的特定领域的。 但在这份文档中, 我们将注意力集中在软件黑客的技术和态度, 以及发明了“黑客”一词的以共享为特征的文化传统之上。
有一群人大声嚷嚷着自己是黑客,但他们不是。 他们(主要是正值青春的少年)是一些蓄意破坏计算机和电话系统的人。 真正的黑客把这些人叫做“骇客”(cracker),并不屑与之为伍。 多数真正的黑客认为骇客们又懒又不负责任,还没什么大本事。 专门以破坏别人安全为目的的行为并不能使你成为一名黑客, 正如 用铁丝偷开走汽车并不能使你成为一个汽车工程师。 不幸的是,很多记者和作家往往错把“骇客”当成黑客; 这种做法一直使真正的黑客感到恼火。
根本的区别是:黑客搞建设,骇客搞破坏。
如果你想成为一名黑客,请接着读下去。如果你想做一个骇客,去读 alt.2600 新闻组,并在意识到你并不像自己想象的那么聪明后去坐五到十次监狱。 关于骇客,我只想说这么多。
黑客们解决问题,建设事物,同时他们崇尚自由和无私的双向帮助。 要被他人承认是一名黑客,你的行为得体现出你好像具备了这种态度一般。 而要想做得好象你具备这种态度一般,你就得切切实实坚持它。
但是如果你认为培养黑客态度只是一条在黑客文化圈中得到承认的路子, 那就大错特错了。成为具备这些特质的这种人对 你自己非常重要——有助于你学习,及给你提供源源不断的动力。 同所有创造性的艺术一样,成为大师的最有效方法就是模仿大师的精神—— 不仅从智力上,也要从感情上进行模仿。
或许, 下面这首现代的禅诗很好的阐述了这个意思:
To follow the path:(沿着这样一条道路:)
look to the master,(寻找大师,)
follow the master,(跟随大师,)
walk with the master,(与大师通行,)
see through the master,(洞察大师,)
become the master.(成为大师。)
嗯,如果你想成为一名黑客,反复读下面的事情直至你相信它们:
做一名黑客会有很多乐趣,但却是要费很多气力方能得到的乐趣。 这些努力需要动力。成功的运动员从锻炼身体、超越自我极限的愉悦中得到动力。 同样,做黑客,你得能从解决问题,磨练技术及锻炼智力中得到基本的乐趣。
如果你还不是天生的这类人又想做黑客,你就要设法成为这样的人。 否则你会发现,你的黑客热情会被其他分心的事物吞噬掉——如金钱、性和社会上的虚名。
(同样你必须对你自己的学习能力建立信心——相信尽管当你对某问题近乎一无所知, 但只要你一点一点地试验、学习,最终会掌握并解决它。)
聪明的脑袋是宝贵的有限的资源。当世界还充满非常多有待解决的有趣的新问题时, 它们不应该被浪费在重新发明轮子这类事情上。
作为一名黑客,你必须相信其他黑客的思考时间是宝贵的——因此共享信息, 解决问题并发布结果给其他黑客几乎是一种道义,这样其他人就可以去解决 新问题而不是不断地忙于对付旧问题。
(你不必认为一定要把你 所有的发明创造公布出去, 但这样做的黑客是赢得大家极度尊敬的人。卖些钱来养家糊口,租房买计算机 甚至发大财和黑客价值观也是相容的,只要你别忘记你还是个黑客。)
黑客(泛指具有创造力的人们)应该从来不会被愚蠢的重复性劳动所困扰, 因为当这种事情发生时就意味着他们没有在做只有他们才能做的事情—— 解决新问题。这样的浪费伤害每一个人。因此,无聊和乏味的工作不仅仅是 令人不舒服而已,而且是罪恶。
作为一个黑客,你必须坚信这点并尽可能多地将乏味的工作自动化, 不仅为你自己,也为了其他人(尤其是其他黑客们)。
(对此有一个明显的例外。黑客有时也做一些在他人看来是重复性或枯燥的工作 以进行“脑力休息”,或是为了获得某种技能,或是获得一些除此以外无法获得的 特别经验。但这是自愿的——有脑子的人不应该被迫做无聊的活儿。)
黑客们是天生的反独裁主义者。 任何能向你发命令的人能够迫使你停止解决令你着迷的问题, 同时,按照独裁者的一般思路,他通常会给出一些极端愚昧的理由。 因此,不论何处,任何独裁主义的作法,只要它压迫你和其他黑客,你就要和它斗到底。
(这并非向所有权威挑战。儿童需要监护,罪犯要被看管起来。 如果服从命令得到某种东西比起用其他方式得到它更节约时间,黑客可以同意 接受某种形式的权威。但这是一个有限度的,有意的交易; 那种权威想要的个人服从不是你应该同意给予的。)
权威喜欢审查和保密。他们不信任自愿的合作和信息的共享—— 他们只喜欢由他们控制的所谓“合作”。因此,作为一个黑客, 你得对审查、保密,以及使用武力或欺骗去压迫有行为能力的人们的做法有一种本能的敌意。 同时你要有为此信念斗争的意愿。
黑客态度重要,但技术更加重要。 态度无法替代技术,在你被别的黑客称为黑客之前,有一些基本的技术你必须掌握。
这些基本技术随着新技术的出现和老技术的过时也随时间在缓慢改变。 例如,过去内容包括使用机器语言编程,而直到最近才包括了HTML。 总的来说现在主要包括以下技术:
这当然是最基本的黑客技能。如果你还不会任何编程语言,我建议你从Python开始。 它设计清晰,文档齐全,合适初学者入门。 它是一门很好的入门语言,并且不仅仅只是个玩具; 它非常强大、灵活,也适合做大型项目。 我有一篇 Python评价详细说明这点。好的 教程 可以在Python网站得到。 (译者:比较好的中文Python站点可能是http://pythonrecord.51.net。)
Java也是好的入门语言。它比Python难得多,但是生成的代码速度也快得多。 它同时也是一种优秀的计算机语言,不止是用来入门。
但是注意,如果你只会一两门语言,你将不会达到黑客所要求的技术水平, 甚至也不能达到一个程序员的水平——你需要学会如何以抽象的方式思考编程问题, 独立于任何语言。要做一名真正的黑客,你需要学会在几天内通过一些手册, 结合你现在所知,迅速掌握一门新语言。这意味着你应该学会几种截然不同的语言。
如果要做一些重要的编程工作,你将不得不学习C语言,Unix的核心语言。 C++与C非常其他类似;如果你了解其中一种,学习另一种应该不难。 但这两种都不适合编程入门者学习。而且事实上,你越避免用C编程,你的工作效率会越高。
C非常有效率,节约你的机器资源。不幸的是,C的高效是通过你手动做很多底层的管理 (如内存)来达到的。底层代码都是复杂极易出现bug的,会使你花极多的时间调试。 如今的机器速度如此之快,这通常是得不偿失——比较明智的做法是使用一种运行较慢、较低 效率,但大幅节省你的时间的语言。因此,选择Python。
其他对黑客而言比较重要的语言包括 Perl和 LISP。 Perl实用,值得一学;它被广泛用于动态网页和系统管理, 因此即便你从不用Perl写程序,至少也应该学会看。许多人使用Perl的理由和 我建议你使用Python的理由一样,都是为了避免用C完成那些不需要C高效率的工作。 你会需要理解那些工作的代码的。
LISP值得学习的理由不同——最终掌握了它时你会得到丰富的启迪和经验。 这些经验会使你在以后的日子里成为一个更好的程序员,即使你实际上很少使用LISP本身。
当然,实际上你最好五种都会(Python,Java,C/C++,Perl和LISP)。 除了是最重要的黑客语言外,它们还代表了截然不同的编程思路和方法,每种都会让你受益非浅。
这里我无法给你完完全全的指导教会你如何编程——这是个复杂的技能。 但我可以告诉你,书本和上课也不能作到(最好的黑客中,有许多,也许 几乎都是自学成材的)。 你可以从书本上学到语言的特点——只是一些皮毛, 但要使书面知识成为自身技能只能通过实践和虚心向他人学习。 因此要作到 (一)读代码及(二)写代码。
学习如何编程就象学习用优美的自然语言写作一样。 最好的做法是读一些大师的名著,试着自己写点东西,再读些,再写点,再读些,再写点…… 如此往复,直到你的文章达到你体会到的范文的简洁和力量。
过去找到适合阅读的好的代码是困难的,因为几乎没有大型程序的源代码能让新手练手。 这种状况已经戏剧性地发生变化;开放源代码软件,编程工具和操作系统(全都由黑客写成)现在已经 随处可见。让我们在下一个话题中继续讨论……
我假设你已经拥有或者能使用一台个人电脑(今天的孩子们真幸福 🙂 )。新手们能够朝学习黑客技能迈出的最基本的一步就是得到 一份Linux或BSD-Unix的一种,安装在个人电脑上,并运行它。
没错,这世界上除了Unix还有其他操作系统。 但它们都是以二进制形式发布的——你无法读到它的源代码,也不可能修改它。 尝试在运行DOS或Windows或MacOS的机器上学习黑客技术,就象是带着脚镣学跳舞。
除此之外,Unix还是Internet的操作系统。 你可以学会上网却不知道Unix,但你不了解Unix就无法成为一名Internet黑客。 因此,今天的黑客文化在很大程度上是以Unix为中心的。(这点并不总是真的, 一些很早的黑客对此一直很不高兴,但Unix和Internet之间的联系已是如此之强, 甚至连Microsoft也无可奈何。)
所以, 安装一套UNIX——我个人喜爱LINUX但还有其他种类的 (是的,你可以同时安装Linux及DOS/Windows在同一电脑上)。 学习它,使用它,配置它。用它在Internet上冲浪。阅读它的源代码。修改它的源代码。 你会得到比在Microsoft操作系统上更好的编程工具(包括C,LISP,Python及Perl)。 你会觉得乐趣无穷,学到在你成为大师之前意识不到的更多的知识。
想知道更多关于学习Unix的信息,访问 The Loginataka。
想知道如何得到一份Linux,访问 我在哪里可以获得Linux。 (译者:对于中文读者来讲,最简单的方式未过于前往附近的D版/正版光盘店。)
你可以在 www.bsd.org找到BSD Unix的求助及其他资源。
我有写一篇关于 Unix和Internet基础的入门文章。
(注:如果你是一个新手,我不推荐自己独立安装Linux或者BSD。 安装Linux的话,寻求本地Linux用户组的帮助;或联系 Open Projects Network。 LISC维护着一些 IRC频道, 在那里你可以获得帮助。)
黑客文化建造的大多东西都在你看不见的地方发挥着作用,帮助工厂、办公室和大学正常运转, 表面上很难看到它对非黑客的普通人的生活的影响。Web是一个大大的例外。 即便政客也同意,这个巨大耀眼的黑客玩具正在改变整个世界。 单是这个原因(还有许多其它的),你就需要学习掌握Web。
这并不是仅仅意味着如何使用浏览器(谁都会),而是要学会如何写HTML, Web的标记语言。如果你不会编程,写HTML会教你一些有助于学习的思考习惯。 因此,先完成一个主页。(网上有很多好的教程; 这是一个。)
但仅仅拥有一个主页不能使你成为一名黑客。 Web里充满了各种网页。大多数是毫无意义的,零信息量垃圾——界面时髦的垃圾, 注意,垃圾的水准都类似(更多信息访问 The HTML Hell Page)。
要想有价值,你的网页必须有内容—— 它必须有趣或对其它黑客有帮助。这是下一个话题所涉及的……
作为一个美国人和一个以英语为母语的人,我以前很不情愿提到这点,免得成为 一种文化上的帝国主义。但相当多以其他语言为母语的人一直劝我指出这一点,那就是 英语是黑客文化和Internet的工作语言,你需要懂得以便在黑客社区顺利工作。
这一点千真万确。大概1991年的时候我就了解到许多黑客在技术讨论中使用英语,甚至当他们的母语都 相同,英语对他们而言只是第二语言的时候;据我知道的报导,当前英语有着比其他语言丰富得多的技术词汇, 因此是一个对于工作来说相当好的工具。 基于类似的原因,英文技术书籍的翻译通常不令人满意(如果有翻译的话)。
Linus Torvalds,一个芬兰人,用英语注释他的代码(很明显这对他来说不是凑巧)。 他流利的英语成为他能够管理全球范围的Linux开发人员社区的重要因素。 这是一个值得学习的例子。
象大部分不涉及金钱的文化一样,黑客王国靠声誉运转。 你设法解决有趣的问题,但它们到底多有趣,你的解法有多好, 是要由那些和你具有同样技术水平的人或比你更厉害的人去评判的。
相应地,当你在玩黑客游戏时,你得认识到你的分数主要靠其他黑客对你的技术的评价给出 (这就是为什么只有在其它黑客称你为黑客时,你才算得上是一名黑客)。 这个事实常会被黑客是一项孤独的工作这一印象所减弱;也会被另一个黑客文化的禁忌所减弱 (现在逐渐减弱但仍强大):拒绝承认自我或外部评估与一个人的动力有关系。
特别地,黑客王国被人类学家们称为一种奉献文化。 在这里你不是凭借你对别人的统治来建立地位和名望,也不是靠美貌,或拥有其他人想要的东西, 而是靠你的奉献。尤其是奉献你的时间,你的创造和你的技术成果。
要获得其他黑客的尊敬,基本上有五种事情你可以干:
第一个(也是最集中的和传统的)是写些被其他黑客认为有趣或有用的程序, 并把程序源代码提供给整个黑客文化使用。
(过去我们称之为“free software (自由软件)”, 但这却使很多不知 free 的精确含义的人感到困惑。 现在我们很多人,根据搜索引擎网页内容分析至少有2:1的比率,使用“ open-source”software(开放源代码软件)这个词)。
黑客王国里最受尊敬的偶像是那些写了大型的、好用的、具有广泛用途的软件, 并把它们公布出去,使得每人都在使用他软件的人。
黑客也尊敬那些使用、测试开放源代码软件的人。 在这个并非完美的世界上,我们不可避免地要花大多数的开发时间在调试阶段。 这就是为什么任何有头脑的开放源代码的作者都会告诉你好的beta测试员 (知道如何清楚描述出错症状,很好地定位错误,能忍受快速发布中的bug, 并且愿意使用一些简单的诊断工具)象红宝石一样珍贵。 甚至他们中的一个能判断出哪个测试阶段是延长的, 哪个是令人精疲力尽的噩梦,哪个只是一个有益的小麻烦。
如果你是个新手,试着找一个你感兴趣的正在开发的程序,做一个好的beta测试员。 你会自然地从帮着测试,进步到帮着抓臭虫,到最后帮着改程序。 你会从中学到很多,并且与未来会帮你的人结下友谊。
同流行的迷思相反,做一名黑客并不一定要你是个书呆子。 但它确实有帮助,而且许多黑客事实上是书呆子。 做一个深居简出的人有助于你集中精力进行十分重要的事情,如思考和编程。
因此,很多黑客都愿意接受“书呆子”这个外号, 更有甚者使用更尖刻的“geek(怪人)”一词并引以为豪—— 这是一种宣布他们独立于主流社会的声明方式。访问 The Geek Page 参加更多的讨论。
如果你能集中足够的精力做好黑客工作同时还能有正常的生活,这很好。 现在作到这一点比我在1970年代是新手的时候要容易的多; 如今主流文化对技术怪人要友善的多。 甚至有越来越多的人意识到黑客通常是很好的恋人和配偶的材料。
如果你因为生活上不如意而迷上做黑客,那也没什么——至少你不会分神了。 或许以后你会找到自己的另一半。
重申一下,作为一名黑客,你必须进入黑客精神之中。 当你不在计算机边上时,你仍然有很多对黑客工作有帮助的事情可做。 它们并不能替代真正的编程(没有什么能),但很多黑客都那么做, 并感到它们与黑客的本质存在某些基本的连系。
这些事情,你已经做的越多,你就越是天生做黑客的材料。 至于为什么偏偏是这些事情,原因并不完全清楚, 但它们都涉及用到左-右脑能力的综合,这似乎是关键所在 (黑客们既需要清晰的逻辑思维,有时又需要偏离逻辑跳出问题的表象)。
最后,还有一些不要去做的事情。
做以上的事情,只会招来嘲笑。黑客们个个记忆超群—— 你将需要数年的时间让他们忘记你犯下的错误。
网名的问题值得深思。将身份隐藏在虚假的名字后是骇客、解密者、d00dz 及其他低等生物幼稚愚蠢的行为特点。黑客不会做这些事; 他们对他们所作的感到骄傲,而且乐于人们将作品与他们的 真名相联系。 因此, 若你现在用假名,放弃它。在黑客文化里它会令你你失败的。
Peter Seebach 维护着一个非常好的 Hacker FAQ, 专给那些不懂如何与黑客打交道的经理看的。如果Peter的站点不能访问,下面这个 Excite搜索应该有一份拷贝。
我也著有 黑客文化简史。
我写了一份 大教堂与市集,对于Linux及开放源代码文化现象有详细的解释。 我也在这个话题上进一步阐述导致的结局—— 开拓智域。
Rick Moen写了一份很好的关于 如何运转一个Linux用户组的文档。
我和Rick Moen合作完成了另一份关于 提问的智慧的文章,可以让你事半功倍的获得帮助。
如果你想知道PC、UNIX及Internet基本概念和工作原理,参考 The Unix and Internet Fundamentals HOWTO。
当你释放出一个软件或为其打补丁,试着按 软件发行惯例 HOWTO去做。 (以上的提到的文章的中文版大多都可以在www.aka.org.cn和www.linuxforum.net找到。)
答:自从第一次发布这份文档,我每周都会收到一些请求, (频繁的话一天几封)要我“教会他们做黑客”。遗憾的是,我 没有时间和精力来做这个;我自己的黑客项目,及我作为一个开放源代码倡导者 的四处奔波已经占用了我110%的时间。
即便我想教你,黑客也依然基本上是一项自行修炼的的态度和技术。 当真正的黑客想帮助你的时候,如果你乞求他们一汤匙一汤匙“喂”你的话, 你会发现他们不会尊重你。
先去学一些东西。显示你在尝试,你能靠自己去学习。然后再去向你遇到的黑客请教特殊的问题。
如果你发E-mail给一位黑客寻求他的帮助,这是两件首要记住的事情。 第一,写出来的文字显得懒且粗心的人通常非常懒于思考且非常马大哈,不能成为好黑客—— 因此注意拼写正确,使用正确的语法及发音,否则你可能会无人理睬。 第二,不要试图要求回复到一个ISP帐号,而那个帐号与你 的发信地址不同。这样做的人一般是使用盗用帐号,不会有人有兴趣为虎作伥帮助窃贼的。
答:对你而言最佳的入门方式也许是去参加LUG(Linux用户组)的聚会。 你可以找到在 LDP的综合Linux信息页面上找到类似的组织;也许有一个在你家附近的, 而且非常有可能与一所大学或学校挂钩。如果你提出要求,LUG成员兴许会给你一套Linux, 当然此后会帮你安装并带你入门。
答:这取决于你的聪明程度和努力程度。大多数人只要他们专注, 就能在18个月到2年之间学会一套令人尊敬的技能。但是,不要以为就此结束了; 如果你是一个真正的黑客,你要用你的余生来学习和完善你的技术。
答:不,因为他们不是可移植的。他们不是那些语言的开放源代码实现, 所以你被限制在厂商选择支持的那些平台里。接受这样一种垄断局面不是黑客的态度。
Visual Basic特别糟糕。它是Microsoft的私有语言这个事实就足够让它脸面全无, 不像其他的Basic,它是一种设计糟糕的语言会教给你坏的编程习惯。
其中一个坏习惯是会依赖于单一厂商的函数库、控件及开发工具。 一般而言,任何不能够支持至少Linux或者一种BSD,或其他第三方操作系统的语言,都是 一种不适合应付黑客工作的语言。
答:No。任何读完这份FAQ后还问这个问题的人,都是无可救药的蠢材, 即使有时间指教我也不会理睬。任何发给我的此类E-mail都会被忽略或被痛骂一顿。
答:不行。目前为止,每次问我这个问题的,都是一些运行Microsoft Windows的菜鸟。 不可能有效的保护Windows系统免受骇客攻击;太多缺陷的代码和架构使保护Windows的努力有如 隔靴搔痒。唯一可靠的预防来自转移到Linux或其他设计得至少足够安全的系统。
答:最佳办法是在你附近找一个Unix或Linux的用户组,参加他们的聚会。 (你可以在Metalab的LDP站点 找到一些指向用户组的链接。)
我过去曾说过不能在IRC上找到真正的黑客,但我发觉现在情况有所改变。 显然一些真正的黑客的社区像GIMP及Perl,也有IRC频道了。)
答:我维护着一份Linux Reading List HOWTO,也许你会觉得有用。 Loginataka也很有意思。
关于Python的介绍,请访问在Python站点上的 入门资料。
答:不用。黑客道很少使用常规的数学或算术,不过你绝对需要能逻辑性地思考和进行精密的推理。
尤其是你不会用到微积分或电路分析(我们把这些留给电子工程师们 :-))。 一些有限数学(包括布尔代数,集合论,组合数学,图论)的背景知识会有帮助。
答:HTML——如果你还不懂的话。市面上有一大堆的封面精美,宣传得天花乱坠的 糟糕的 HTML书籍,不幸的是很少有好的。我最喜欢的是 HTML: The Definitive Guide。
但 HTML 不完全是一种编程语言。当你准备开始编程时,我推荐从 Python起步。 你会听到一大群人推荐 Perl,并且 Perl 依然比 Python 流行得多,但是 难学得多且(以我之见)设计得不是很好。
C 确实重要,但它要比 Python 或 Perl 难多了。不要尝试先学 C。
Windows用户不要满足于 Visual Basic。 它会教给你坏习惯,而且它不可以移植,只能在Windows下运行。避免它。
答:过去个人电脑能力相当不够并且内存小,结果给黑客的学习过程设置 了人为的障碍。不过一段时间以前开始就不是这样了;任何配置比一台 Intel 486DX50 好的 机器都有足够的能力进行开发工作,X,及 Internet 通讯,同时你现在买的最小的磁盘 都大得富足了。(依Barret之见,现在要至少Pentium 166MMX才够。)
选择用来学习的机器时重要的一点是注意配件是否是Linux兼容的(或BSD兼容,如果你选择学 BSD)。同刚才提到的一样,大多数现在的机器都是符合的;唯一的值得注意的区域在于 modem和打印机;有些具备为Windows设计的配件的机器不会在Linux下工作。
关于硬件兼容性有一个FAQ;最新版本在 这里。
答:不,你不必如此。不是因为Microsoft不令人讨厌,而是因为黑客文化早在 Microsoft出现之前就存在了,且将在Microsoft成为历史后依然存在。 你耗费在憎恨Microsoft的任何力气不如花在爱你的技术上。写好的代码—— 那会相当有效地打击Microsoft又不会让你得到恶报应。
答:看起来不太可能——目前为止,开放源代码软件产业似乎创造了更多的就业机会而不是 减少就业机会。如果写一个程序比起不写来是纯经济收益的话,那么在写完后, 程序员应该得到报酬不管程序是否是开放源代码。 并且,无论写出多么“免费自由”的软件,都存在更多对新的,定制的软件的需求。 我有这方面更多的论述,放在开放源代码 网站资料中。
转自 酷壳 – CoolShell.cn ,作者 陈皓。
月光博客6月12日发表了《写给新手程序员的一封信》,翻译自《An open letter to those who want to start programming》,我的朋友(他在本站的id是Mailper)告诉我,他希望在酷壳上看到一篇更具操作性的文章。因为他也是喜欢编程和技术的家伙,于是,我让他把他的一些学习Python和Web编程的一些点滴总结一下。于是他给我发来了一些他的心得和经历,我在把他的心得做了不多的增改,并根据我的经历增加了“进阶”一节。这是一篇由新手和我这个老家伙根据我们的经历完成的文章。
我的这个朋友把这篇文章取名叫Build Your Programming Technical Skills,我实在不知道用中文怎么翻译,但我在写的过程中,我觉得这很像一个打网游做任务升级的一个过程,所以取名叫“技术练级攻略”,题目有点大,呵呵,这个标题纯粹是为了好玩。这里仅仅是在分享Mailper和我个人的学习经历。(注:省去了我作为一个初学者曾经学习过的一些技术(今天明显过时了),如:Delphi/Power builder,也省去了我学过的一些我觉得没意思的技术Lotus Notes/ActiveX/COM/ADO/ATL/.NET ……)
你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?
建议:
注:你也许会很奇怪为什么下面的东西很偏Unix/Linux,这是因为我觉得Windows下的编程可能会在未来很没有前途,原因如下:
所以,我个人认为以后的趋势是前端是Web+移动,后端是Linux+开源。开发这边基本上没Windows什么事。
1、 学习一门脚本语言,例如Python/Ruby
可以让你摆脱对底层语言的恐惧感,脚本语言可以让你很快开发出能用得上的小程序。实践项目:
为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。
2、 用熟一种程序员的编辑器(不是IDE) 和一些基本工具
使用这些东西不是为了Cool,而是这些编辑器在查看、修改代码/配置文章/日志会更快更有效率。
3、 熟悉Unix/Linux Shell和常见的命令行
对于程序员来说Unix/Linux比Windows简单多了。(参看我四年前CSDN的博文《其实Unix很简单》)学会使用Unix/Linux你会发现图形界面在某些时候实在是太难用了,相当地相当地降低工作效率。
4、 学习Web基础(HTML/CSS/JS) + 服务器端技术 (LAMP)
未来必然是Web的世界,学习WEB基础的最佳网站是W3School。
1、 C语言和操作系统调用
2、学习Java
4、学习关系型数据库
5、一些开发工具
1、C++ / Java 和面向对象
我个人以为学好C++,Java也就是举手之劳。但是C++的学习曲线相当的陡。不过,我觉得C++是最需要学好的语言了。参看两篇趣文“C++学习信心图” 和“21天学好C++”
C++和Java都不是能在短时间内能学好的,C++玩是的深,Java玩的是广,我建议两者选一个。我个人的学习经历是:
2、加强系统了解
重要阅读下面的几本书:
3、系统架构
写了那么多,回顾一下,觉得自己相当的有成就感。希望大家不要吓着,我自己这十来年也在不断地学习,今天我也在学习中,人生本来就是一个不断学习和练级的过程。不过,一定有漏的,也有不对的,还希望大家补充和更正。(我会根据大家的反馈随时更新此文)欢迎大家通过我的微博(@左耳朵耗子)和twitter(@haoel)和我交流。
—– 更新 2011/07/19 —–
1)有朋友奇怪为什么我在这篇文章开头说了web+移动,却没有在后面提到iOS/Android的前端开发。因为我心里有一种感觉,移动设备上的UI最终也会被Javascript取代。大家可以用iPhone或Android看看google+,你就会明白了。
2)有朋友说我这里的东西太多了,不能为了学习而学习,我非常同意。我在文章的前面也说了要思考。另外,千万不要以为我说的这些东西是一些新的技术,这份攻略里95%以上的全是基础。而且都是久经考验的基础技术。即是可以让你一通百通的技术,也是可以让你找到一份不错工作的技术。
3)有朋友说学这些东西学完都40了,还不如想想怎么去挣钱。我想告诉大家,一是我今年还没有40岁,二是学无止境啊,三是我不觉得挣钱有多难,难的是怎么让你值那么多钱?无论是打工还是创业,是什么东西让你自己的价值,让你公司的价值更值钱?别的地方我不敢说,对于互联网或IT公司来说,技术实力绝对是其中之一。
4)有朋友说技术都是工具,不应该如此痴迷这句话没有错,有时候我们需要更多的是抬起头来看看技术以外的事情,或者是说我们在作技术的时候不去思考为什么会有这个技术,为什么不是别的,问题不在于技术,问题在于我们死读书,读死书,成了技术的书呆子。
5) 对于NoSQL,最近比较火,但我对其有点保守,所以,我只是说了解就可以。对于Hadoop,我觉得其在分布式系统上有巨大的潜力,所以需要学习。 对于关系型数据库,的确是很重要的东西,这点是我的疏忽,在原文里补充。